3、码率控制模式实战:CBR、VBR 与 CRF
码率控制,说白了就是决定「每一帧画面分多少比特」。选错了模式,要么文件大得离谱,要么画质糊成一团。我这些年调过的编码器没有一百也有八十,踩坑最多的就是这三个模式。今天咱们一个一个掰开揉碎讲清楚。
3.1 CBR(恒定码率)—— 直播和窄带场景的硬约束
CBR 要求输出码率始终围绕目标值波动,波动范围通常控制在 ±5% 以内。为什么要有这么死的规定?你想想看,直播流如果码率忽高忽低,CDN 边缘节点会直接丢包,观众那边就是卡顿、花屏。
适用场景:
- RTMP / HLS 直播推流(带宽固定)
- 视频会议(需要低延迟、可预测的码率)
- 广电级播出(TS 流复用需要恒定码率)
- 窄带 IoT 设备(如 4G 猫、无人机图传)
FFmpeg 配置示例:
# H.264 CBR 直播推流
ffmpeg -i input.mp4 \
-c:v libx264 \
-b:v 2000k \
-minrate 2000k \
-maxrate 2000k \
-bufsize 4000k \
-nal-hrd cbr \
-x264-params "vbv-maxrate=2000:vbv-bufsize=4000" \
-f flv rtmp://example.com/live/stream
注意 -nal-hrd cbr 这个参数,它告诉编码器严格按照 HRD(假想参考解码器)模型填充数据。不加这个,很多编码器会偷偷「偷懒」,导致实际码率偏低。
-bufsize 设得太小,编码器来不及平滑。记住:bufsize 一般是目标码率的 2 倍,运动剧烈的场景可以放大到 4 倍。
CBR 的代价: 静态场景浪费带宽,动态场景画质下降。说白了,它用「画质波动」换「码率稳定」。如果你对画质有要求,CBR 不是好选择。
3.2 VBR(可变码率)—— 文件存储和点播的首选
VBR 允许编码器根据画面复杂度动态分配码率。简单画面少给点,复杂画面多给点。我个人习惯在点播场景中优先用 VBR,因为文件大小可控,画质又比 CBR 好得多。
VBR 的两种策略:
| 策略 | 说明 | 典型参数 | 适用场景 |
|---|---|---|---|
| 1-pass VBR | 一次编码,码率分配靠经验 | -b:v 2000k -maxrate 4000k |
实时编码、直播录制 |
| 2-pass VBR | 第一遍分析,第二遍精确分配 | -pass 1 / -pass 2 |
离线转码、蓝光压制 |
2-pass VBR 配置示例:
# 第一遍:分析场景复杂度
ffmpeg -i input.mp4 \
-c:v libx264 \
-b:v 2000k \
-pass 1 \
-f mp4 /dev/null
# 第二遍:按分析结果精确编码
ffmpeg -i input.mp4 \
-c:v libx264 \
-b:v 2000k \
-maxrate 4000k \
-bufsize 4000k \
-pass 2 \
output.mp4
-maxrate 建议设为目标码率的 1.5~2 倍。设太小会限制复杂场景的画质,设太大又失去了 VBR 的意义。我一般用 1.8 倍,效果比较均衡。
VBR 的坑: 实时编码场景慎用 2-pass,因为第一遍分析会引入一帧的延迟。直播场景只能用 1-pass VBR,但码率波动可能比较大,需要配合 -maxrate 和 -bufsize 做限幅。
3.3 CRF(恒定质量因子)—— 调优技巧与实战
CRF 是我个人最偏爱的模式。它不直接控制码率,而是控制「感知质量」。编码器会不断调整量化参数(QP),让每一帧的画面质量保持恒定。说白了,CRF 是「质量优先」的终极方案。
CRF 值含义:
| CRF 值 | 质量等级 | 典型文件大小 | 适用场景 |
|---|---|---|---|
| 18 | 视觉无损 | 较大 | 存档、母版 |
| 23 | 高质量 | 适中 | 在线点播、个人收藏 |
| 28 | 可接受 | 较小 | 移动端、低带宽 |
| 35 | 较差 | 很小 | 预览、缩略图 |
CRF 调优技巧:
- 基础配置:
-crf 23 -preset medium是万金油组合,大部分场景都能用。 - 配合
-tune参数: 动画用-tune animation,电影用-tune film,静态画面用-tune stillimage。我试过,动画场景下-tune animation能省 15%~20% 的码率。 - 限制最大码率: CRF 虽然不控制平均码率,但可以用
-maxrate和-bufsize做上限保护,防止极端场景码率爆炸。 - 结合
-profile:v: 高 CRF 值(如 28 以上)配合-profile:v baseline可以进一步降低解码复杂度,适合老旧设备。
CRF 配置示例:
# 高质量 CRF 编码(适合 1080p 点播)
ffmpeg -i input.mp4 \
-c:v libx264 \
-crf 21 \
-preset slow \
-tune film \
-maxrate 8000k \
-bufsize 16000k \
-profile:v high \
-level 4.1 \
output.mp4
3.4 三种模式对比与选型指南
为了方便你快速决策,我把三个模式的核心差异整理成了一张表:
| 维度 | CBR | VBR | CRF |
|---|---|---|---|
| 码率稳定性 | ★★★★★ | ★★★☆☆ | ★★☆☆☆ |
| 画质一致性 | ★★☆☆☆ | ★★★★☆ | ★★★★★ |
| 文件大小可控性 | ★★★★★ | ★★★★☆ | ★★☆☆☆ |
| 编码效率 | ★★★★☆ | ★★★☆☆ | ★★★★★ |
| 适用场景 | 直播、会议、广电 | 点播、存储、分发 | 存档、母版、个人 |
选型口诀: 直播用 CBR,点播用 VBR,存档用 CRF。如果场景模糊,先问自己三个问题:
- 码率必须恒定吗?→ 是 → CBR
- 文件大小有上限吗?→ 是 → VBR(2-pass)
- 画质优先,大小无所谓?→ 是 → CRF
3.5 码率控制模式决策流程图
下面这张图总结了三种模式的决策路径,你可以把它贴在工位上:
3.6 实战避坑指南
最后分享几个我亲身踩过的坑,希望能帮你省点调试时间:
- CBR 场景下画面剧烈运动时码率超标: 检查
-bufsize是否足够大,建议设为目标码率的 2~4 倍。同时确认-nal-hrd cbr已开启。 - VBR 2-pass 编码时间翻倍: 这是正常现象。如果对实时性有要求,改用 1-pass VBR 或 CRF。我一般只在离线转码时用 2-pass。
- CRF 编码后文件大小不可控: 可以用
-maxrate做上限保护。比如-crf 23 -maxrate 8000k -bufsize 16000k,这样即使画面再复杂,码率也不会超过 8Mbps。 - 低 CRF 值(如 18)配合
-preset placebo: 编码时间会爆炸,但画质提升微乎其微。我测试过,-preset slow和-preset placebo的 PSNR 差距不到 0.1dB,编码时间却差了 5 倍。别浪费算力。