VBV的作用:
处理各帧编码后大小不一和恒定输出码率的矛盾。
可以将VBV想象成为一个水池,水池的入口连接着encoder的输出,出口为恒定码率的网络输出。为了使得输出恒定,encoder必须保证水池既不上溢也不下溢。上溢会导致数据丢失,下溢会导致无数据输出。所以encoder在编码一帧时会参考当前VBV的充盈情况,并由此计算出,当前帧应该编码出多少bit,从而保证既不会上溢(增加QP)也不会下溢(减少QP)。
VBV的参数:
bufsize:
设置VBV可用的最大缓冲区,单位是kbits。
maxrate:
设置VBV可用的最大码率,单位是kbit/s。该参数限制了I帧最大的码率输出(一般I帧才能达到maxrate的限制,除非bitrate设置的过低)。由于I帧质量的降低会拉低整个视频序列的编码质量,因此只有在真正有最大码率限制的情况下才会设置该参数。
init:
设置播放之前必须先载入多少码流到VBV缓冲里面。如果该参数值小于1,那么大小为init*bufsize;如果该参数值大于1,那么大小为以kbits为单位的值。
bufsize和maxrate的关系:
一般设置为 vbv-maxrate = vbv-bufsize = a*bitrate。
a=0,不启用VBV机制,编码性能最好,适用于硬盘文件编码。但它输出的码率波动性大,有可能某些帧的比特数过高,不适用于有实际带宽限制的流媒体传输;
0<a<1,这样的设置没有什么意义,得不到任何的好处;
a=1,等于CBR,CBR是一种复杂和平滑场景都不大讨好的码率控制方法,一般不采用这一方法;
a>1,对每帧数据有限制,但又可以暂时超过平均码率,适用于流媒体传输。
对于某些特殊场景编码,例如电脑屏幕编码,它的特点是I帧纹理细节丰富,编码数据极大,P帧变化很小或者根本没变化,p帧数据很小。这种情况,如果不设置vbv参数(保持缺省值0),I帧数据压不下来,码流会周期性的高低变动;有可能造成网络拥塞,数据包丢失,解码端花屏。如果设置a=1,I帧得到限制,可以压下来,但编码质量下降太多,主观质量差。因此需要根据网络设置成a>1,使得I帧可以暂时有限度的大于平均码率,而P帧编码时候还能把平均码率降下来。
参考:
码率控制_evsqiezi-CSDN博客
x264码率控制介绍、配置及应用_Ronater的博客-CSDN博客