當前位置: 妍妍網 > 碼農

為 ffplay 添加硬體解碼和渲染

2024-03-08碼農

1. 為什麽ffplay不支持硬體解碼

ffplay是FFmpeg內建的播放器。也許你已經知道,ffplay不支持硬體解碼 直接到渲染(支持少量硬體解碼 + CPU拷貝再到SDL渲染方式,例如cuvid解碼,暫且忽略)。

ffplay為什麽不做硬體解碼的支持,我理解原因有幾點:

  1. 定位上,ffplay作為簡單的測試小工具,並不是要和mpv、VLC這種全功能的播放器去競爭

  2. 歷史上,ffmpeg和mplayer有千絲萬縷的聯系,開發人員有大量重疊,有做播放器的興趣,就去支持mplayer(和mplayer的衍生者)

  3. 技術上,支持多種硬體加速解碼,需要有多種渲染方式和解碼做互操作;M種解碼「加」或者「乘」N種渲染,工作量太大,在ffplay裏做,違反它的定位

2. 為什麽要給ffplay加硬體解碼

隨著高規格的視訊越來越多,4K到8K,HDR 10bit,用ffplay做測試跑不動了。其他播放器做測試,啟動慢,用不慣,不開源,使用不方便。

做測試最方便的還是ffplay,所以我希望ffplay能支持硬體解碼和渲染。

現在技術上有了一個轉機:vulkan!

  1. vulkan跨平台

  2. vulkan可以做渲染

  3. vulkan可以做計算,做影像處理

  4. vulkan可以做視訊解碼編碼

  5. vulkan可以和CUDA、DRM、VAAPI互操作

簡而言之,用一個vulkan做渲染,可以不走CPU拷貝的方式支持多個硬體解碼,再加上CPU拷貝做fallback,可以支持大多數硬體解碼。

3 . 一兩個月的成果

經過幾個周末的打磨,功能已經基本完成了,在走最後的review流程。平台和硬體解碼支持:

以上是我自測情況,需要說明的如下:

  • cuda/nvdec

  • Windows和Linux下都可用,只要驅動夠新

  • 支持4K HDR10和8K 8bit H.265流暢播放

  • vulkan

  • 解碼要求最新的驅動支持,Windows和Linux下都可用

  • 8K 8bit H.265可以流暢播放

  • H.265 10bit支持還有問題

  • vaapi解碼需要同時開啟libdrm,才能支持vaapi -> vulkan

  • d3d11va解碼需要拷貝到CPU再上傳到vulkan

  • macOS

  • macOS的vulkan是第三方實作的,不是Apple實作的,需要自己安裝SDK

  • videotoolbox需要有一次map到CPU,再 傳到Vulkan

  • 簡單用法,vulkan解碼

    ffplay -hwaccel vulkan foo.mp4

    N vidia nvdec解碼:

    $ ffplay -hwaccel cuda foo.mp4

    開啟vulkan validation layer debug模式

    ffplay -hwaccel cuda -vulkan_params debug=1 foo.mp4

    等merge之後可以到 https://github.com/BtbN/FFmpeg-Builds 下載安裝包體驗,有其他idea歡迎來聊

    -- END --

    進技術交流群, 掃碼添加我的微信:Byte-Flow

    獲取相關資料和源碼

    推薦: