4. 码率控制策略:CBR、VBR、CRF、ABR、Capped VBR 原理与选择
码率控制,说白了就是决定「每一帧该分多少比特」。选错了,要么画面糊成马赛克,要么推流卡成幻灯片。我这些年踩过的坑,有一半都跟码率控制有关。
今天咱们把五种主流策略掰开揉碎讲清楚:CBR、VBR、CRF、ABR、Capped VBR。每种我都会给出适用场景和实战参数。
4.1 五种策略的核心逻辑
先看一张总览图,帮你快速建立全局认知:
4.2 CBR(恒定码率)
CBR 要求输出码率始终围绕目标值波动,波动范围通常在 ±5% 以内。编码器会通过调整 QP(量化参数)来强制满足这个约束。
核心特征:码率稳定,画质波动。简单场景浪费比特,复杂场景不够用。
我在做视频会议项目时用过 CBR。当时客户要求每路流必须严格控制在 2Mbps,不能超。CBR 是唯一选择。但代价是:画面静止时能看到明显的块效应——因为编码器宁可浪费比特也要维持码率。
典型参数:
# x265 CBR 示例(直播推流)
x265 --input source.yuv --output output.hevc \
--bitrate 2000 \
--vbv-maxrate 2000 \
--vbv-bufsize 4000 \
--nal-hrd cbr \
--no-scenecut \
--keyint 60 \
--min-keyint 60
注意:CBR 模式下,--vbv-maxrate 必须等于 --bitrate,否则编码器会进入 VBR 模式。我曾经见过有人把 vbv-maxrate 设成 2500,结果推流带宽忽高忽低,CDN 直接断流。
4.3 VBR(可变码率)
VBR 允许码率根据画面复杂度自由变化。简单场景少给比特,复杂场景多给比特。画质更均匀,但输出码率不可控。
说白了,VBR 就是「按需分配」。我做过一个测试:同一段 10 分钟的视频,CBR 平均码率 5Mbps,VBR 平均码率 4.2Mbps,但 VBR 的 SSIM 反而高了 0.03。为什么?因为 VBR 把省下来的比特用在了刀刃上。
典型参数:
# x265 VBR 示例(本地录制)
x265 --input source.yuv --output output.hevc \
--bitrate 5000 \
--vbv-maxrate 10000 \
--vbv-bufsize 15000 \
--no-vbv-hrd \
--pass 2
经验之谈:VBR 建议用 2-pass 编码。第一遍分析场景复杂度,第二遍精确分配比特。单遍 VBR 的码率波动可能达到 ±50%,2-pass 能控制在 ±20% 以内。
4.4 CRF(恒定质量)
CRF 不直接控制码率,而是控制「感知质量」。编码器会为每一帧选择最合适的 QP,使得整段视频的主观质量保持一致。
CRF 的取值范围是 0-51,数值越小质量越高。H.265 的常用范围是 18-28:
| CRF 值 | 质量等级 | 典型码率(1080p) | 适用场景 |
|---|---|---|---|
| 18-20 | 视觉无损 | 8-15 Mbps | 存档、母版 |
| 22-24 | 高画质 | 4-8 Mbps | 点播、本地存储 |
| 25-28 | 良好 | 2-4 Mbps | 网络分发 |
| 30+ | 可接受 | <2 Mbps | 移动端、低带宽 |
典型参数:
# x265 CRF 示例(离线转码)
x265 --input source.yuv --output output.hevc \
--crf 23 \
--no-vbv \
--no-scenecut \
--keyint 250 \
--min-keyint 25
注意:CRF 不能用于直播推流。因为输出码率完全不可控,复杂场景可能瞬间飙到 20Mbps,CDN 直接拒绝连接。我见过有人用 CRF 推流,结果每 30 秒断一次流。
4.5 ABR(平均码率)
ABR 是 VBR 和 CBR 的折中方案。它允许短时间内的码率波动,但保证长时间窗口(通常是 1-2 个 GOP)的平均码率接近目标值。
ABR 的核心参数是 --vbv-bufsize。缓冲区越大,码率波动越自由,画质越好;缓冲区越小,码率越平稳,画质越差。
典型参数:
# x265 ABR 示例(点播平台)
x265 --input source.yuv --output output.hevc \
--bitrate 4000 \
--vbv-maxrate 6000 \
--vbv-bufsize 8000 \
--nal-hrd vbr \
--pass 2
经验之谈:ABR 的 vbv-bufsize 建议设为 bitrate 的 1.5-2 倍。太小了跟 CBR 没区别,太大了又变成 VBR。我一般用 2 倍,效果最均衡。
4.6 Capped VBR(有界可变码率)
Capped VBR 是 VBR 的增强版。它在保持 VBR 画质优势的同时,给码率加了一个「天花板」。一旦码率超过上限,编码器会强制提升 QP 来压码率。
这个模式我特别喜欢用在「直播+录制」的混合场景。直播需要码率可控,录制需要画质优先。Capped VBR 刚好满足两边。
典型参数:
# x265 Capped VBR 示例(直播+录制)
x265 --input source.yuv --output output.hevc \
--bitrate 3000 \
--vbv-maxrate 4500 \
--vbv-bufsize 6000 \
--nal-hrd vbr \
--no-pass \
--lookahead-slices 0 \
--rc-lookahead 40
核心优势:码率上限可控,画质优于 CBR,码率波动小于 VBR。适合对带宽有要求但又不想牺牲画质的场景。
4.7 如何选择?一张表说清楚
| 场景 | 推荐策略 | 理由 |
|---|---|---|
| 直播推流(带宽固定) | CBR | 码率稳定,不超带宽 |
| 直播推流(带宽有余量) | Capped VBR | 画质更好,上限可控 |
| 本地录制/存档 | VBR 或 CRF | 画质优先,码率不重要 |
| 点播平台(HLS/DASH) | ABR | 码率稳定,画质均衡 |
| 视频会议 | CBR | 低延迟,码率可控 |
| 离线转码(一次编码) | CRF | 质量恒定,无需 2-pass |
| 移动端低带宽 | CBR 或 Capped VBR | 避免卡顿,码率可控 |
4.8 避坑指南
这些年我踩过的坑,总结成几条:
- 不要用 CRF 推流。 码率不可控,CDN 会断流。我曾经在客户现场演示时用了 CRF,结果画面一复杂就断流,场面一度非常尴尬。
- CBR 的 vbv-bufsize 不要设太大。 设大了延迟高,设小了码率波动大。我一般设成 bitrate 的 2 倍。
- VBR 一定要用 2-pass。 单遍 VBR 的码率波动可能达到 ±50%,2-pass 能控制在 ±20% 以内。
- ABR 的 lookahead 不要设太小。 至少 40 帧,否则编码器来不及响应场景变化。
- Capped VBR 的 maxrate 不要设得太接近 bitrate。 至少留 50% 的余量,否则跟 CBR 没区别。
最后说一句:没有万能的码率控制策略。我每次做新项目,都会先跑一段测试视频,对比不同策略的码率曲线和画质指标。数据不会骗人。