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

12

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

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

output.mp4的视频比特率大约为730kb/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 是做什么用的?


1
http://video.stackexchange.com/ 也许对类似这样的未来问题有所帮助。 - aergistal
感谢您的帮助,aergistal! - Oleksandr
1个回答

32
基本上,VBV使您能够确保编码流不会溢出或下溢解码器的缓冲区。如果数据过快,缓冲区会溢出并被迫丢弃其中一些数据。如果数据进来得太慢,缓冲区将耗尽并且播放将停顿。
有点反直觉的是,VBV下溢信号表示编码速率缓冲区的溢出(视频比特率大于输入比特率),而VBV溢出信号则表示编码速率缓冲区的下溢(视频比特率小于输入比特率)。
对于ffmpeg,bufsize是缓冲区的大小。minrate和maxrate与bufsize配合使用,设置VBR(可变比特率)的最大和最小比特率变化容差。
通常,minrate与maxrate一起使用以实现接近CBR(恒定比特率)。
maxrate不是峰值比特率,而是可以进入缓冲区的最大比特率。如果您拥有像第二个示例中那样的大缓冲区,您可以容忍更高的比特率,直到缓冲区溢出。 VBV确保在发生这种情况之前降低您的比特率。这就是为什么您的流可以达到800-900 kbps的原因。
您可以在此处阅读更多信息:--vbv-bufsize和--vbv-maxrate之间的关系

我们使用VBV作为一个假想的解码器,其输入比特率是恒定的。但如果编码器输出比特率降低,解码器如何接收恒定比特率的视频并导致缓冲区溢出? - vacing
根据我的理解,解码器将立即从缓冲区中删除数据,以便按照特定的时间进行显示帧的解码。即使流比特率为CBR,帧大小也不是恒定的。如果要删除的帧数据每次只有很小的大小,并且缓冲区以相同的恒定速率填充,则最终会溢出。较大的帧大小意味着一次使用更大的缓冲区块。因此,在第一种情况下需要填充,这只是简单地被丢弃。 - aergistal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接