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

转载 2016年05月31日 14:22:19
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只是简单的基于帧类型改变。 

X264码率控制总结1——ABR,CQP,CRF

1. X264显式支持的一趟码率控制方法有:     ABR, CQP, CRF. 缺省方法是CRF     这三种方式的优先级是ABR > CQP > CRF.     if(bitrate) rc...

X264码率控制总结1——ABR,CQP,CRF

1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF. [cpp] view plaincopyif ( b...

X264码率控制总结1——ABR,CQP,CRF

1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF. [cpp] view plain copy if (...

X264码率控制总结1——ABR,CQP,CRF

1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF。这三种方式的优先级是ABR > CQP > CRF. [cpp] view plaincopyif ( b...

x264码率控制概述(2009年8月)

A qualitative overview of x264's ratecontrol methods By Loren Merritt x264码率控制概述(2009年8月) x26...

x264编码指南——码率控制

,使用一个比普通预设稍慢的预设,这样可以得到比默认设置稍好一点的视频质量。 ffmpeg -i input -c:v libx264 -preset slow -crf 22-c:a copy ...
  • zhubosa
  • zhubosa
  • 2016年05月05日 12:09
  • 559

x264源码分析与应用示例(二)——码率控制

1、x264的码率控制原理与对应源码解析 基本概念 对于此前了解过H.264的码率控制原理的读者(如果不了解,也可以去看我的文章H.264码率控制算法研究及JM相应代码分析),首先需要说明...

x264源码分析与应用示例(三)——浅谈码率控制的优化问题

本文包含以下内容,由于这部分内容比较复杂,这么多年也都是大家研究的重点,我这里只做一个简单的介绍。 1、如何简单的通过修改命令行参数来优化码率控制的结果 2、如何从算法角度通过修改源码来优...

x264源码分析与应用示例(三)——浅谈码率控制的优化问题

打算写几篇文章记录一下学习x264源码的成果,主要包含两个方面的内容,一是基本的x264视频编码流程,二是x264中的码率控制,之前分析过JM和HM的码率控制,但是x264的码率控制一直没看,这回也算...

x264源码分析与应用示例(二)——码率控制

打算写几篇文章记录一下学习x264源码的成果,主要包含两个方面的内容,一是基本的x264视频编码流程,二是x264中的码率控制,之前分析过JM和HM的码率控制,但是x264的码率控制一直没看,这回也算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:X264码率控制总结2——x264码率控制方法概述
举报原因:
原因补充:

(最多只允许输入30个字)