码率控制

ABR,CBR,VBR的关系

与ABR相应的技术有CBR,VBR。这些码率控制技术首先都是在音频编码中采用,是解决音频编码采用什么样的比特率最优的问题。
    CBR编码码比特率基本保持恒定在目标比特率,有利于流式播放。
    CBR的缺点在于复杂场景码率不够用,简单场景码率浪费,因此编码内容的视觉质量不稳定。通常在较低比特率下,这种质量的变化会更加明显。

    VBR编码为简单场景分配较大的QP,为复杂的场景分配较小的QP,得到基本稳定的输出视觉质量。   
       相对于CBR,在相同文件大小的条件下,VBR的输出结果要比CBR好的多,这有利于媒体下载和本地存储。
    VBR的缺点在于输出码流大小不可控。同时对于复杂度恒定的内容(例如新闻播音)没什么优势。

    ABR编码为简单场景分配较少的比特,从而留出足量的比特用于生成高质量的复杂部分。使得有限的比特数能够在不同的场景间合理分配,这类似于VBR。
       同时ABR分配码率,使得在一定时间内,平均码率趋近于目标码率,这样可以控制输出文件大小,这点类似于CBR。
    因此可以认为ABR是CBR和VBR的一种折中优化方案。

    分析视频编码码率控制可以通过三个因素:
    1. 视觉质量稳定性,利于视觉主观质量;
    2. 即时输出码率,相当于每帧编码输出比特数;
    3. 输出视频文件大小可控,利于传输,存储。
    比较这三种码率控制方式如下:
       #        视觉质量稳定性         即时输出码率        输出文件大小
       CBR          不稳定               恒定               可控
       VBR           稳定                变化              不可控
       ABR         基本稳定              变化               可控 (即时码率变化,但一段时期内平均码率趋近目标码率)

x264的码率控制

--vbv-bufsize <integer> Set size of the VBV buffer (kbit) [0]
默认:0
说明:设置VBV可用的最大缓冲区,单位是kbits。VBV(Video Buffering Verifier,视频缓存检验器),它作用是处理各帧编码后大小不一和恒定输出码率的矛盾。可以将VBV想象成为一个水池,水池的入口连接着encoder的输出,出口为恒定码率的网络输出。为了使得输出恒定,encoder必须保证水池既不上溢也不下溢。下溢会导致无数据输出,上溢会导致数据丢失。所以encoder在编码一帧时会参考当前vbv的充盈情况,并由此计算出,当前帧应当编码出多少比特,从而保证既不上溢(增加QP)也不下溢(减少QP)。为了防止上溢,VBV会要求降低编码比特,encoder会采用更大一些的QP,这样必然降低了视频序列质量,因此只在真正需要的时候才设定它。一般在硬件解码端的时候,一定要做这个设置。例如蓝光定义最大的数据缓冲为30M比特,能够解码的最大视频码率为40Mbps。这是对硬件解码器资源选配的一个合理限制,否则解码器不知道预留多大的数据缓冲空间才是安全的。这类似264标准的level设定。

--vbv-maxrate <integer> Max local bitrate (kbit/s) [0]
默认:0
说明:设置VBV可用的最大码率,单位是kbps。使用它等于限制了I帧最大的码率输出(一般都是I帧达到maxrate的限制,除非bitrate设置过低不合理)。而I帧质量的降低,会拉低整个视频序列的视频质量。因此只在真正有最大码率限制的情况下才去设定它。
参见:–vbv-bufsize, –vbv-init,
在VBR和ABR情况下,可以设置vbv-maxrate和vbv-bufsize(很多情况下设置为vbv-maxrate = vbv-bufsize = bitrate,注意vbv-bufsize的量纲是不同,即最大缓存1s的数据)。
在RC_ABR码率控制方法下,如果vbv-maxrate == bitrate这时候其实进行的是CBR码率控制方法,encoder力争控制每一帧输出都稳定在bitrate上。
如果设置vbv-maxrate则vbv-bufsize必须设置,否则会提示"VBV maxrate specified, but no bufsize, ignored", vbv-maxrate会被改回为0。
如果设置vbv-bufsize而vbv-maxrate没有设置,则会提示"VBV maxrate unspecified, assuming CBR",vbv-maxrate会被设为bitrate,此时进行CBR编码。
一般设置为 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帧编码时候还能把平均码率降下来。

--vbv-init <float>      Initial VBV buffer occupancy [0.9]
默认:0.9
说明:设置播放之前必须先载入多少码流到VBV缓冲中。如果值小于1,那么大小就为 vbv-init * vbv-bufsize。如果大于1,则是以kbits为单位的值。
参见:–vbv-maxsize,
ABR时不要设置这个参数,可以完全忽略这个参数。

ffmpeg的码率控制
ABR(Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 1000k ....
它提供了某种“运行均值”的目标,终极目标是最终文件大小匹配这个“全局平均”数字(因此基本上来说,如果编码器遇到大量码率开销非常小的黑帧,它将以低于要求的比特率编码,但是在接下来几秒内的非黑帧它将以高质量方式编码方式使码率回归均值)使用两边编码模式是这个方法变得更加有效,你可以和“max bit rate ”配合使用来防止码率的波动。

CBR(Constant Bit Rate)
事实上根本就没有CBR这种模式,但是你可以通过补充ABR参数“模拟”一个恒定比特率设置,比如:
ffmpeg -i input -c:v libx264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
在这个例子中,-bufsize是一个“码率控制缓冲区”,因此它会在每一个有用的1835k视频数据内强制一个你所要求的均值(此处为4000k),所以基本上我们会认为接收端/终端播放器会缓冲那么多的数据,因此在这个数据内部波动是没有问题的。
当然,如果只有黑帧或者空白帧,它所花费的的比特率将少于需求位率(但它会尽可能的提高质量水平,直到crf)。
最大比特率的CRF模式
你可以通过声明-crf和-maxrate设置来使用带有最大比特率crf模式,比如:
ffmpeg -i input -c:v libx264 -crf 20 -maxrate 400k  -bufsize 1835k  
这将会有效的将crf值锁定在20,但是如果输出码率超过400kbps,在这种情况下编码器会将质量降低到低于crf 20。
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值