觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。 由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。
目录
一、Windows 硬加速的两条主线
二、各方案速查表
三、DXVA2:老朋友的守门员
四、D3D11VA:2026 年的事实标准
五、NVIDIA:NVDEC + NVENC 一条龙
六、Intel QSV:核显性价比之王
七、AMD:AMF 是正路,DXVA2/D3D11VA 是通用后路
八、选型建议(直接抄)
九、三个最常崩的点
十、总结
做 Windows 视频播放器或转码工具时,最容易被 FFmpeg 的 -hwaccel参数劝退:
dxva2、d3d11va、cuda、qsv、amf一长串,到底谁是解码、谁是编码、谁是新坑、谁能零拷贝?这篇按“博客风格”把地图铺开。
一句话总览:解码看显卡厂商和系统 API,编码看厂商私有编码器;新项目默认 D3D11VA,老兼容留 DXVA2,Intel 用 QSV,NVIDIA 用 CUDA/NVENC,AMD 用 AMF。
一、Windows 硬加速的两条主线
FFmpeg 在 Windows 上其实分两大类:
系统级通用解码 API(不挑厂商)
-
DXVA2(D3D9 时代)
-
D3D11VA(D3D11 时代,当前主力)
-
D3D12VA(Win11 / 新卡 / AV1 前瞻)
厂商私有加速栈(解码+编码一体)
-
NVIDIA:CUDA / NVDEC(解) + NVENC(编)
-
Intel:QSV(libmfx / oneVPL)
-
AMD:AMF(解+编,也可走 DXVA2/D3D11VA 解码)
DXVA2/D3D11VA 主要负责解码,编码能力弱;真要硬编,还是得靠 NVENC / QSV / AMF。
二、各方案速查表
|
dxva2 |
Direct3D 9 + DXVA2 |
✅ H264/HEVC/VP9 |
❌ |
Win7 老机器、Legacy 播放器 |
|
d3d11va |
Direct3D 11 |
✅ H264/HEVC/VP9/AV1(新驱动) |
❌ |
新播放器默认选它 |
|
d3d12va |
Direct3D 12 |
✅ 新格式优先 |
❌ |
游戏引擎/云游戏/极客 |
|
cuda/nvdec |
CUDA Driver |
✅ 全格式强 |
❌(解) |
N 卡转码 |
|
nvenc |
NVENC |
❌ |
✅ H264/HEVC/AV1 |
N 卡转码标配 |
|
qsv |
Intel Media SDK |
✅ |
✅ H264/HEVC/AV1 |
核显软硬通吃 |
|
amf |
AMD AMF |
✅(AMF路径) |
✅ H264/HEVC |
A 卡转码 |
三、DXVA2:老朋友的守门员
DXVA2 基于 D3D9,FFmpeg 里用:
ffmpeg -hwaccel dxva2 -i input.mp4 -f null –
特点:
-
Win7 起步就能用,AMD/Intel/NVIDIA 都暴露
-
解码表面是 IDirect3DSurface9
-
不支持 AV1 老卡,新格式靠驱动
-
编码几乎不管,只能配合软件编码器 libx264
适合:维护老播放器、嵌入式 WebView、Win7 客户机。
四、D3D11VA:2026 年的事实标准
D3D11VA 把解码表面直接变成 D3D11 Texture,和 Qt/SDL/自绘渲染管线零拷贝集成:
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 -i input.mp4 -c:v libx264 out.mp4
如果你自己写渲染:
-
拿 AVFrame->data[0]当 ID3D11Texture2D*
-
用 VideoProcessor做缩放比 StretchRect更干净
-
窗口 resize 不用 Reset,不碰解码器
官方建议:新通用 Windows 应用,默认 D3D11VA。
注意:只解码不转码时,别强行接软件滤镜;要拿 CPU 数据就 hwdownload,format=nv12。
五、NVIDIA:NVDEC + NVENC 一条龙
N 卡玩家最爽,解码 NVDEC、编码 NVENC,全程显存:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda \\
-i in_hevc.mp4 -c:v h264_nvenc -preset p5 out.mp4
要点:
-
-hwaccel cuda实际走 NVDEC
-
-hwaccel_output_format cuda避免 GPU→CPU→GPU 拷贝
-
缩放用 scale_cuda,别用普通 scale
-
多卡用 -hwaccel_device 0
转码场景性能碾压 DXVA2,但播放器里一般不选它——因为 CUDA 上下文比 D3D11 重,且和 Qt 窗口系统集成不如 D3D11VA 自然。
六、Intel QSV:核显性价比之王
Intel 独门 Quick Sync,解码编码都给力:
ffmpeg -hwaccel qsv -c:v hevc_qsv -i in.mp4 -c:v h264_qsv out.mp4
-
依赖 libmfx或新 oneVPL
-
Win 上比 VAAPI 省心,老笔记本核显转码神器
-
缺点:换机器要装 Intel Media SDK 运行时,部署比 DXVA2 麻烦
七、AMD:AMF 是正路,DXVA2/D3D11VA 是通用后路
A 卡解码走系统 API,编码走 AMF:
# D3D11 解码 + AMF 编码
ffmpeg -hwaccel d3d11va -hwaccel_output_format d3d11 \\
-i in.mp4 -c:v hevc_amf out.mp4
或者纯 AMF 管道(零拷贝):
ffmpeg -hwaccel amf -hwaccel_output_format amf \\
-i in.mp4 -c:v hevc_amf out.mp4
AV1 码流别用 DXVA2 老路径,D3D11VA + AMF 更稳。
八、选型建议(直接抄)
-
写新播放器(Qt/Win32):d3d11va解码 + 自绘 SwapChain 渲染
-
兼容 Win7 客户:dxva2解码,渲染逻辑按你前面那套来
-
桌面转码工具:N 卡 cuda+nvenc,Intel qsv,AMD d3d11va+amf
-
浏览器内核/老 IE 控件:只能 DXVA2
-
AV1 新片源 + Win11:优先 d3d11va或 d3d12va
-
命令行快速验证:
ffmpeg -hwaccel auto -i in.mp4 -f null –
九、三个最常崩的点
硬解帧直接送软件滤镜 → 报 Impossible to convert between formats,必须 hwdownload
最小化恢复黑屏 → 不是解码器丢了,是没缓存末帧 AVFrame重画
官方下载版没编译硬加速 → 用 BtbN / GyFFmpeg 构建,或自己 –enable-d3d11va –enable-cuda –enable-nvenc –enable-libmfx
十、总结
Windows 上的 FFmpeg 硬加速,本质是把“微软通用 API + 三家厂商私有栈”缝在一起。
DXVA2 是退休老员工,D3D11VA 是现任主管,NVENC/QSV/AMF 是外援突击队。
播放器别碰编码栈,转码工具别用 DXVA2 当主力,基本就不会走偏。





