首页 > 其他 > 详细

h.264码率控制

时间:2014-03-11 15:34:58      阅读:464      评论:0      收藏:0      [点我收藏+]

      h.264的码流传输是基于目前有限的网络带宽来进行的,以目前的压缩效率来说,运动不算剧烈、细节不多的影像,在720p的情况下,1000kbps压缩损耗较少(psnr较大),能达到比较好的观赏效果,1080p则需要2000kbps。

      当然,随着图像运动剧烈程度加大,细节增多的情况,则需要更大的bps来保证图像效果。

      另外由于图像序列中,并非所有的图像都有相同的细节,因此应该在细节多的图像上分配更多的bit,而细节少的图像则分配更少的bit。

      同一道理,在一张图像上,可能某些位置的细节较多,那就应该在那里分配跟多的bit,否则分配更少的bit。

 

      h.264的编码码率控制就是考虑到以上的这些情况,制定了码率控制标准。以下以JVT-H017r3为例,分析h.264码率控制模块。

 

      如前面所说,h.264码率控制可以分为三个过程:

      1.GOP级码率控制

      2.Picture级码率控制

      3.basic unit级码率控制

 

GOP级的码率控制

      h.264的码流控制是建立在存在虚拟参考解码器的基础上的,即希望通过码率控制做到:编码端编码出来的码流,在经过设定好的bps传输后,解码端解码播放时是同步的(不延迟),下面的outflow可以看做是传输到解码端。

bubuko.com,布布扣

      可以通过上图加以理解,途中为某个GOP在某一时刻的编码状态,Not coded 为未编码图像,coded为已编码图像,图像编码后会以Bit Stream(码流)的形式输出到Virtual Buffer中,这里的Virtual Buffer 并不一定实际存在于实际编码器中,而是算法虚拟出来的缓存区,主要是维护码流的输入与输出,在缓冲区中的码流会以某一速率进行输出(outflow)。

 

对于Virtual Buffer的大小,是可计算的

bubuko.com,布布扣

i表示第i个GOP,j表示第i个GOP的第j幅图像,

如果是视频序列的第一帧,那么以编码数为0,缓存区大小肯定为0,

如果是其他GOP的第一帧,那么缓存区大小则为上一个GOP剩下来的大小。

在其他情况下,缓存区大小为上一帧的缓存区大小加上上一帧编码后码流大小,减去码流流出的大小。

 

对于当前GOP未编码的图像的bit大小,是未知的,因此需要进行预测

bubuko.com,布布扣

      在设定初始值的时候,-Vi(j),这么做其实是为了清空缓存区,

      B + V = R/f * N,设定左右两边相等,也就是说希望在码流流出为N帧的时间里,能把当前GOP中所有的bit以及原本Virtual Buffer中存放的bit一同清空,减少接受端的延迟。

      在其他情况下,预测值B收到上一帧的预测值影像,也收到带宽的变化影响,最后当然要减去上一帧编码所用的bit数。

      在码率没有变化的情况下,会被简化成:

bubuko.com,布布扣

 

      对于一个GOP,首当其冲是要设定好它第一帧(I、IDR)的QP,

      如果是视频序列的第一帧,也就是第一个GOP的第一帧:

bubuko.com,布布扣  

bubuko.com,布布扣

      Nptxel是一张图像的像素点个数,

      对于QCIF/CIF,有 l1=0.15, l2=0.45, l3=0.9  

      对于大于CIF的图像,l1=0.6, l2=1.4, l3=2.4

 

      而对于其他GOP,有

bubuko.com,布布扣

      平滑处理:

bubuko.com,布布扣

 

Picture级码率控制

      对于B帧,都是以B帧两端的参考帧的QP来计算当前B帧QP值。分两种情况,假设两个参考帧间的B帧数为L。

      当L = 1

bubuko.com,布布扣

      当L > 1

bubuko.com,布布扣

bubuko.com,布布扣

 

      对于P帧,需要引入一个新的概念,目标缓存级别(target buffer level)。

      这个级别用来修正待编码图像对清空缓存区的贡献,基本思想是清空缓存区的工作应该更多由非参考图像来承担,由于B帧的QP普遍会比两端的P帧大,也就是相对来说会占用更小的缓存区域,那么P帧就可以降低QP来提高图像编码质量,那么P帧编码为码流后占用的缓存区会更大。

      target buffer level 代表的就是P帧在缓存区的占用情况,当有B帧时的target buffer level 会比没有B帧时的大。

      计算方式如下:

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

      Wp是P帧的权重,Wb是B帧的权重。

      当没有B帧时,可以简化为:

bubuko.com,布布扣

      这表明target buffer level会越来越小,在当前GOP末尾会趋向于0。

 

      最后结合Virtual buffer,Remain bit,target buffer level三者求出当前P帧的目标bit。

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

      当然还有上下界判断(略)。

 

      得到目标bit后就可以求当前P帧的量化步长(求解下面一元二次方程),然后通过量化步长得到量化参数。

bubuko.com,布布扣

bubuko.com,布布扣

      其中,bubuko.com,布布扣为上一P帧的复杂度,bubuko.com,布布扣为当前P帧复杂度的预测值,bubuko.com,布布扣则是当前P帧的运动向量以及头部大小。

      最后也少不了对比上一P帧进行平滑QP的处理(略)。

 

basic unit级码率控制

      这个其实跟Picture级的码流控制差不多,只是把Picture分开了成basic unit然后再一一计算,对当前basic unit进行码率控制、编码,然后轮到下一个basic unit。。。

      首先需要求当前basic unit的目标bit数。

bubuko.com,布布扣

      其中bubuko.com,布布扣为当前basic unit复杂度的预测值,该预测值是通过上一P帧的对应basic unit位置来进行预测的,预测方法同上方Picture级,采用线性预测,Tr则是用当前帧的目标bit数Ti(j)。

      第二步要预测当前P帧的basic unit平均的头部大小(包括mv等)。

bubuko.com,布布扣

      其中,bubuko.com,布布扣是当前basic unit已经产生的header bit数,bubuko.com,布布扣是上一个P帧的basic unit的header bit的平均值。

      然后用目标bit减去header bit得到预测的纹理bit数。

bubuko.com,布布扣

      最后就是求量化参数了,这个跟上面Picture级的一样,只是把复杂度换成了以basic unit为单位。

      还有就是平滑(略)。

h.264码率控制,布布扣,bubuko.com

h.264码率控制

原文:http://www.cnblogs.com/TaigaCon/p/3593036.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!