当前位置: 欣欣网 > 码农

为 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

    获取相关资料和源码

    推荐: