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

Ale*_*ndr 5 ffmpeg video-processing video-encoding h.264

我无法理解什么是VBV(视频缓冲验证器)以及它与maxrate有什么关系.
当我使用此命令时:

ffmpeg -i input.mp4 -crf 21 -maxrate 750k -bufsize 750k -codec:v:0 libx264 -s 640x360 -r 30 output.mp4
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

aer*_*tal 16

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

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

对于ffmpegbufsize是缓冲区的大小.minratemaxratebufsizeVBR(可变比特率)的最大和最小比特率变化容差一起使用.

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

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

你可以在这里阅读更多:--vbv-bufsize和--vbv-maxrate之间的关系