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变换矩阵:


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就越大,量化步长也越大,生成的比特流越小,从而达到调整比特率的目的。

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:

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. 在不同码控下的测试结果

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容

  • FFmpeg X264编码参数 目录 码率控制 1 X264的preset和tune 2 编码延时建议...
    古则阅读 29,816评论 1 15
  • 相关 x264编码示例 源码分析 h264编码原理复杂,参数众多。为了方便使用无论x264还是其他编码的实现框架,...
    Don_阅读 2,179评论 0 1
  • 相关 ffmpeg编码示例x264编码示例 概念 h264编码算法复杂、参数众多,单码率控制又分为三种模式。 VB...
    Don_阅读 10,046评论 0 6
  • [TOC] 音视频&流媒体 是什么促使我要写这一篇音视频入门文章?那是因为和一妹子打赌码率的概念,结果输了;对一个...
    AllenWu阅读 4,810评论 1 25
  • 这是二月的尖尖而上,接连的几场大雪把天地刮扫的干干净净,不止地上的大树都各自利利落落,连湛蓝的天空也没有一丝儿云,...
    自度散人阅读 288评论 0 0