x264 vbv 码控测试分析
测试环境
测试视频是一个街拍视频,画面纹理复杂度较高,截图如下:

源视频信息:
- 1920x1080,30fps
测试编码信息:
- 关闭 b 帧
- 只编码前 2 分钟的视频
- 预设为 x264 medium 挡位
- 目标码率为 3000k
码流查看工具:
- FFBitrateViewer
ABR 对比 CBR
abr 编码指令:
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000" -profile main -preset medium output.mp4
cbr 编码指令:
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=3000" -profile main -preset medium output.mp4
对比如下:

现象:
- abr 和 cbr 码控,均能实现平均码率达到目标码率
- abr 码控的码率波动程度更大
- 当前 vbv 约束参数无法实现完全的码率恒定,但是确实码率波动比 abr 模式小
CBR 码控,关闭 scenecut
关闭 scenecut 编码指令:
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=3000:no-scenecut=1:keyint=120" -profile main -preset medium output.mp4
对比如下:

现象:
- 两者平均码率均能达到目标码率
- vbv 约束参数依然无法实现完全的码率恒定
- 关闭 scenecut 后,码率波动会比开启的更大
调整 vbv-bufsize 对 CBR 码控的影响
高 vbv-bufsize 编码指令 (vbv-bufsize 调整为 9000k):
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=9000" -profile main -preset medium output.mp4
低 vbv-bufsize 编码指令 (vbv-bufsize 调整为 1000k):
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=1000" -profile main -preset medium output.mp4
对比如下:

现象:
- buf 较大时,码率波动更大,且平均码率能够超过目标码率
- buf 较小时,码率波动最小,但是平均码率会更小于目标码率
调整 vbv-maxrate 对 CBR 码控的影响
高 vbv-maxrate 编码指令 (vbv-maxrate 调整为 6000k):
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=6000:vbv-bufsize=3000" -profile main -preset medium output.mp4
低 vbv-maxrate 编码指令 (vbv-maxrate 调整为 2000k):
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=2000:vbv-bufsize=3000" -profile main -preset medium output.mp4
对比如下:

现象:
- maxrate 较大时,码率波动更加大,但是平均码率还是接近目标码率
- maxrate 较小时,码率波动与 normal 差不多,但是平均码率远小于目标码率,约等于设置的 maxrate
实现完全的恒定码率
参考:https://forum.doom9.org/showthread.php?p=1967003
将 vbv-bufsize 设置为单帧大小,这里即 3000 / 30 = 100 kbps:
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=100" -profile main -preset medium output.mp4
对比如下:

现象:
- 码率相对来说非常稳定
- 但是平均码率远小于目标码率
另外,还可以设置 x264 支持的 HRD 特性,即设置 nal_hrd=cbr:
- ffmpeg -i guangzhou_1920x1080.mp4 -t 00:02:00 -r 30 -c:v libx264 -x264-params "psnr=1:bframes=0:bitrate=3000:vbv-maxrate=3000:vbv-bufsize=100:nal_hrd=cbr" -profile main -preset medium output.mp4
对比如下:

现象:
- 码率非常稳定,变成了一条直线
- 平均码率也等于目标码率
看起来很好,但是这是有代价的,例如我们看一下 x264 输出的 psnr 值:
- cbr-normal:
PSNR Mean Y:33.053 U:44.057 V:43.988 Avg:34.636 Global:34.261 kb/s:2950.10 - nal-hrd:
PSNR Mean Y:31.861 U:43.442 V:43.375 Avg:33.464 Global:32.946 kb/s:3000.00
可以看到,psnr 掉了 1.2 个点 (感觉还好,代价不是很大)。

浙公网安备 33010602011771号