3. 码率控制模式详解:CBR、VBR、CRF、ABR
码率控制,说白了就是决定「每一秒视频该分配多少数据量」。选错了模式,要么文件大得离谱,要么画质糊成一团。我早期做直播时吃过这个亏——用了 VBR 推流,结果码率波动太大,观众端频繁缓冲。从那以后,我对这四种模式算是刻骨铭心。
一句话总结:CBR 稳如老狗,VBR 灵活高效,CRF 画质优先,ABR 折中方案。
3.1 CBR(恒定码率)—— 直播场景的定海神针
CBR 要求编码器在整个视频中保持码率恒定。你设 2 Mbps,它就尽量贴着 2 Mbps 跑,波动范围通常控制在 ±5% 以内。
原理:编码器通过调整量化参数(QP)来维持目标码率。画面简单时降低 QP 提升质量,画面复杂时提高 QP 牺牲细节。说白了,就是用质量换带宽稳定。
适用场景:
- 直播推流(RTMP、SRT)
- 视频会议(WebRTC)
- 广电/有线电视传输
- 带宽严格受限的管道
我的经验:做直播时,CBR 的 buffer 大小很关键。我习惯设 buffer 为目标码率的 2 倍,既能平滑波动,又不会引入过大延迟。
参数配置示例(x264):
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" \
output.ts
注意:CBR 在复杂场景下画质会明显下降。我曾经用 CBR 编码一段烟花视频,结果码率不够,画面全是块效应。这种场景建议换 VBR 或 CRF。
3.2 VBR(可变码率)—— 存储场景的省码利器
VBR 允许码率根据画面复杂度动态变化。简单场景给低码率,复杂场景给高码率。最终文件大小比 CBR 小 20%-50%,画质却更好。
原理:编码器设定一个目标质量范围,然后自由分配码率。VBR 又分两种:
- 1-pass VBR:一次编码,速度快但码率控制不够精准
- 2-pass VBR:第一遍分析场景复杂度,第二遍精准分配码率。我强烈推荐这个
适用场景:
- 本地视频文件存储
- 蓝光/DVD 制作
- 视频点播存档
- 对文件大小有要求但带宽不敏感的场景
参数配置示例(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 -pass 2 \
-maxrate 4000k -bufsize 8000k output.mp4
避坑指南:我曾经用 1-pass VBR 编码一个 2 小时的电影,结果后半段码率分配失衡,高潮部分画质崩了。从那以后,但凡重要项目我都用 2-pass。
3.3 CRF(恒定质量因子)—— 画质党的终极选择
CRF 不关心码率,只关心画质。你设一个质量值,编码器自动调整码率来维持这个质量。CRF 值范围通常是 0-51,数值越小质量越高。
常用 CRF 值参考:
| CRF 值 | 质量等级 | 典型文件大小 | 适用场景 |
|---|---|---|---|
| 18 | 视觉无损 | 较大 | 归档、母版 |
| 23 | 优秀 | 适中 | 日常存储 |
| 28 | 良好 | 较小 | 移动设备 |
| 35 | 可接受 | 很小 | 预览、缩略图 |
参数配置示例:
# CRF 23,适合大多数场景
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# CRF 18,视觉无损,适合归档
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow output.mp4
注意:CRF 无法控制输出码率。我遇到过用 CRF 18 编码一段静态画面,结果码率飙到 50 Mbps 的情况。如果你有带宽或存储限制,别用 CRF。
3.4 ABR(平均码率)—— 折中主义的智慧
ABR 是 CBR 和 VBR 的混合体。它允许码率在一定范围内波动,但保证整体平均码率接近目标值。说白了,就是「既要带宽可控,又要画质灵活」。
原理:编码器设定一个目标平均码率,同时允许短时间内的码率波动。波动范围由 maxrate 和 bufsize 控制。
适用场景:
- OTT 点播平台(Netflix、YouTube)
- HLS/DASH 多码率自适应流
- 需要控制文件大小但不想牺牲太多画质
参数配置示例:
ffmpeg -i input.mp4 -c:v libx264 \
-b:v 2000k -maxrate 3000k -bufsize 4000k \
output.mp4
我的习惯:做 OTT 点播时,我通常把 maxrate 设为 b:v 的 1.5 倍,bufsize 设为 2 倍。这样既能应对复杂场景的码率峰值,又不会让整体文件大小失控。
3.5 四种模式对比总结
| 特性 | CBR | VBR | CRF | ABR |
|---|---|---|---|---|
| 码率稳定性 | ★★★★★ | ★★☆☆☆ | ★☆☆☆☆ | ★★★★☆ |
| 画质表现 | ★★☆☆☆ | ★★★★☆ | ★★★★★ | ★★★☆☆ |
| 文件大小可控性 | ★★★★★ | ★★★☆☆ | ★☆☆☆☆ | ★★★★☆ |
| 编码速度 | 快 | 慢(2-pass) | 快 | 中等 |
| 推荐场景 | 直播、会议 | 存储、蓝光 | 归档、母版 | OTT、点播 |
3.6 实战选择指南
选哪种模式,其实就三个问题:
- 带宽是否严格受限? → 是 → CBR
- 画质是否第一优先级? → 是 → CRF
- 需要控制文件大小吗? → 是 → 再问:能接受 2-pass 吗?能 → VBR,不能 → ABR
我的建议:新手先从 CRF 23 开始,感受一下不同场景下的码率变化。等你对码率有了直觉,再尝试 CBR 和 VBR。ABR 适合做生产环境的默认选项——它不会让你翻车。
嗯,这四种模式其实没有绝对的好坏。关键是你得清楚自己的场景需求。我见过有人用 CBR 做归档,结果画质惨不忍睹;也有人用 CRF 做直播,结果码率失控导致卡顿。选对了,事半功倍;选错了,事倍功半。