X264中的码率控制算法

1. 码率控制的选择策略:�率失真优化模型

RDO: rate-distortion optimization率失真优化

限定码率值Rc,选择合适的编码模式,使得失真D最小。

编码模式包括量化步长、宏块模式选择、帧内/帧间预测模式选择等。

码率控制的RDO模型的目标是确定每帧或每个宏块合适的量化步长。

1.1 Lagrangian RDO

H.264标准使用了一种基于Lagrangian优化算法的RDO模型实现码率控制,数学原理很完美,但实际效果不是很好,所以实用中很少使用。

在数学最优化问题中,拉格朗日乘数法是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。这种方法将一个有n 个变量与k 个约束条件的最优化问题转换为一个有n + k个变量的方程组的无条件极值问题,进而采用偏微分或全微分法就能很容易求出其极值。

1.2 X264码率控制算法

而X264编码器的码率控制算法与H.264标准的有很大差别,主要是根据经验总结出来的算法。

2. X264的码率控制的几个基本原则

(1) 我们希望获得恒定视觉质量的编码码流,但是恒定视觉质量并不意味着恒定的PSNR或QP。对高复杂度、高运动感的图像,人眼并不会注意到细节,因而可以在某种程度上增大QP而达到相同的视觉质量。

(2) 根据图像的重要性来确定不同的QP。由于B帧不用于预测任一其他帧,故其重要性相对于I、P帧要低,因而B帧的量化步长可以较大。

3. X264的RDO模型

X264采用一种半精度帧的SATD(sum of absolute transformed difference)作为模式选择的依据。SATD是将残差做hadamard变换再取绝对值的总和,它作为一种简单的时频变换,能在一定程度上衡量生成码流的大小。下图是一个简单的2x2的Hadamard变换矩阵:


X264中的码率控制算法_第1张图片

4. 码率控制的三种思路-CBR,VBR,ABR

CBR: constants bit rate, 固定码率编码器的输出码率是一个固定值。

在一个带宽受限的信道中进行多媒体通讯的时候CBR是非常有用的,但是CBR不适合进行存储,因为CBR会导致没有足够的码率对复杂的内容进行编码,使复杂内容的质量下降,同时对简单的内容会浪费一些码率,这时VBR是较好的选择。

VBR: Variable Bit Rate,可变比特率

其原理就是将图像中的复杂部分用高比特率编码,简单部分用低比特率编码,通过这种动态调整编码速率的方式,进一步得到视频质量和比特率之间的平衡。它的主要优点是可以让每一帧都能大致达到相同的视觉质量,缺点是编码时无法估计压缩出来的文件大小。

ABR: Average Bit Rate,平均比特率

可以做为VBR和CBR的一种折衷选择

5. X264中所用的ABR算法

第一,对当前图像做抽样滤波,得到分辨率是原来一半的小图,在小图上做半像素精度预测,与原图相减得到残差Xd,再对Xd做hadamond变换并求绝对和得到SATD,当前图像的复杂度就是由当前帧SATD与之前帧SATD值的加权平均构成。

如:设第一帧SATD1=100262,第二帧SATD2=12812,第三帧SATD3=12022,则当前帧的复杂度为:

接着由速率控制公式计算相应的qpscale:

其中qcomp为线性量化控制参数,0为固定码率,1为固定QP,默认值是0.6。

第二,再由之前图像的编码信息确定比例因子rate_factor调整qpscale的值,使得编码速率尽可能接近所要求的平均比特率。若之前已编码帧的实际比特数越是大于目标比特数,rate_factor越小,缩放后的qpscale就越大,量化步长也越大,生成的比特流越小,从而达到调整比特率的目的。

X264中的码率控制算法_第2张图片

rate_factor的确定

编码前会初始化一个长期复杂度累积因子:

complex_sum = 0.01 * 700000f_qcompress * sqrt(mb_count)

当前帧编码完会使用下述公式累积长期复杂度累积因子:

complex_sum += bits * (0.85 * 2(qp-12)/6) / qp

  由上式可以看出长期复杂度因子与已编码的比特数正相关。

然后计算截止到当前帧的目标比特数:

wanted_bits_window += bitrate/fps

而rate_factor就是wanted_bits_window与complex_sum的比值:

rate_factor = wanted_bits_window / complex_sum

第三,对qpscale做溢出补偿处理,通过补偿能够合理控制文件的大小,但在一定程度上会降低质量:

            qpscale = qpscale x overflow

            overflow  = 1.0 +(total_bits – wanted_bits_window)/abr_buffer

如果实际编码比特数total_bits大于目标比特数,overflow大于1,qpscale被放大,从而生成更少的码流;相反如果实际比特数小于目标比特数,overflow小于1,qpscale被缩小,量化步长变小,从而生成更多的码流,调整了比特率。   

第四,由qpscale得到当前帧的量化步长qp:

X264中的码率控制算法_第3张图片

6. X264中所用的CBR算法

第一步与ABR算法一样,算出当前帧的复杂度之后,使用qcomp=0来计算当前帧的qpscale:

在第二步中CBR所用的rate_factor不是由前面帧确定的,而是由当前vbv_buffer的大小决定的。

Video Buffering Verifier,视频缓存检验器

VBV buffer 的作用是处理各帧编码后大小不一和输出CBR 的矛盾。

CBR规定encoder的输出码率为恒定,但是各帧编码后的大小不是固定的(I,B,P帧的存在),因此需要在encoder后面加入VBV buffer。�可以将VBV buffer想象成为一个水池,水池的入口连接着encoder的输出,水池的出口为恒定的码率输出。�为了使得输出恒定,encoder必须保证水池既不上溢也不下溢。下溢会导致无数据输出,上溢会导致数据丢失。�所以encoder在编码一帧时会参考当前vbv buffer的充盈情况,推算出一个rate_factor,用来调整当前帧的量化步长,进而确定当前帧应当编码多少比特才能保证vbv_buffer既不上溢也不下溢。

第三,CBR的溢出补偿更加严格,而且在VBV接近0时将会强制限制QP。但在VBV没用完时并不会强制限制QP,所以CBR的结果多少会比目标码率低一点。还要注意的是,如果在所有机制过后,一个帧还是超出了VBV的限制,那它是不会被重新编码的。

7. X264中所用的CRF算法

恒定码率因子码率控制算法

第一步同ABR算法。

第二步rate_factor恒定为参数-crf所指定的值。

第三步没有溢出补偿。

8. X264所用的CQP算法

恒定量化参数码率控制法

QP只是简单的和帧类型相关

比如I帧使用QP=26的量化步长,P帧使用QP=28,B帧使用QP=30。

9. X264所用的自适应量化模型

自适应量化模式Adaptive Quantization Mode。

AQ可以更好把码率分配到各个宏块中。

它的基本原理也是根据当前宏块的复杂度SADT,并与当前帧的平均复杂度做对比,若高于平均,则分配更多的码率,即用小于当前帧QP值的量化步长;低于平均值则分配更少的码率,即用大于当前帧的QP值的量化步长。

具体到每一个mb,x264又使用了一种复杂的mb-tree的宏块级的码率分配算法。

10. 动态码率分配

针对丢包率相对固定的环境,动态码率分配(DBA)功能可以在视频通话过程中自动且动态地调整视频码率,以消除或避免丢包。例如,在一个384 kbps的视频通话中(320 kbps用于视频,64kbps用于音频)检测到一个稳定在10%的丢包率,DBA就会降低约10%视频码率,由320kbps降到288kbps左右。然后重新采样信号,观察是否还存在丢包现象。如果有必要,DBA可以进一步降低视频码率,直到在数秒内不再出现丢包为止。   

在降低码率后,如果DBA测定丢包只是暂时的(持续时间不到几秒钟),DBA将逐步增加视频码率。然而,如果DBA持续检测到丢包现象,它就不再调整视频码率,并将通话继续进行下去。这一方法,使得DBA非常适合于由网络过度使用或因吞吐量问题引起的丢包现象。

11. 在不同码控下的测试结果

X264中的码率控制算法_第4张图片
X264中的码率控制算法_第5张图片
X264中的码率控制算法_第6张图片
X264中的码率控制算法_第7张图片

你可能感兴趣的:(X264中的码率控制算法)