码控算法
码率控制,它是编码器的一个重要模块,主要的作用就是用算法来控制编码器输出码流的大小。虽然它是编码器的一个非常重要的部分,但是它并不是编码标准的一部分,也就是说,标准并没有给码控设定规则。我们平时用的编码器的码控都是编码器程序自己实现的。
常用的码控算法主要有:VBR(动态码率)、CQP(恒定 QP)、CRF(恒定码率因子)和 CBR(恒定码率)这几种。
· VBR(Variable Bitrate,动态码率)
VBR 指的是编码器输出码率随着原始视频画面复杂度的变化不断的变化,即允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。通常当画面复杂或者说运动比较多的时候使用的码率会比较高;而当画面比较简单的时候使用的码率会比较低。VBR 主要的目标是保证视频画面质量,因此比较适合视频点播和短视频场景使用。
码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion 发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率,图像内容复杂则分配较多的码率,这样既保证了质量,又兼顾带宽限制。这种算法在画质相同的前提下,可以缩小文件体积。
· CQP(Constant QP,固定质量参数)
CQP 从头到尾每一个画面都是用同一个 QP 值去编码:
在画面复杂的时候,残差比较大,相同 QP 值做量化之后的残差还是比较大的,编码之后的图像大小就会比较大。
而画面简单的时候,残差很小,同一个 QP 值量化之后残差可能很小,甚至都为 0 了,编码之后的大小就会很小。
每一帧图像在压缩的时候,采用相同的 QP 值。(QP 值决定了量化编码时从像素宏块的原始信息中丢弃多少信息,QP 越大压缩率越高同时质量越低,QP 越小压缩率越低同时质量越高)
· CRF(Constant Rate Factor,恒定码率因子)
使用 CBR 和 VBR 时,需要选择一个目标码率,编码器会调整视频质量以达到该目标。这种方法的问题是,如果你对所有视频片段使用了相同的码率阶梯,那么就会在容易编码的视频上浪费很多不必要的带宽。
所以,当使用 CBR 和 VBR 编码时,编码器会调整所需的视频质量进而达到目标码率。相比之下,使用 CRF 编码,选择一种目标质量,编码器会通过调整码率达到该质量水平。CRF 值分布为从 0 到 51,一般来说这个取值越小,视频帧编码质量相对越高,取值为 0 则是无损压缩。
· CBR
另外一种码控算法就是 CBR 了,它是恒定码率的。这种码控方式用户需要设置一个目标码率值给编码器。编码器在编码的时候不管图像画面复杂或简单、运动多或运动少的时候,都尽量使得输出的码率接近设置的目标码率。
这种方式非常适合 RTC 场景,因为 RTC 场景希望编码的码率跟实际预测的带宽值接近,不能超出目标码率太多,也希望能够尽量有效地利用可用带宽,不能太低于目标码率,从而尽量保证编码后图像画面清晰。
因此,在 RTC 场景中,我们会将预估带宽分出一定比例给视频数据,并将这部分带宽值当作目标码率设置给编码器。需要编码器的码控算法,能够在各种网络状况下和各种画面变化的情况下,都能使得输出的码率尽量接近于当前预估带宽得到的目标码率。
评论