一、H.264的制定过程和应用场合
在制订完最初的H.263标准之后,ITU-T的视频编码专家组(VCEG)将开发工作分为两部分:一部分称之为“短期(short-term)”计划,目的是给H.263增加一些新的特性(这一计划开发出了H.263+和H.263++);另一部分被称为“长期(long-term)”计划,其最初的目标就是要制定出一个比当时其他的视频编码标准效率提高一倍的新标准。这一计划在1997年开始,其成果就是作为H.264前身的H.26L(起初叫H.263L)。在将近2001年底,由于H.26L优越的性能,ISO/IEC的MPEG专家组加入到VCEG中来,共同成立了联合视频小组(JVT),接管了H.26L的开发工作。这个组织的目标是:“研究新的视频编码算法,其目标是在性能上要比以往制定的最好的标准提高很多。”
这一标准正式成为国际标准是2003年3月在泰国Pattaya举行的JVT第7次会议上通过的。由于该标准是由两个不同的组织共同制定的,因此有两个不同的名称:在ITU-T中,它的名字叫H.264;而在ISO/IEC中,它被称为MPEG-4的第10部分,即高级视频编码(AVC)。
H.264的应用场合相当广泛,包括可视电话(固定或移动)、实时视频会议系统、视频监控系统、因特网视频传输以及多媒体信息存储等。
目前在国际上,加拿大的UB Video公司开发出了一套基于TMS320C64x系列的H.26L实时视频通信系统,它可以在160kbit/s的码率下获得与H.263+在320kbit/s下相同的图像质量。另一家加拿大的公司VideoLocus通过在系统中插入一块基于FPGA的硬件扩展卡,在P4平台上实现了H.264的实时编解码。
二、 H.264的特点
H.264在编码框架上还是沿用以往的MC-DCT结构,即运动补偿加变换编码的混合(hybrid)结构,因此它保留了一些先前标准的特点,如不受限制的运动矢量(unrestricted motion vectors),对运动矢量的中值预测(median prediction)等。然而,以下介绍的技术使得H.264比之前的视频编码标准在性能上有了很大的提高。应当指出的是,这个提高不是单靠某一项技术实现的,而是由各种不同技术带来的小的性能改进而共同产生的。
1. 帧内预测
对I帧的编码是通过利用空间相关性而非时间相关性实现的。以前的标准只利用了一个宏块(macroblock)内部的相关性,而忽视了宏块之间的相关性,所以一般编码后的数据量较大。为了能进一步利用空间相关性,H.264引入了帧内预测以提高压缩效率。简单地说,帧内预测编码就是用周围邻近的像素值来预测当前的像素值,然后对预测误差进行编码。这种预测是基于块的,对于亮度分量(1uma),块的大小可以在16×16和4×4之间选择,16×16块有4种预测模式,4×4块有9种预测模式;对于色度分量(chroma),预测是对整个8×8块进行的,有4种预测模式。除了DC预测外,其他每种预测模式对应不同方向上的预测。
2. 帧间预测
与以往的标准一样,H.264使用运动估计和运动补偿来消除时间冗余,但是它具有以下五个不同的特点:
(1)预测时所用块的大小可变
由于基于块的运动模型假设块内的所有像素都做了相同的平移,在运动比较剧烈或者运动物体的边缘处这一假设会与实际出入较大,从而导致较大的预测误差,这时减小块的大小可以使假设在小的块中依然成立。另外小的块所造成的块效应相对也小,所以一般来说小的块可以提高预测的效果。
为此,H.264一共采用了7种方式对一个宏块进行分割,每种方式下块的大小和形状都不相同,这就使编码器可以根据图像的内容选择最好的预测模式。
与仅使用16×16块进行预测相比,使用不同大小和形状的块可以使码率节省15%以上。
(2)更精细的预测精度
在H.264中,Luma分量的运动矢量(MV)使用1/4像素精度。Chroma分量的MV由luma MV导出,由于chroma分辨率是luma的一半(对4:2:0),所以其MV精度将为1/8,这也就是说1个单位的chroma MV所代表的位移仅为chroma分量取样点间距离的1/8。如此精细的预测精度较之整数精度可以使码率节省超过20%。
(3)多参考帧
H.264支持多参考帧预测(multiple reference frames),即可以有多于一个(最多5个)的在当前帧之前解码的帧可以作为参考帧产生对当前帧的预测(motion-compensated prediction)。这适用于视频序列中含有周期性运动的情况。采用这一技术,可以改善运动估计(ME)的性能,提高H.264解码器的错误恢复能力,但同时也增加了缓存的容量以及编解码器的复杂性。不过,H.264的提出是基于半导体技术的飞速发展,因此这两个负担在不久的将来会变得微不足道。较之只使用一个参考帧,使用5个参考帧可以节省码率5~10%。
(4)抗块效应滤波器
抗块效应滤波器(Deblocking Filter),它的作用是消除经反量化和反变换后重建图像中由于预测误差产生的块效应,即块边缘处的像素值跳变,从而一来改善图像的主观质量,二来减少预测误差。H.264中的Deblocking Filter还能够根据图像内容做出判断,只对由于块效应产生的像素值跳变进行平滑,而对图像中物体边缘处的像素值不连续给予保留,以免造成边缘模糊。与以往的Deblocking Filter不同的是,经过滤波后的图像将根据需要放在缓存中用于帧间预测,而不是仅仅在输出重建图像时用来改善主观质量,也就是说该滤波器位于解码环中而非解码环的输出外,因而它又称作Loop Filter。需要注意的是,对于帧内预测,使用的是未经过滤波的重建图像。
3.整数变换
H.264对帧内或帧间预测的残差(residual)进行DCT变换编码。为了克服浮点运算带来的硬件设计复杂,更重要的是舍入误差造成的编码器和解码器之间不匹配(mismatch)的问题,新标准对DCT的定义做了修改,使得变换仅用整数加减法和移位操作即可实现,这样在不考虑量化影响的情况下,解码端的输出可以准确地恢复编码端的输入。当然这样做的代价是压缩性能的略微下降。此外,该变换是针对4×4块进行的,这也有助于减少块效应。
为了进一步利用图像的空间相关性,在对chroma的预测残差和16×16帧内预测的预测残差进行上述整数DCT变换之后,标准还将每个4×4变换系数块中的DC系数组成2×2或4×4大小的块,进一步做哈达玛(Hadamard)变换。
4.熵编码
如果是Slice层预测残差,H.264有两种熵编码的方式:基于上下文的自适应变长码(Context-based Adaptive Variable Length Coding,CAVLC)和基于上下文的自适应二进制算术编码(Context-based Adaptive Binary Arithmetic Coding,CABAC);如果不是预测残差,H.264采用Exp-Golomb码或CABAC编码,视编码器的设置而定。
(1)CAVLC
VLC的基本思想就是对出现频率大的符号使用较短的码字,而出现频率小的符号采用较长的码字。这样可以使得平均码长最小。
在CAVLC中,H.264采用若干VLC码表,不同的码表对应不同的概率模型。编码器能够根据上下文,如周围块的非零系数或系数的绝对值大小,在这些码表中自动地选择,最大可能地与当前数据的概率模型匹配,从而实现了上下文自适应的功能。
(2)CABAC
算术编码是一种高效的熵编码方案,其每个符号所对应的码长被认为是分数。由于对每一个符号的编码都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号的概率特性,因而它能够更大程度地逼近信源的极限熵 ,降低码率。
为了绕开算术编码中无限精度小数的表示问题以及对信源符号概率进行估计,现代的算术编码多以有限状态机的方式实现,H.264的CABAC便是一个例子,其他的例子还有JPEG2000。在CABAC中,每编码一个二进制符号,编码器就会自动调整对信源概率模型(用一个“状态”来表示)的估计,随后的二进制符号就在这个更新了的概率模型基础上进行编码。这样的编码器不需要信源统计特性的先验知识,而是在编码过程中自适应地估计。显然,与CAVLC编码中预先设定好若干概率模型的方法比较起来,CABAC有更大的灵活性,可以获得更好的编码性能——大约10%码率的降低。
以上介绍的特点都是用来提高H.264的编码性能的,此外H.264还具有很好的错误恢复能力(error resilience)和网络适应性(network adaptability),下面介绍其中的一些特点。
5. SP Slice
SP Slice的主要目的是用于不同码流的切换(switch),此外也可用于码流的随机访问、快进快退和错误恢复。这里所说的不同码流是指在不同比特率限制下对同一信源进行编码所产生的码流。设切换前传输码流中的最后一帧为Al,切换后的目标码流第一帧为B2(假设是P帧),由于B2的参考帧不存在,所以直接切换显然会导致很大的失真,而且这种失真会向后传递。一种简单的解决方法就是传输帧内编码的B2,但是一般I帧的数据量很大,这种方法会造成传输码率的陡然增加。根据前面的假设,由于是对同一信源进行编码,尽管比特率不同,但切换前后的两帧必然有很多相关性,所以编码器可以将Al作为B2的参考帧,对B2进行帧间预测,预测误差就是SP Slice,然后通过传递SP Slice完成码流的切换。与常规P帧不同的是,生成SP Slice所进行的预测是在Al和B2的变换域中进行的。SP Slice要求切换后B2的图像应和直接传送目标码流时一样。显然,如果切换的目标是毫不相关的另一码流,SP Slice就不适用了。
6.灵活的宏块排序
灵活的宏块排序(flexible macroblock ordering,FMO),是指将一幅图像中的宏块分成几个组,分别独立编码,某一个组中的宏块不一定是在常规的扫描顺序下前后连续,而可能是随机地分散在图像中的各个不同位置。这样在传输时如果发生错误,某个组中的某些宏块不能正确解码时,解码器仍然可以根据图像的空间相关性依靠其周围正确译码的像素对其进行恢复。
三、H.264的具体内容
通过上面的介绍,毋庸置疑,H.264在压缩性能上要比其他标准优越,甚至包括MPEG-4(2)(MPEG-4第2部分)。众所周知,MPEG-4(2)最大的特点就是面向对象的编码,对象概念的提出是具有先进性的,在对象已经提取出来的条件下确实能够获得很高的压缩比,但是如何提取对象成为摆在人们面前的一大难题。一个真正的对象提取算法应该是像人一样具有智能,能够像人一样进行思维并且是能够学习的,而目前的技术根本达不到这点,虽然有大量的文献介绍对象提取的方法,但我认为这些只是权宜之计,充其量只是往正确的方向上迈出的一小步。正因为如此,MPEG-4(2)面向对象编码的思想过于超前。ITU-T的VCEG放弃了对象这一不现实的概念,与目前科学技术的发展水平相适应,提出了H.264(10)(MPEG-4第10部分)(H.26L)视频编码标准,这是难能可贵的,更重要的是它同样实现了MPEG-4(2)面向对象编码的目标之一——高压缩比。
视频信号的数据量是很大的,为了达到高效的压缩,必须充分利用各种冗余,一般来讲,视频序列里的冗余包括两类,一类是统计冗余,它包含:(1)频谱冗余,指色彩分量之间的相关性;(2)空间冗余;(3)时间冗余,这是视频压缩区别于静止图像压缩的根本点,视频压缩主要利用时间冗余来实现大的压缩比。第二类是视觉生理冗余,这是由于人类的视觉系统(HVS)特性造成的,比如人眼对色彩分量的高频分量没有对亮度分量的高频分量敏感,对图像高频(即细节)处的噪声不敏感等。
针对这些冗余,视频压缩算法采用了不同的方法加以利用,但主要的考虑集中在空间冗余和时间冗余上。与以前的标准类似,H.264也采用了所谓的混合(hybrid)结构,即对空间冗余和时间冗余分别进行处理。对空间冗余,标准通过变换及量化达到消除的目的,这样编码的帧叫做I帧;而时间冗余则是通过帧间预测,即运动估计和补偿来去除的,这样编码的帧叫做P帧或B帧。
与以前的标准不同的是,H.264在编码I帧时,采用了帧内预测,然后对预测误差进行编码。这样就充分利用了空间相关性,提高了编码效率。H.264的帧内编码框图(详图请参见《中国多媒体视讯》第七期)所示。 H.264帧内预测以16×16的宏块为基本单位。首先,编码器将与当前宏块同一帧的邻近像素作为参考,产生对当前宏块的预测值,然后对预测残差进行变换与量化,再对变换与量化后的结果做熵编码。熵编码的结果就可以形成码流了。由于在解码器端能够得到的参考数据都是经过反变换与反量化后的重建图像,所以为了使编解码一致,编码器端用于预测的参考数据就和解码器端一样,也是经过反变换与反量化后的重建图像。需要注意的一点是,用于帧内预测的这些参考数据不需要经过Deblocking Filter滤波,这与帧间编码的参考图像是不同的。
1、帧内预测
亮度Intra--16×16帧内预测模式如图(详图请参见《中国多媒体视讯》第七期)所示。
亮度Intra--16×16帧内预测模式
色差分量的8×8 4种帧内预测模式如图(详图请参见《中国多媒体视讯》第七期)所示。
色差分量的8×8 4种帧内预测模式
亮度分量的4×4 8种方向帧内预测模式。
图5亮度分量的4×4 8种方向帧内预测模式
2、 变换与量化
将图像的当前像素值与预测值相减,就形成了预测残差。残差内仍然含有空间冗余,为了消除这种冗余,通常采用变换编码,即变换——量化——熵编码三步。变换并不压缩数据,它只是消除数据中的相关性,或者说将数据中的冗余(或相关性)以一种便于随后进行熵编码的方式表现出来。压缩是在量化和熵编码步骤中完成的。此外为了进一步减少数据量,编码器还对变换后的系数进行量化,它的实质是减少数据的取值范围以减少每一个符号的熵。它会造成信息的损失,是有损编码的一个重要步骤,它也是控制图像率失真(R-D)特性的一个主要手段。在H.264中,变换与量化两个步骤紧密相连。
整数DCT正变换的公式
H.264的反DCT变换公式
图像编码中常用的变换是DCT,因为它在某种条件下近似于理论上最优的K-L变换。但是如果直接采用DCT的定义进行变换,会带来两个问题:一个是需要进行浮点数操作,从而造成系统设计上的复杂性;第二,由于变换核都是无理数,而有限精度的浮点数不可能精确地表示无理数,再加上浮点数的运算可能会引入舍入误差,这就使得在具体实现时会导致编解码的不一致(mismatch),即反变换的输出结果和正变换的输入不一样。为了克服这些问题,H.264采用整数DCT变换,使得变换操作仅用整数加减和移位操作就可以完成,这样既降低了设计复杂度,又避免了编解码mismatch,而由此带来的编码性能的减少微乎其微。需要注意的是,此时的变换已经不是真正的DCT,仍然称其为DCT变换只是为了说明它是由DCT推导而来,且为了和另一个变换(Hadamard变换)相区别罢了。
H.264编码器的变换与量化过程见七期杂志。图中输入为预测残差,输出为准备进行熵编码的数据,一共有五类。为了更大程度地利用空间冗余,对于Intra 16×16帧内预测模式,H.264在对16×16的hma分量的16个4×4块进行DCT变换后,将每个4×4块的DC系数(还没有经过量化)提取出来,组成一个4×4的luma DC块,对其再进行4×4的哈达玛(Hadamard)变换。同样,对8×8 chroma分量的4个4×4块进行DCT变换后,也将每个4×4块的DC系数提取出来,组成一个2×2的chroma DC块,对其进行2×2的Hadamard变换,如图7所示。图中的数字显示的是所代表的块在码流中的顺序。对亮度分量直流系数的附加的(4×4)4阶Hadamard变换 对色度分量直流系数进行附加的(2×2)2阶Hadamard变换 DC系数的处理如图(详图请参见《中国多媒体视讯》第七期)所示。
图中的输入是经过解码(CAVLC或CABAC)后的结果,输出的数据加上预测值后成为重建图像,重建图像用于帧内预测,或经过Deblocking Filter后显示并根据需要存放于缓存中,用于帧间预测。这里有一个地方需要注意,对于DC系数(无论是Intra 16×16 luma DC还是chroma DC),解码器是先反变换再反量化,这样做的原因在后面的内容中将做解释。MUX是指将DC系数按图8装配到AC系数中,形成完整的4×4块,用于后续的反DCT变换。
目前H.264的主要不足就是复杂度大,但随着技术的不断进步,特别是半导体技术的发展,芯片的处理能力和存储器的容量都将会有很大的提高,所以今后H.264必然焕发出蓬勃的生命力,逐渐成为市场的主角。