先看看当前 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 视频编码器码率控制方法按如下方式选择:

  1. 当指定了 global_quality(全局质量)时,将使用基于质量的模式。具体来说:

    • 同时设置 global_qualityqscale(量化参数)编解码器标志,使用 CQP(恒定量化参数)模式。
    • 同时设置 global_qualitylook_ahead(预分析)选项时,使用 LA_ICQ(带预分析的智能恒定质量)模式。
    • 否则,使用 ICQ(智能恒定质量)模式。对于 ICQ 模式,global_quality 的范围是 1 到 51,1 表示质量最佳。
  2. 未使用 global_quality,而是用 -b 选项指定了所需的平均码率时,将使用基于码率的模式:

    • 当指定了 look_ahead 选项时,使用 LA(带预分析的可变比特率)模式。
    • 当设置了 vcm 选项时,使用 VCM(视频会议模式)。
    • 当指定了 maxrate(最大码率)且其值等于平均码率时,使用 CBR(恒定比特率)模式。
    • 当指定了 maxrate,且其值高于平均码率时,使用 VBR(可变比特率)模式。
    • 当未指定 maxrate,且 avbr_accuracy(平均可变比特率精度)和 avbr_convergence(平均可变比特率收敛性)都设置为非零值时,使用 AVBR(平均可变比特率)模式。此模式在 Windows 系统上的 H264 和 HEVC 编码中可用。
  3. 否则,将使用默认的码率控制方法 CQP。

请注意,根据您的系统情况,编码器可能会选择与您指定的不同的模式。将日志详细程度设置为 -v verbose,以查看 QSV 运行时实际使用的设置。

参数测试

参数数字的意义转码速度文件大小压缩率VMAF具体说明
copy 1548225180 直接复制视频流,不转码
adaptive_i 1 6234105318.23%93.044714启用自适应 I 帧,允许编码器根据内容动态调整 I 帧位置,优化随机访问性能和恢复解码错误,但占用更多码率
adaptive_b 1 6094105318.23%93.044714启用自适应 B 帧,动态调整 B 帧的数量和位置,B 帧(双向预测帧)通过参考前后帧进行压缩,通常能显著减少码率,但需要更多计算资源
b_strategy 0p-frames6233856217.12%91.358429固定使用简单的 I/P 帧选择策略,不使用 B 帧
b_strategy 1b-frames6204105318.23%93.044714启用更复杂的决策逻辑,优先使用 B 帧(可提升压缩率,但增加计算量)
ext_brc 1 -look_ahead_depth 99 6184105318.23%93.044714启用帧级前瞻深度,编码器提前预览前面的画面以提升编码效率。实际无法启用。
forced_idr1 6254105318.23%93.044714强制将所有的 I 帧标记为 IDR 帧 ,增强随机访问性能
low_power 1 6264105318.23%93.044714转码设备低功耗
mbbrc 1 6183814716.94%92.155354启用或禁用 宏块级别的比特率控制,通过动态调整每个宏块的码率分配,优化视频质量和码率效率
p_strategy 1simple6244105318.23%93.044714采用简化的 P 帧预测结构,可能降低计算复杂度,但压缩效率可能稍差
p_strategy 2 -bf 0pyramid6253608516.02%90.898258启用 P 帧的金字塔预测结构(需配合 bf=0,即关闭 B 帧),通过更复杂的参考帧管理提升预测精度,从而提升压缩率
default6124105318.23%93.044714使用参数的默认值
preset 1veryslow1873624816.10%92.805939预设:很慢
preset 2slower3334009717.81%93.050461预设:比较慢
preset 3slow5984105318.23%93.044714预设:慢
preset 4medium6084105318.23%93.044714预设:一般
preset 5fast6054105318.23%93.044714预设:快
preset 6faster8214213618.71%92.8955预设:比较快
preset 7veryfast10524326219.21%92.024228预设:很快
rdo 1 6264105318.23%93.044714权衡视频质量(失真)与码率(数据量)来提升编码效率
scenario 1displayremoting5954105318.23%93.044714场景:远程显示
scenario 2vdeoconference6034105318.23%93.044714场景:视频通话
scenario 3archive6224105318.23%93.044714场景:存档
scenario 4livestreaming6194105318.23%93.044714场景:直播
scenario 5cameracapture6124105318.23%93.044714场景:相机捕获
scenario 6videosurveillance6094105318.23%93.044714场景:视频监控
scenario 7gamestreaming6074098718.20%93.120241场景:游戏串流
scenario 8remotegaming6364095318.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,最大码率 8kbps
ffmpeg -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。
ffmpeg-transcode-speed.avif
taskmgr.avif

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"

参考链接

  1. FFmpeg Codecs Documentation
  2. FFmpeg Hardware/QuickSync
  3. FFmpeg Codecs Ratecontrol Method
  4. FFmepg Hardware Acceleration
文章目录