随着HDTV的兴起,H.264这个规范频频出现在我们眼前,HD-DVD和蓝光均计划采用这一标准进行节目制作。而且自2005年下半年以来,无论是NVIDIA还是ATI都把支持H.264硬件解码加速作为自己值得夸耀的视频技术。H.264到底是何方"神圣"呢?
H.264是一种高性能的视频编解码技术。目前国际上制定视频编解码技术的组织有两个,一个是"国际电联(ITU-T)",它制定的标准有H.261、H.263、H.263+等,另一个是"国际标准化组织(ISO)"它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4视频编码(Advanced Video Coding,AVC),而且它将成为MPEG-4标准的第10部分。因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264.
H.264的优势是具有很高的数据压缩比率,在同等图像质量的条件下,H.264的压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。举个例子,原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为879MB,从88GB到879MB,H.264的压缩比达到惊人的102∶1!H.264为什么有那么高的压缩比?低码率(Low Bit Rate)起了重要的作用,和MPEG-2和MPEG-4 ASP等压缩技术相比,H.264压缩技术将大大节省用户的时间和数据流量收费。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像,正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。
1 JVT-H017码率控制算法
JVT-H017码率控制策略包含3个层次:GOP层、帧层和基本单元层。其中基本单元层指的是同一帧中一组连续的宏块,每个基本单元层至少包含一个宏块。
1.1 GOP层码率控制
GOP(Group of Pictures)策略影响编码质量:所谓GOP,意思是画面组,一个GOP就是一组连续的画面。MPEG编码将画面(即帧)分为I、P、B三种,I是内部编码帧,P是前向预测帧,B是双向内插帧。简单地讲,I帧是一个完整的画面,而P帧和B帧记录的是相对于I帧的变化。没有I帧,P帧和B帧就无法解码,这就是MPEG格式难以剪辑的原因,也是我们之所以要微调头和尾的原因。
GOP层码率控制主要任务是计算当前GOP 中剩余图像帧的比特数,初始化即时解码刷新(IDR)和个存储帧的量化参数。当第i个GOP的第j帧被编码时,当前GOP中剩余帧的比特数计算如下:
1.2 帧层码率控制
帧层的码率控制包括编码前和编码后两个阶段。
1.2.1 编码前阶段
编码阶段是计算每一帧的量化参数。对于存储帧和非存储帧,方法是不一样的。本文介绍的是只有存储帧的情况。这一过程分两个步骤完成:
(1)确定每个帧的目标码率
①确定当前GOP中每个存储帧的目标码率
每一个存储帧的目标缓冲由个IDR或存储帧的编码比特和平均复杂度得到。在编码完第i个GOP的第1个存储帧后,目标缓冲的初始值为:
(2)计算量化参数和执行率失真优化(RDO)
首先采用式(9)计算与目标比特关联的量化步长,相应的量化参数QPi(j)由量化步长和视频编码(AVC)的量化参数计算得到:
1.2.2 编码后阶段
编码一帧以后,系数a1、a2及c1、c2采用类似MPEG-4 Q2部分的线性回归模型进行更新。在此过程中,实际编码产生的比特加入到缓存中。为保证更新后的缓存占用率不要过高,采用类似MPEG-4 Q2部分的跳帧策略进行调整。
1.3 基本单元码率控制
基本单元码率控制和帧层码率控制的方法类似,为每个基本单元预测MAD,计算目标比特,用二次R-D 模型计算基本单元层的QP时需考虑:(1)对当前帧的个基本单元,QP需设为前一帧所有基本单元量化参数的平均值;(2)当前帧中还有未编码的基本单元,而分配给它们的剩余比特数却小于零。这时,当前基本单元的QP应相应地增大;(3)其他情况下,通过二次R-D模型来获得QP.
2 改进的跳帧算法
在实际的编码中,如果每个GOP都超过了预先分配给它的比特数,这时缓冲就会溢出,从而导致跳帧现象,使得图像的质量下降[4].JVT-H017码率控制算法采用的跳帧方法仍是MPEG-4 Q2中的简单方法,即只是简单地设置缓存区占有度上限达到80%时,就执行跳帧。(同样在以往的跳帧控制算法中[5],一般都只是将缓存的上限定为80%来作为跳帧的依据,当缓存容量超过80%时,将此帧定为跳帧)。相反,当缓存容量低于25%时,也将此帧定为跳帧,但是这样处理没有充分考虑到简单的跳帧会影响运动剧烈的图像的细节表现,导致图像质量严重下降。于是参考文献[6]根据高运动复杂度对应高比特数、低运动复杂度对应低比特数这一比特分配法则,利用过滤掉运动平稳的帧而保存运动剧烈的帧,并为运动剧烈的帧分配更多缓存空间的思想,提出了用前一帧预测得到的比特数与前面已编码帧的实际比特数的平均值的比值作为衡量跳帧的标准。但参考文献[5]并未考虑到出现比特数较多和比特数较少的帧交错的帧序列这一情况。若前一帧比特数较少,当前帧比特数较多,则得到的比值偏小;反之,得到的比值偏大。可见用此方法作为跳帧的判断方法,准确率并不高。所以本文算法从图像复杂度算法本身入手,并考虑到相邻帧之间具有很强的相关性,重新定义一个跳帧判别方法,力求得到的跳帧判别方法能较准确地优化图像质量。
为了更好地适应AVS编码器的实时应用,减少B帧延时带来的影响,本文只考虑有I帧、P帧的图像格式。由于I帧编码需要较多的比特数,它将占据多个帧间间隔传输,因此,本文为了减小缓冲延时,紧邻I帧的前两个P帧仍按原算法进行跳帧。即从第3个P帧开始定义当前P帧的运动复杂度因子ci:
3 实验结果与分析
为了对算法进行分析,在JM8.6上对本跳帧算法进行仿真。实验中分别使用QCIF序列foreman和CIF序列mobile,共编码100帧,GOP的结构是 IPPP…IPPP…,帧内编码刷新周期为20帧,帧的量化步长为28,a= 0.6,b=0.8,w1=60%,w2=70%,a1=3/2,a2=1/2.在JM8.6现有的码率控制算法的基础上,分别对跳帧策略与参考文献[2]和参考文献[5]中的跳帧策略进行测试,截取其中的20~40帧进行显示。比较3种算法的PSNR.在相同的条件下,本文提出的跳帧算法相对其他两个跳帧算法有所改进,更加准确地做到了跳过平稳运动的图像,保留运动剧烈的图像这准则。从表1、表2可以看出,本文提出的跳帧算法,使信噪比有所提高,优化了图像的质量。
本文针对JVT-H017码率控制算法中跳帧策略仍然采用类似MPEG-4 Q2的简单方法这一缺点,提出的跳帧算法合理地利用了图像运动复杂度这一尺度来作为判别标准,与参考文献[2]的(JVT-H017)相比,使得图像信噪比有所提升,优化了图像质量。但是,本算法并没有考虑到出现场景切换和B帧存在的图像序列的跳帧问题,所以将来的工作将是在此算法的基础上,提出一种更好的优化算法,使其能提高不同图像序列的图像质量。
[1]. H.261 datasheet https://www.dzsc.com/datasheet/H.261_2060787.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。