FFmpeg硬件加速,如何自动识别所有GPU编码器?

摘要:ffmpeg 硬件加速 GPU编码 视频编解码 NVEnc NVDec Intel QSV AMD AMF VAAPI Vulkan 视频编码 VideoToolbox Media Foundation DXVA2 D3D11VA D3D1
在过去的几年里,本人陆陆续续接触了不少视频处理相关的项目。每当涉及到FFmpeg的硬件加速部分,本人都会陷入一种“信息过载”的状态:文档很多、接口很多、驱动差异巨大,甚至同一台机器在不同系统下的表现都不一样。 如果您也曾经尝试过让FFmpeg调用GPU编码/解码器,大概率会遇到类似的情况: 明明显卡支持 H.265,却始终无法正常编码 NVEnc、QSV、AMF、VAAPI……到底哪个能用? 为什么 1080p 可以,4K 却失败 Windows 和 Linux 的硬件加速接口完全不是一套逻辑 FFmpeg 的“支持列表”并不能代表你的设备真的支持 这些问题看似简单,但真正排查起来非常耗时间啊啊啊。 于是本人干脆写了一个工具,让它自动帮我把所有硬件编码器和解码器都测一遍。 这个工具就是: HwCodecDetect GitHub 地址: https://github.com/whyb/HwCodecDetect FFmpeg 的硬件加速生态:复杂,但真实 如果只用 CPU 编码,FFmpeg 的体验非常统一;但一旦涉及 GPU,情况就完全不同了。 多厂商、多接口、多历史包袱 不同厂商有不同的硬件加速接口: NVIDIA:NVEnc / NVDec Intel:QSV AMD:AMF Apple:VideoToolbox Linux:VAAPI / Vulkan Windows:Media Foundation / DXVA2 / D3D11VA / D3D12VA 这些接口之间没有统一标准,甚至同一厂商在不同系统上的表现也不一致。 “支持”不等于“可用” FFmpeg 文档里写着“支持某某编码器”,但实际情况可能是: 驱动版本不够 显卡架构不支持某个分辨率 系统缺少依赖 FFmpeg 编译参数不完整 某些接口只支持解码,不支持编码 你不测试,根本不知道你的机器到底能不能用。 HwCodecDetect:把所有硬件编码器都跑一遍,结果一目了然 这个工具的核心目标非常直接: 自动检测当前系统上所有可用的硬件编码器/解码器,并测试它们能处理的最大分辨率。 它的工作方式是: 自动生成不同分辨率的测试视频(从 240p 到 8K) 使用 FFmpeg 调用各种硬件编码器 记录成功与失败 输出一份清晰的检测报告 支持的编码器包括: NVEnc / NVDec QSV AMF VAAPI Vulkan Media Foundation DXVA2 / D3D11VA / D3D12VA Apple VideoToolbox 基本覆盖了目前所有主流 GPU 加速接口。 为什么我需要这样一个工具? 本人写这个工具的原因其实很简单: 1. 本人不想再猜显卡到底能不能用 不同显卡、不同驱动、不同系统,组合起来就是一堆未知数。 2. 本人不想再查文档 文档写得再详细,也不如直接跑一遍来得准确。 3. 本人不想再被驱动坑 驱动更新后编码能力变化是常见情况,自动检测能避免踩坑。 4. 本人希望它能成为“视频处理工程师的体检工具” 跑一次,你就知道你的机器到底能干什么。 如何使用(非常简单) 方式一:pip 安装(推荐) pip install hwcodecdetect hwcodecdetect 方式二:下载可执行文件(无需 Python) Releases 页面: https://github.com/whyb/HwCodecDetect/releases 下载对应系统的可执行文件即可运行。 方式三:从源码安装 git clone https://github.com/whyb/HwCodecDetect.git cd HwCodecDetect pip install . hwcodecdetect 检测结果长什么样? 工具会输出一份类似“硬件能力体检报告”的结果,包含: 哪些编码器可用 哪些解码器可用 每个编码器支持的分辨率 哪些接口失败了 哪些格式被显卡硬件支持 对于需要做视频转码、媒体服务器、AI 视频处理、云渲染的开发者来说,这份报告非常有价值。 效果演示: 这个项目适合哪些人? 如果您正在做: 视频转码服务 FFmpeg 自动化脚本 媒体服务器(Jellyfin / Emby / Plex) GPU 加速推理前处理 视频编码性能测试 多平台视频工具开发 那么这个工具能帮你节省大量时间。
阅读全文