1. 为什么ffplay不支持硬件解码
ffplay是FFmpeg自带的播放器。也许你已经知道,ffplay不支持硬件解码 直接到渲染(支持少量硬件解码 + CPU拷贝再到SDL渲染方式,例如cuvid解码,暂且忽略)。
ffplay为什么不做硬件解码的支持,我理解原因有几点:
定位上,ffplay作为简单的测试小工具,并不是要和mpv、VLC这种全功能的播放器去竞争
历史上,ffmpeg和mplayer有千丝万缕的联系,开发人员有大量重叠,有做播放器的兴趣,就去支持mplayer(和mplayer的衍生者)
技术上,支持多种硬件加速解码,需要有多种渲染方式和解码做互操作;M种解码「加」或者「乘」N种渲染,工作量太大,在ffplay里做,违反它的定位
2. 为什么要给ffplay加硬件解码
随着高规格的视频越来越多,4K到8K,HDR 10bit,用ffplay做测试跑不动了。其他播放器做测试,启动慢,用不惯,不开源,使用不方便。
做测试最方便的还是ffplay,所以我希望ffplay能支持硬件解码和渲染。
现在技术上有了一个转机:vulkan!
vulkan跨平台
vulkan可以做渲染
vulkan可以做计算,做图像处理
vulkan可以做视频解码编码
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
获取相关资料和源码
推荐: