转自:
任何编码器在工作过程中都隐含着这样一个优化问题,即在没有明显观测区别(给定质量要求)的情况下,优化最终文件的大小(Rate-Distortion)。RD常常被细化成两个优化子问题,其一是模式选择,其二是ratecontrol也就是码率控制。在给定标准的前提下,模式选择从性能上来说没有太多可优化的,因此码率控制就变成了最能体现编码器设计者的智慧的部分,任何优秀的编码器之所以优秀的原因,很大程度上是因为它内部的码率控制算法先进,优化得当。为了便于理解,我们用数学的语言重新描述下RD这个大框架:
已知一种质量损失算子J,选择合适的预测模式,在给定目标文件大小的情况下,使得J最小。
(Given a distortion metric J, find appropriate estimation method, such that the J is minimized under the condition of assigned bitrate.)
x264是遵循H.264/AVC标准的性能最优的开源编码器,在x264 source的doc/ratecontrol.txt中有一篇关于x264中使用的各种码率控制的粗略介绍。说是粗略只是因为他没有涉及具体的算法细节,而是从理论框架的角度讨论了x264中各种码率模式下完成的工作,下面我就用自己的语言稍微概括下这个文档大体的内容:
码率控制的理论基础(或者说公理吧):
1. 相同的qp不一定代表着相同的主观质量、同样相同的PSNR也不代表着相同的主观质量。前者表明的是qp与质量之间不能互相指代,后者则说明了psnr这种质量算子与主观质量之间的偏差。
2. 给运动估计做得好的帧分配更多的码率有助于提高整体质量。这是因为GOP和IBBBP这种链式结构的存在而产生的,一个显而易见的推论是如果想改善整体质量,对I和IDR的预测下手是更有效的。
3. 已知一帧的编码模式(预测模式),可以预测出不同qp取值下所需的码率,当然这种预测会随着qp分布的离散而变得不精确。
4. 帧的重要性与它被参照的次数成正比。基于此,我们能看到的一个常见qp分布就是Iqp>Pqp>Bqp。
码率控制的框架:
x264下码率控制就是三步走,根据不同的模式每步具体干的活不一样,归纳起来这三步就是:
1、根据复杂度分配qp
2、根据模式特性重调qp
3、码率溢出控制
x264中使用的码率控制模式:
1. 2pass mode
对应于–pass 2 –bitrate xxx –stats “xxx.stats” stats文件由ABR的1pass生成(crf亦可)
此时的优化问题可以归结成选择qp使得质量最优同时达到指定的码率。具体实施时分成三步进行:
在2pass开始前,用经验公式(复杂度^0.6)决定一些帧的码率,复杂度是由1pass的预测结果得到的(所谓恒定qp时的码率)。
之后根据这个结果,进行调整以达到指定的最终文件大小。如果有vbv选项,则vbv选项中的指定值也会成为调整的一个依据。
最后开始编码,此时有两种补偿机制作用,防止码率溢出:
远期补偿机制检查的是以当前qp编码全部帧时最终大小与指定大小的差,并以此更新之后编码帧的qp。如果发现一直偏离指定大小,则存在一个强制调整机制以纠正这个偏离(乘上偏差值的倒数)。
近期补偿机制则是防止在编码开始和结束时码率偏离指定值太多而存在的。
2. 1pass ABR
1pass与2pass最本质的差别在于2pass时编码器已经对全片的复杂度走势了然于心,但1pass则一切未知,因此1pass时复杂度是由预测得到的。
所谓复杂度的预测,本质上还是一次运动估计过程,只不过我们不需要非常精确的估计,x264里使用的是downsample后的“缩略图”进行估计,算法使用的是SATD。
另外,对I帧qp分配的奖励机制,也是基于之前已编码I帧获得的信息来实现的。
再者,对qp的重调也只能通过之前已编码帧获取的信息来进行。
防止码率溢出的机制与2pass相同。
3. CRF
crf的全名是constant rate factor,这里说的rate factor,就是前面两种模式下第二部重调qp所用的factor。知道了这点CRF也就不难理解了:
CRF的第一步与1pass ABR一样,同时没有防止码率溢出的机制(没有第三步)。CRF的第二部也就是重调qp时使用的是使用者指定的rate factor而不是编码器自己完成的。
4. 1pass CBR和constant quantizer
前者的第二步中重调qp使用的factor是由vbv缓存中存储的所有帧均值获得的,前者的第三步中使用了某些硬阈值条件。
后者则非常简单,由于x264是基于帧做码率控制的,因此只是对每种类型的帧指定一样的qp罢了。