x264 vbv 码控测试分析

测试环境

测试视频是一个街拍视频,画面纹理复杂度较高,截图如下:
image

源视频信息:

  • 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

对比如下:
image

现象:

  • 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

对比如下:
image

现象:

  • 两者平均码率均能达到目标码率
  • 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

对比如下:
image

现象:

  • 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

对比如下:
image

现象:

  • 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

对比如下:
image

现象:

  • 码率相对来说非常稳定
  • 但是平均码率远小于目标码率

另外,还可以设置 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

对比如下:
image

现象:

  • 码率非常稳定,变成了一条直线
  • 平均码率也等于目标码率

看起来很好,但是这是有代价的,例如我们看一下 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 个点 (感觉还好,代价不是很大)。

posted @ 2025-04-01 15:07  重返科韵路  阅读(8)  评论(0)    收藏  举报