什么是 H.264 中的 VBV(视频缓冲验证器)?

What is VBV (Video Buffering Verifier) in H.264?

我不明白什么是 VBV(视频缓冲验证器)以及它与 maxrate 有什么关系。
当我使用这个命令时:

ffmpeg -i input.mp4 -crf 21 -maxrate 750k -bufsize 750k -codec:v:0 libx264 -s 640x360 -r 30 output.mp4

output.mp4 视频的比特率约为 730 kb/s
但是当我使用这个命令时(相同的命令但使用 -bufsize 5000k):

ffmpeg -i input.mp4 -crf 21 -maxrate 750k -bufsize 5000k -codec:v:0 libx264 -s 640x360 -r 30 output.mp4

output.mp4 视频的比特率高于 750kb/s(大约 800-900 kb/s)。
为什么会这样?为什么我们需要bufsize? bufsize 有什么作用?

基本上,VBV 使您能够确保编码流不会溢出或下溢解码器的缓冲区。如果太多的数据快速进入,缓冲区就会溢出,你将被迫丢弃其中的一些数据。如果数据传入速度太慢,缓冲区将 运行 溢出并且播放将停止。

这有点违反直觉,但是 VBV 下溢 表示编码器速率缓冲区 溢出(视频比特率大于输入速率)而 VBV 溢出 表示编码器速率缓冲区 下溢 (视频比特率低于输入速率)。

对于 ffmpegbufsize 是缓冲区的大小。 minratemaxratebufsize 结合使用来设置 VBR(可变比特率)的最大和最小比特率变化容限。

minrate 通常与 maxrate 一起使用以实现接近 CBR(恒定比特率)。

maxrate不是峰值码率,而是可以进入缓冲区的最大码率。如果您有一个大缓冲区,就像在您的第二个示例中一样,您可以在更长的时间内容忍更高的比特率,直到缓冲区溢出。 VBV 确保您的比特率在此之前降低。这就是为什么您的流可以达到 800-900 kbps。

您可以在这里阅读更多内容:The relationship between --vbv-bufsize and --vbv-maxrate