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可以看做是传输到解码端。
可以通过上图加以理解,途中为某个GOP在某一时刻的编码状态,Not coded 为未编码图像,coded为已编码图像,图像编码后会以Bit Stream(码流)的形式输出到Virtual Buffer中,这里的Virtual Buffer 并不一定实际存在于实际编码器中,而是算法虚拟出来的缓存区,主要是维护码流的输入与输出,在缓冲区中的码流会以某一速率进行输出(outflow)。
对于Virtual Buffer的大小,是可计算的
i表示第i个GOP,j表示第i个GOP的第j幅图像,
如果是视频序列的第一帧,那么以编码数为0,缓存区大小肯定为0,
如果是其他GOP的第一帧,那么缓存区大小则为上一个GOP剩下来的大小。
在其他情况下,缓存区大小为上一帧的缓存区大小加上上一帧编码后码流大小,减去码流流出的大小。
对于当前GOP未编码的图像的bit大小,是未知的,因此需要进行预测
在设定初始值的时候,-Vi(j),这么做其实是为了清空缓存区,
B + V = R/f * N,设定左右两边相等,也就是说希望在码流流出为N帧的时间里,能把当前GOP中所有的bit以及原本Virtual Buffer中存放的bit一同清空,减少接受端的延迟。
在其他情况下,预测值B收到上一帧的预测值影像,也收到带宽的变化影响,最后当然要减去上一帧编码所用的bit数。
在码率没有变化的情况下,会被简化成:
对于一个GOP,首当其冲是要设定好它第一帧(I、IDR)的QP,
如果是视频序列的第一帧,也就是第一个GOP的第一帧:
Nptxel是一张图像的像素点个数,
对于QCIF/CIF,有 l1=0.15, l2=0.45, l3=0.9
对于大于CIF的图像,l1=0.6, l2=1.4, l3=2.4
而对于其他GOP,有
平滑处理:
Picture级码率控制
对于B帧,都是以B帧两端的参考帧的QP来计算当前B帧QP值。分两种情况,假设两个参考帧间的B帧数为L。
当L = 1
当L > 1
对于P帧,需要引入一个新的概念,目标缓存级别(target buffer level)。
这个级别用来修正待编码图像对清空缓存区的贡献,基本思想是清空缓存区的工作应该更多由非参考图像来承担,由于B帧的QP普遍会比两端的P帧大,也就是相对来说会占用更小的缓存区域,那么P帧就可以降低QP来提高图像编码质量,那么P帧编码为码流后占用的缓存区会更大。
target buffer level 代表的就是P帧在缓存区的占用情况,当有B帧时的target buffer level 会比没有B帧时的大。
计算方式如下:
Wp是P帧的权重,Wb是B帧的权重。
当没有B帧时,可以简化为:
这表明target buffer level会越来越小,在当前GOP末尾会趋向于0。
最后结合Virtual buffer,Remain bit,target buffer level三者求出当前P帧的目标bit。
当然还有上下界判断(略)。
得到目标bit后就可以求当前P帧的量化步长(求解下面一元二次方程),然后通过量化步长得到量化参数。
其中,为上一P帧的复杂度,
为当前P帧复杂度的预测值,
则是当前P帧的运动向量以及头部大小。
最后也少不了对比上一P帧进行平滑QP的处理(略)。
basic unit级码率控制
这个其实跟Picture级的码流控制差不多,只是把Picture分开了成basic unit然后再一一计算,对当前basic unit进行码率控制、编码,然后轮到下一个basic unit。。。
首先需要求当前basic unit的目标bit数。
其中为当前basic
unit复杂度的预测值,该预测值是通过上一P帧的对应basic
unit位置来进行预测的,预测方法同上方Picture级,采用线性预测,Tr则是用当前帧的目标bit数Ti(j)。
第二步要预测当前P帧的basic unit平均的头部大小(包括mv等)。
其中,是当前basic
unit已经产生的header bit数,
是上一个P帧的basic
unit的header bit的平均值。
然后用目标bit减去header bit得到预测的纹理bit数。
最后就是求量化参数了,这个跟上面Picture级的一样,只是把复杂度换成了以basic unit为单位。
还有就是平滑(略)。
原文:http://www.cnblogs.com/TaigaCon/p/3593036.html