Macroblock Tree
什么是Macroblock Tree
Macroblock Tree是一个基于macroblock的qp控制方法。MB Tree的工作原理类似于古典的qpcompression,只不过qcomp处理的对象是整张frame而MBTree针对的是每个MB进行处理。工作过程简单来说,是对于每个MB,向前预测一定数量的帧(该数量由rc-lookahead和keyint的较小值决定)中该MB被参考的情况,根据引用次数的多寡,决定对该MB使用何种大小的qp进行quantization。而qp的大小与被参考次数成反比,也就是说,对于被参考次数多的MB,264的解码器认为此对应于缓慢变化的场景,因此给与比较高的质量(比较低的qp数值)。至于视频的变化率与人眼感知能力的关系,这是一个基于主观测试的经验结果:视频变化率越大人眼的敏感度越低,也就是说,人眼可以容忍快速变化场景的某些缺陷,但相对而言某些平滑场景的缺陷,人眼则相当敏感。注意此处说的平滑,指的是沿时间维度上场景的变化频率,而非普通意义上的像素域中的场景。
MBTree File
这是一个临时文件,记录了每个P帧中每个MB被参考的情况。
MB Tree的处理对象
根据DS blog上的文章,目前mbtree只处理p frames的mb,同时也不支持bpyramid。
与Mbtree相关的参数
--qcomp qcomp有削弱mbtree强度的倾向,具体来说,qcomp的值越趋近于1(Constant Quantizer),mbtree的效力越差。
--rc-lookahead 决定mbtree向前预测的帧数。
一点深入的分析:
对于使用encoder的我们来说,也许需要更进一步的关注下mbtree具体是如何将码率节省到这个地步的,在这之前,我们先回顾下264的码率控制方法。
所谓码率控制,指的是在给定码率和解码端缓冲区的限制下,如何选择最优编码参数的系统优化问题。x264一共支持5种码率控制模式,而VBV的启用可以使264以mb为单位而非以帧为单位指定qp。
简而言之,CRF模式下码率控制的过程由下面三步决定:
1、首先确定当前正在处理帧的码率:由于x264使用了与画面复杂度相关的经验公式,于是问题被归结于如何预测画面复杂度。
2、对于1pass的CRF而言,画面复杂度由残差的SATD决定,后续GOP中的I帧qp则由之前编码的I帧qp继承决定。
3、之后,我们需要根据所选crf的数值,对2中获得的数据进行scaling,以获得最终码率。