X264码率控制总结2——x264码率控制方法概述

来源:互联网 发布:单片机led流水灯程序 编辑:程序博客网 时间:2024/05/02 02:14
X264码率控制方法概述
x264/doc/ratecontrol.txt
A qualitative overview of x264's ratecontrol methods
By Loren Merritt

历史笔记:
本文件是过时的,但相当一部分叙述仍然是准确的,以下是一些重要的码率控制算法更新:
1. 默认情况下,MB-tree代替了qcomp用以计算各帧的复杂度,MB-tree是qcomp在宏块级的有效推广。MB-tree还替代了B帧QP固定偏移。
2. 现在自适应量化(Adaptive quantization)被用来在各帧之间分配质量(distribute quality);即使关闭MB-tree,帧内各MB也不再是恒定QP。
3. 为了提高码率控制精度,VBV(Video Buffer Verifier)运行在每行而不是每帧。


x264的码率控制算法主要是基于libavcodec中的经验算法。但仍基于以下一些理论点:
1.我们常常希望能够获得恒定质量(constant quality)的视频序列,但是恒定质量并不意味着恒定的PSNR或者恒定的QP。对于人眼不敏感的高细节复杂度或者高运动场景,可以增加QP而不会损失太多的视觉质量;
2.另一方面,将稍多一些的比特分配给影响运动补偿效果的场景更能提升视频序列质量;(MBtree就是基于这一条来做的)
3. 上面两点都与给定QP时编码一帧图像使用的比特数相关。
4. 根据一个QP值编码一帧的输出比特,可以预测其他QP值编码相同帧的输出比特,当然QP值相差越大,预测的越不准确。
5. 帧的重要性取决于参考这帧的其他帧的数目,由于I帧是其后P/B帧的参考基础,它需要更低的QP值,以保证它的质量。I帧>P帧>做参考B帧>非参考B帧。


x264码率控制的框架主要是三步,不同的码率控制方法,这三步的内容不同,但步骤一样:
1、根据复杂度在可控的范围内分配qp:二次编码是在第一遍编码的结果上在全局分配,ABR是基于mbtree分配
2、根据模式特性缩放qp:考虑输出码率,VBV等因素,
3、码率溢出控制

码率控制方法:
    二次编码:
基于第一次编码得到的各帧数据,我们可以在保证文件总字节数的情况下,选择QP来尽可能的提升视觉质量,这可分为3步:
(1)在开始第二次编码前,选择帧间比特分配相关数。缺省的公式是“复杂性^0.6”,其中的复杂性是指在一个恒定QP下帧编码输出比特数(基于第一次的编码结果预测而来)。
(2)在视频序列全局缩放步骤(1)中的结果,以满足总的编码输出文件大小要求。
(3)开始编码。编码一帧后,更新QP与帧输出比特数的预测误差。如果第二次编码输出比特数总是偏离第一次的预测(通常是因为第二次使用了较慢,但性能较好的编码设置),在其后所有帧的qscales上都乘以这个误差的倒数,用来纠正这种偏离。
此外还有一个短时补偿算法去防止视频开始阶段(此时没有多少数据做全局补偿)和结尾阶段(此时没有足够的帧数做反应)的结果偏离初始设置太远。


    一次编码,ABR:
一次编码的和二次编码的区别在于一次编码在编码当前帧的时候没有任何有关当前帧的可借鉴信息,只有前面已编码帧的信息。因此一次编码的复杂度是前向预测得到的。
(1)和二次编码类似,选择帧间比特分配相关数。但由于没有第一遍编码的结果做预测,x264运行一个1/2分辨率(lowres)的快速运算估计算法,使用SATD的结果来预测输出比特数。同时,I帧的相关数继承前面已编码I帧的结果。
(2)由于不知道将来帧的复杂度,所以只能根据前向帧做缩放。缩放因子(Scaling factor)的选择标准是,如果使用此因子到后续所有帧,总的输出比特数满足预先要求。
(3)溢出补偿和2次编码相同。通过调节补偿力度,可以满足合理的文件大小,但质量会低于二次编码。


    一次编码,CBR(VBV兼容):
(1)同ABR。
(2)缩放因子是基于局部平均(依赖VBV缓冲区大小)而不是所有前向帧。
(3)严格的溢出补偿,并在VBV快要满的时候有强制条件限制QP。注意:a.CBR的输出可能比所要求的比特数少一点;b.即使一帧违反了VBV的约束,它也不会被重新编码。


    一次编码, CRF:
(1) 同ABR.
(2) 缩放因子是一个常量,--crf。
(3) 无溢出补偿.

    CQP:
每帧QP只是简单的基于帧类型改变。 
1 0