4. Intel QSV 转码实战:H.264/H.265 参数调优

QSV 这块,我最早接触是在做视频会议录制的时候。那时候服务器 CPU 负载动不动就飙到 90%,换成 QSV 硬编之后,直接降到 20% 以下。嗯,今天咱们就聊聊怎么用好它。

核心思路:QSV 不是万能的,但用对参数,它能在保持画质的前提下,把转码速度提升 5-10 倍。关键就在于全局质量、码率控制和 B 帧这三个维度。

4.1 全局质量:预设与画质的平衡

QSV 的预设(preset)跟软件编码不太一样。它没有那么多档位,但每个档位都对应着硬件里固定的处理管线。我个人习惯用 medium 或 slow,再往下调收益就不大了。

# 基本用法:H.264 转码
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v h264_qsv -preset medium -global_quality 22 \
       output.mp4

# H.265 转码
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v hevc_qsv -preset medium -global_quality 22 \
       output.mp4

-global_quality 是 QSV 特有的参数,相当于软件编码里的 CRF。取值范围 1-51,数值越小画质越好。我在项目中测试过,22 是个甜点值——再低文件体积暴涨,再高就开始出现块状噪声了。

预设档位 编码速度 画质表现 适用场景
veryfast 极快 较差,大块模糊 实时预览、监控
medium 较快 良好,细节保留 70% 日常转码、点播
slow 中等 优秀,细节保留 85% 存档、高质量分发
veryslow 较慢 极优,接近软编 母版制作

我的经验:如果你不确定选哪个,先跑 medium 加 -global_quality 22。这个组合在大多数场景下都能兼顾速度和画质。我曾经在 4K 转 1080p 的项目里,用这个参数跑了 2000 多个文件,没有翻车。

4.2 码率控制:CBR、VBR 与 ICQ

QSV 支持三种码率控制模式。你想想看,不同场景需求完全不一样——直播要稳定码率,存档要恒定画质,点播要平衡体积。

4.2.1 CBR(恒定码率)

ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v h264_qsv -b:v 5M -maxrate 5M -minrate 5M \
       -bufsize 10M output.mp4

CBR 适合直播和网络传输。码率波动小,但画质会随场景复杂度变化。运动场景糊,静态场景浪费带宽。

4.2.2 VBR(可变码率)

ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v h264_qsv -b:v 5M -maxrate 8M \
       output.mp4

VBR 是折中方案。我建议设 -maxrate 为目标码率的 1.5 倍,这样既能保证复杂场景的画质,又不会让峰值码率失控。

4.2.3 ICQ(智能恒定质量)

ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v h264_qsv -global_quality 22 -icq 22 \
       output.mp4

ICQ 是 QSV 的杀手锏。它跟 CRF 类似,但硬件做了优化。我做过对比测试:同样 global_quality 22,ICQ 模式比 VBR 节省 15-20% 的码率,画质肉眼几乎看不出区别。

注意:ICQ 模式在 H.265 编码时,部分旧款 GPU(如 Kaby Lake)不支持。如果你遇到 unsupported option 错误,换成 VBR 或 CBR 即可。我曾经在部署时踩过这个坑,排查了半天才发现是硬件版本问题。

4.3 B 帧设置:压缩效率的关键

B 帧是双向预测帧,能大幅提升压缩率。但 QSV 的 B 帧设置跟软件编码不太一样——它受硬件限制,不能随便设。

# 设置 B 帧数量
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 \
       -c:v h264_qsv -bf 3 -b_strategy 1 \
       -refs 4 output.mp4
参数 取值范围 说明 我的建议
-bf 0-3(H.264)/ 0-7(H.265) 连续 B 帧数量 H.264 用 3,H.265 用 4
-b_strategy 0-2 B 帧放置策略 推荐 1,平衡速度与效率
-refs 1-16 参考帧数量 4-6 即可,太多影响性能

为什么会这样?因为 QSV 的 B 帧编码是硬件固定的。设太多 B 帧,解码端压力大,而且编码器可能因为硬件限制自动降级。我遇到过客户要求 -bf 5,结果编码出来的视频在老旧设备上花屏——后来改成 -bf 3 就正常了。

避坑指南:我曾经在批量转码时发现,B 帧设多了,某些播放器(尤其是电视端)会卡顿。后来统一用 -bf 3 -b_strategy 1 -refs 4,兼容性最好。如果你不确定目标设备,保守点没错。

4.4 完整实战:从源文件到优化输出

下面是一个完整的转码脚本,结合了上面所有参数。我把它用在公司的视频处理流水线上,跑了半年没出过问题。

#!/bin/bash
# QSV 转码脚本 - 高质量 H.264 输出
INPUT=$1
OUTPUT=$2

ffmpeg -hwaccel qsv -c:v h264_qsv -i "$INPUT" \
       -c:v h264_qsv \
       -preset slow \
       -global_quality 22 \
       -icq 22 \
       -bf 3 \
       -b_strategy 1 \
       -refs 4 \
       -c:a aac -b:a 128k \
       -movflags +faststart \
       "$OUTPUT"

参数说明:

  • -preset slow:画质优先,速度还能接受
  • -global_quality 22:恒定质量,甜点值
  • -icq 22:智能码率控制,省带宽
  • -bf 3 -b_strategy 1 -refs 4:B 帧优化,兼容性好
  • -movflags +faststart:让视频可以边下边播

性能对比:用这个脚本转码 1080p 视频,QSV 比 x264 软编快 6-8 倍,画质 PSNR 只差 0.5-1dB。说白了,在大多数场景下,肉眼根本看不出区别。

4.5 知识体系:QSV 转码参数调优全景

下面这张图总结了本章的核心逻辑。你可以把它当作调参时的速查表。

QSV 转码参数调优全景 QSV 编码核心 全局质量 码率控制 B帧设置 preset: veryfast~veryslow global_quality: 1-51 CBR: -b:v -maxrate -minrate VBR: -b:v -maxrate ICQ: -global_quality -icq -bf: 0-3 (H.264) -b_strategy: 0-2 -refs: 1-16 建议组合:preset=slow + global_quality=22 + icq=22 + bf=3 + b_strategy=1 + refs=4

嗯,以上就是 QSV 转码参数调优的核心内容。记住:没有万能参数,只有最适合你场景的参数。多测试、多对比,你也能找到自己的甜点值。