FFmpeg 用 Intel B580 硬件解码编码
先看看当前 ffmpeg 支持那些编解码器。
FFmpeg 基础用法
查看支持的编解码器,打开 powershell 运行以下命令ffmpeg -codecs | Select-String -Pattern "h264|hevc|av1"。
DEV.L. av1 Alliance for Open Media AV1 (decoders: libdav1d libaom-av1 av1 av1_cuvid av1_qsv av1_amf) (encoders: libaom-av1 librav1e libsvtav1 av1_nvenc av1_qsv av1_amf av1_mf av1_vaapi)
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_qsv h264_amf h264_cuvid) (encoders: libx264 libx264rgb h264_amf h264_mf h264_nvenc h264_qsv h264_vaapi h264_vulkan)
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_amf hevc_cuvid) (encoders: libx265 hevc_amf hevc_d3d12va hevc_mf hevc_nvenc hevc_qsv hevc_vaapi hevc_vulkan)每种视频格式都包含了多种编解码器。比如 av1 视频格式包含这些编码器 libaom-av1 librav1e libsvtav1 av1_nvenc av1_qsv av1_amf av1_mf av1_vaapi,其中前三种是CPU用的,带nvenc后缀是Nvdia显卡的,带qsv是Intel显卡的,带amf是AMD显卡的。
查看 av1_qsv 编码器支持的参数ffmpeg -h encoder=av1_qsv
查看 hevc_qsv 编码器支持的参数ffmpeg -h encoder=hevc_qsv
查看 Intel 显卡有哪些滤镜ffmpeg -filters | Select-String -Pattern "qsv"。
查看 scale_qsv 滤镜有哪些参数ffmpeg -h filter=scale_qsv
查看 vpp_qsv 滤镜有哪些参数ffmpeg -h filter=vpp_qsv
质量控制
根据官方文档(https://ffmpeg.org/ffmpeg-codecs.html#Ratecontrol-Method),Intel QSV 视频编码器码率控制方法按如下方式选择:
当指定了
global_quality(全局质量)时,将使用基于质量的模式。具体来说:- 同时设置
global_quality和qscale(量化参数)编解码器标志,使用 CQP(恒定量化参数)模式。 - 同时设置
global_quality和look_ahead(预分析)选项时,使用 LA_ICQ(带预分析的智能恒定质量)模式。 - 否则,使用 ICQ(智能恒定质量)模式。对于 ICQ 模式,
global_quality的范围是 1 到 51,1 表示质量最佳。
- 同时设置
未使用
global_quality,而是用-b选项指定了所需的平均码率时,将使用基于码率的模式:- 当指定了
look_ahead选项时,使用 LA(带预分析的可变比特率)模式。 - 当设置了
vcm选项时,使用 VCM(视频会议模式)。 - 当指定了
maxrate(最大码率)且其值等于平均码率时,使用 CBR(恒定比特率)模式。 - 当指定了
maxrate,且其值高于平均码率时,使用 VBR(可变比特率)模式。 - 当未指定
maxrate,且avbr_accuracy(平均可变比特率精度)和avbr_convergence(平均可变比特率收敛性)都设置为非零值时,使用 AVBR(平均可变比特率)模式。此模式在 Windows 系统上的 H264 和 HEVC 编码中可用。
- 当指定了
- 否则,将使用默认的码率控制方法 CQP。
请注意,根据您的系统情况,编码器可能会选择与您指定的不同的模式。将日志详细程度设置为 -v verbose,以查看 QSV 运行时实际使用的设置。
参数测试
| 参数 | 数字的意义 | 转码速度 | 文件大小 | 压缩率 | VMAF | 具体说明 |
|---|---|---|---|---|---|---|
| copy | 1548 | 225180 | 直接复制视频流,不转码 | |||
| adaptive_i 1 | 623 | 41053 | 18.23% | 93.044714 | 启用自适应 I 帧,允许编码器根据内容动态调整 I 帧位置,优化随机访问性能和恢复解码错误,但占用更多码率 | |
| adaptive_b 1 | 609 | 41053 | 18.23% | 93.044714 | 启用自适应 B 帧,动态调整 B 帧的数量和位置,B 帧(双向预测帧)通过参考前后帧进行压缩,通常能显著减少码率,但需要更多计算资源 | |
| b_strategy 0 | p-frames | 623 | 38562 | 17.12% | 91.358429 | 固定使用简单的 I/P 帧选择策略,不使用 B 帧 |
| b_strategy 1 | b-frames | 620 | 41053 | 18.23% | 93.044714 | 启用更复杂的决策逻辑,优先使用 B 帧(可提升压缩率,但增加计算量) |
| ext_brc 1 -look_ahead_depth 99 | 618 | 41053 | 18.23% | 93.044714 | 启用帧级前瞻深度,编码器提前预览前面的画面以提升编码效率。实际无法启用。 | |
| forced_idr1 | 625 | 41053 | 18.23% | 93.044714 | 强制将所有的 I 帧标记为 IDR 帧 ,增强随机访问性能 | |
| low_power 1 | 626 | 41053 | 18.23% | 93.044714 | 转码设备低功耗 | |
| mbbrc 1 | 618 | 38147 | 16.94% | 92.155354 | 启用或禁用 宏块级别的比特率控制,通过动态调整每个宏块的码率分配,优化视频质量和码率效率 | |
| p_strategy 1 | simple | 624 | 41053 | 18.23% | 93.044714 | 采用简化的 P 帧预测结构,可能降低计算复杂度,但压缩效率可能稍差 |
| p_strategy 2 -bf 0 | pyramid | 625 | 36085 | 16.02% | 90.898258 | 启用 P 帧的金字塔预测结构(需配合 bf=0,即关闭 B 帧),通过更复杂的参考帧管理提升预测精度,从而提升压缩率 |
| default | 612 | 41053 | 18.23% | 93.044714 | 使用参数的默认值 | |
| preset 1 | veryslow | 187 | 36248 | 16.10% | 92.805939 | 预设:很慢 |
| preset 2 | slower | 333 | 40097 | 17.81% | 93.050461 | 预设:比较慢 |
| preset 3 | slow | 598 | 41053 | 18.23% | 93.044714 | 预设:慢 |
| preset 4 | medium | 608 | 41053 | 18.23% | 93.044714 | 预设:一般 |
| preset 5 | fast | 605 | 41053 | 18.23% | 93.044714 | 预设:快 |
| preset 6 | faster | 821 | 42136 | 18.71% | 92.8955 | 预设:比较快 |
| preset 7 | veryfast | 1052 | 43262 | 19.21% | 92.024228 | 预设:很快 |
| rdo 1 | 626 | 41053 | 18.23% | 93.044714 | 权衡视频质量(失真)与码率(数据量)来提升编码效率 | |
| scenario 1 | displayremoting | 595 | 41053 | 18.23% | 93.044714 | 场景:远程显示 |
| scenario 2 | vdeoconference | 603 | 41053 | 18.23% | 93.044714 | 场景:视频通话 |
| scenario 3 | archive | 622 | 41053 | 18.23% | 93.044714 | 场景:存档 |
| scenario 4 | livestreaming | 619 | 41053 | 18.23% | 93.044714 | 场景:直播 |
| scenario 5 | cameracapture | 612 | 41053 | 18.23% | 93.044714 | 场景:相机捕获 |
| scenario 6 | videosurveillance | 609 | 41053 | 18.23% | 93.044714 | 场景:视频监控 |
| scenario 7 | gamestreaming | 607 | 40987 | 18.20% | 93.120241 | 场景:游戏串流 |
| scenario 8 | remotegaming | 636 | 40953 | 18.19% | 93.120241 | 场景:远程游戏 |
感觉很多参数都没有效果。
一些例子
Intel
使用硬件解码,硬件编码为 hevc,保持源文件画面大小,使用ICQ(智能恒定质量)模式控制视频码率,质量参数 22,日志级别设置为 verbose 详细。ffmpeg -v verbose -hwaccel qsv -hwaccel_output_format qsv -i "转换前.mp4" -c:v hevc_qsv -global_quality 22 "转换后.mp4"
使用硬件解码,硬件编码为 hevc,从00:01:00开始,截取 00:00:30 也就是30秒长的视频,转换为1920宽,高度根据比例变化,使用ICQ(智能恒定质量)模式控制视频码率,质量参数22,使用medium中等速度预设。ffmpeg -ss 00:01:00 -hwaccel qsv -hwaccel_output_format qsv -i "转换前.mp4" -t 00:00:30 -c:v hevc_qsv -vf "scale_qsv=w=1920:h=-1" -preset medium -global_quality 22 "转换后.mp4"
使用硬件解码, 硬件编码为 hevc,使用 VBR(可变比特率)模式来控制码率,平均码率 4kbps,最大码率 8kbpsffmpeg -hwaccel qsv -hwaccel_output_format qsv -i "转换前.mp4" -c:v hevc_qsv -b:v 4000k -maxrate 8000k "转换后.mp4"
使用硬件解码, 硬件编码为 av1,ffmpeg -hwaccel qsv -hwaccel_output_format qsv -i "转换前.mp4" -c:v av1_qsv -b:v 4000k -maxrate 8000k "转换后.mp4"
Nvdia
自动选择硬件解码器。用Nvdia显卡转为 H265, 分辨率不变,音频转换为 AAC 128Kbps,质量参数 31 。ffmpeg -y -hwaccel auto -hwaccel_output_format auto -i "转换前.mp4" -c:v hevc_nvenc -c:a aac -b:a 128k -cq 31 "转换后.mp4"
H264 转 H264 720P,编码和解码都用 Nvdia 独立显卡。音频编码 AAC 128Kbps, 质量参数 35。高度限制为720P。ffmpeg -c:v h264_cuvid -i "转换前.mp4" -c:v h264_nvenc -filter:v scale=-1:720 -c:a aac -b:a 128k -cq 35 "转换前.mp4"
H264 转 H265,分辨率不变,编码和解码都用 Nvdia 独立显卡,音频编码 AAC 128Kbps,质量参数 31。ffmpeg -c:v h264_cuvid -i "源文件.mp4" -c:v hevc_nvenc -c:a aac -b:a 128k -cq 31 "转码后.mp4"
可以看到 CPU 没怎么用,GPU 占满了。GTX 1650S 转码 1080P 的速度大约 380 fps。

AMD
根据官方文档,FFmpeg 可以通过 DirectX 9 和 11 来调用 AMD显卡。ffmpeg -v verbose -y -hwaccel d3d11va -ss 00:20:00 -t 00:01:00 -i "input.mp4" -c:v h264_amf -vf "scale=1280:720" -rc 2 -b:v 1M -maxrate 3M -bufsize 4M -c:a aac -b:a 128k "output.mp4"
参考链接
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
FLY2X