4. 码率控制策略:CBR、VBR、CRF、ABR、Capped VBR 原理与选择

码率控制,说白了就是决定「每一帧该分多少比特」。选错了,要么画面糊成马赛克,要么推流卡成幻灯片。我这些年踩过的坑,有一半都跟码率控制有关。

今天咱们把五种主流策略掰开揉碎讲清楚:CBR、VBR、CRF、ABR、Capped VBR。每种我都会给出适用场景和实战参数。

4.1 五种策略的核心逻辑

先看一张总览图,帮你快速建立全局认知:

H.265 码率控制策略全景图 码率控制策略 CBR VBR CRF ABR Capped VBR 恒定码率 带宽稳定,画质波动 可变码率 画质稳定,带宽波动 恒定质量 单次编码,无码率保证 平均码率 VBR+CBR 折中 有界可变码率 VBR + 上限约束 推荐场景 直播推流 视频会议 IPTV 窄带环境 本地录制 蓝光原盘 后期制作 高码率场景 画质对比 一次编码 存档备份 离线转码 点播平台 OTT 流媒体 多码率自适应 HLS/DASH 直播+存档 混合场景 带宽敏感 画质优先

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 没区别。

最后说一句:没有万能的码率控制策略。我每次做新项目,都会先跑一段测试视频,对比不同策略的码率曲线和画质指标。数据不会骗人。