6. H.264/AVC编码器原理
1. H.264/AVC的应用
H.264 不仅具有优异的压缩性能,而且具有良好的网络亲和性,这对实时的视频通信是十分重要的。和 MPEG-4 中的重点是灵活性不同,H.264 着重在压缩的高效率和传输的高可靠性,因而其应用面十分广泛。H.264 支持三个不同档次:
- 基本档次:主要用于“视频会话”,如会议电视,可视电话,远程医疗、远程教学等;
- 扩展档次:主要用于网络的视频流,如视频点播;
- 主要档次:主要用于消费电子应用,如数字电视广播,数字视频存储等。
2. H.264/AVC编解码器
H.264 并不明确地规定一个编解码器如何实现,而是规定了一个编了码的视频比特流的句法,和该比特流的解码方法, 各个厂商的编码器和解码器在此框架下应能够互通,在实现上具有较大灵活性,而且有利于相互竞争。
H.264 和基于以前的标准(如 H.261、 H.263、 MPEG-1、 MPEG-4)中的编解码器功能块的组成并没有什么区别,主要的不同在于各功能块的细节。视频内容的多变和信道的多变带来了自适应压缩技术的复杂性,H.264 就是利用实现的复杂性获得压缩性能的明显改善。
2.1.编码器
编码器采用的仍是变换和预测的混合编码法 。H.264 编码器的功能组成如下图所示
输入的帧或场 Fn 以宏块为单位被编码器处理。首先,按帧内或帧间预测编码的方法进行处理。如果采用帧内预测编码,其预测值 PRED(图中用 P 表示)是由当前片中前面已编码的参考图像经运动补偿(MC)后得出,其中参考图像用 F’n-1 表示。为了提高预测精度,从而提高压缩比,实际的参考图像可在过去或未来(指显示次序上)已编码解码重建和滤波的帧中进行选择。预测值 PRED 和当前块相减后,产生一个残差块 Dn,经块变换、量化后产生一组量化后的变换系数 X,再经熵编码,与解码所需的一些边信息(如预测模式量化参数、运动矢量等)一起组成一个压缩后的码流,经 NAL(网络自适应层)供传输和存储用。
为了提供进一步预测用的参考图像,编码器必须有重建图像的功能。因此必须使残差图像经反量化、反变换后得到的 Dn’与预测值 P 相加,得到 uFn’(未经滤波的帧)。为了去除编码解码环路中产生的噪声,为了提高参考帧的图像质量,从而提高压缩图像性能,设置了一个环路滤波器,滤波后的输出 Fn’即重建图像可用作参考图像。
2.2.解码器
H.264解码器的功能组成如下图所示
由编码器的 NAL 输出一个压缩后的 H.264 压缩比特流。经熵解码得到量化后的一组变换系数 X,再经反量化、反变换,得到残差 Dn’。利用从该比特流中解码出的头信息,解码器就产生一个预测块 PRED,它和编码器中的原始 PRED 是相同的。当该解码器产生的 PRED与残差 Dn’相加后,就产生 uFu’,再经滤波后,最后就得到滤波后的 Fn’,这个 Fn’就是最后的解码输出图像。
3. H.264/AVC的结构
3.1.术语
1.场和帧
视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行之间的空间相关性较强,而帧内邻近行空间相关性强,因此活动量较小或静止的图像宜采用帧编码方式,对活动量较大的运动图像则宜采用场编码方式。
2.宏块、片
一个编码图像通常划分成若干宏块组成,一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb和一个 8×8 Cr 彩色像素块组成。每个图象中,若干宏块被排列成片的形式。
I 片只包含 I 宏块, P 片可包含 P 和 I 宏块,而 B 片可包含 B 和 I 宏块。
I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。
P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、 16×8、 8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8、 8×4、 4×8 或 4×4 亮度像素块(以及附带的彩色像素)。
B 宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测。
3.2.档次和级
H.264 规定了三种档次,每个档次支持一组特定的编码功能如下图所示,并支持一类特定的应用。每一档次设置不同参数(如取样速率、图像尺寸、编码比特率等),得到编解码器性能不同的级。
- 基本档次:利用 I 片和 P 片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码进行的熵编码(CAVLC)。主要用于可视电话、会议电视、无线通信等实时视频通信;
- 主要档次:支持隔行视频,采用 B 片的帧间编码和采用加权预测的帧内编码;支持利用基于上下文的自适应的算术编码(CABAC)。主要用于数字广播电视与数字视频存储;
- 扩展档次:支持码流之间有效的切换(SP 和 SI 片)、改进误码性能(数据分割),但不支持隔行视频和 CABAC。展档次包括了基本档次的所有功能,而不能包括主要档次的。
3.3.编码数据格式
H.264 支持 4:2:0 的连续或隔行视频的编码和解码。
制订 H.264 的主要目标有二个:
- 高的视频压缩比;
- 良好的网络亲和性,即可适用于各种传输网络。
为此, H.264 的功能分为两层,即视频编码层(VCL)和网络提取层(NAL, Network Abstraction Layer)。 VCL 数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在 VCL 数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元中。每个 NAL 单元包括一个原始字节序列负荷(RBSP)、一组对应于视频编码数据的 NAL 头信息。NAL 单元序列的结构如下图所示
1.参数图像
为了提高预测精度, H.264 编码器可从一组前面或后面已编码图像中选出一个或两个与当前最匹配的图像作为帧间编码间的参数图像,使匹配后的预测精度显著改进。 H.264 中最多可从 15 个参数图像中进行选择,选出最佳的匹配图像。
对于 P 片中帧间编码宏块和宏块分割的预测可从表“0”中选择参数图像;对于 B 片中的帧间编码宏块和宏块分割的预测,可从表“0”和“1”中选择参考图像。
2.片
一个视频图像可编码成一个或更多个片, 每片包含整数个宏块(MB),即每片至少一个 MB,最多时每片包含整个图像的宏块。总之,一幅图像中每片的宏块数不一定固定。
设片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。
编码片共有 5 种不同类型,除已讲过的 I 片、 P 片、 B 片外,还有 SP 片和 SI 片。其中 SP(切换P)是用于不同编码流之间的切换;它包含 P 和/或 I 宏块。它是扩展档次中必须具有的切换,它包含了一种特殊类型的编码宏块,叫做 SI 宏块, SI 也是扩展档次中的必备功能。
片的句法结构如下图所示
其中片头规定了片的类型,该片属于哪个图像,有关的参考图像等,片的数据包含一系列的编码 MB(宏块),和/或跳编码(不编码)数据。每个 MB 包含头单元(如下表所)示和残差数据。
3.片组
片组是一个编码图象中若干 MB 的一个子集,它可包含一个或若干个片。在一个片组中,每片的 MB 按光栅扫描次序被编码,如果每幅图象仅取一个片组,则该图象中所有的 MB 均按光栅扫描次序被编码(除非使用 ASO,即任意的片次序,即一个编码帧中的片之后可跟随任一解码程序的片)。还有一种片组,叫灵活宏块次序(FMO),它可用灵活的方法,把编码 MB 序列映射到解码图象中 MB 的分配用 MB 到片组之间的映射来确定,它表示每一个 MB 属于哪个片组。下表为 MB 到片组的各种映射类型。
3.4.帧内预测
在帧内预测模式中,预测块 P 是基于已编码重建块和当前块形成的。对亮度像素而言, P 块用于 4×4 子块或者 16×16 宏块的相关操作。 4×4 亮度子块有 9 种可选预测模式,独立预测每一个 4×4亮度子块,适用于带有大量细节的图像编码; 16×16 亮度块有 4 种预测模式,预测整个 16×16 亮度块,适用于平坦区域图像编码;色度块也有 4 种预测模式,类似于 16×16 亮度块预测模式。编码器通常选择使 P 块和编码块之间差异最小的预测模式。此外, 还有一种帧内编码模式称为 I_PCM 编码模式。该模式下,编码器直接传输图像像素值,而不经过预测和变换。在一些特殊的情况下,特别是图像内容不规则或者量化参数非常低时该模式比起“常规操作”(帧内预测—变换—量化—熵编码)效率更高。 I_PCM 模式用于以下目的:
- 允许编码器精确的表示像素值
- 提供表示不规则图像内容的准确值,而不引起重大的数据量增加。
- 严格限制宏块解码比特数,但不损害编码效率。
在以往 H.263+、 MPEG-4 等视频压缩编码标准中,帧内编码被引入变换域。 H.264 帧内编码则参考预测块左方或者上方的已编码块的邻近像素点,被引入空间域。但是,如果参考预测块是帧间编码宏块,该预测会因参考块的运动补偿引起误码扩散。所以,参考块通常选取帧内编码的邻近块。
1. 4x4亮度预测模式
如上图 所示, 4×4 亮度块的上方和左方像素 A~Q 为已编码和重构像素,用作编解码器中的预测参考像素。 a~p 为待预测像素,利用 A~Q 值和 9 种模式实现。其中模式 2(DC 预测)根据 A~Q 中已编码像素预测,而其余模式只有在所需预测像素全部提供才能使用。图 下图 箭头表明了每种模式预测方向。对模式 3~8,预测像素由 A~Q 加权平均而得。例如,模式 4 中,p=round(B/4+C/2+D/4)。下表给出了这 9 种模式的描述。
2. 16x16亮度预测模式
宏块的全部 16×16 亮度成分可以整体预测,有 4 种预测模式,如表 6.4 和图 6.17 所示
3. 8x8色度块预测模式
每个帧内编码宏块的 8×8 色度成分由已编码左上方色度像素预测而得,两种色度成分常用同一种预测模式。 4 种预测模式类似于帧内 16×16 预测的 4 种预测模式,只是模式编号不同。其中 DC(模式 0)、水平(模式 1)、垂直(模式 2)、平面(模式 3)。
4.信号化帧内预测模式
每个 4×4 块帧内预测模式必须转变成信号传给解码器。该信息可能需大量比特表示,但邻近块的帧内模式通常是相关的。例如, A、 B、 E 分别为左边、上边和当前块,如果 A 和 B 预测模式为模式 1, E 的最佳预测模式很可能也为模式 1。所以通常利用这种关联性信号化 4×4 帧内模式。帧内预测以绝对误差和(SAE)为标准选取最佳预测模式,使预测帧更加接近原始帧,减少了相互间的差异,去除时间上的数据冗余,提高了编码的压缩效率。
3.5.帧间预测
H.264 帧间预测是利用已编码视频帧/场和基于块的运动补偿的预测模式。与以往标准帧间预测的区别在于块尺寸范围更广(从 16×16 到 4×4)、亚像素运动矢量的使用(亮度采用 1/4 像素精度MV)及多参考帧的运用等等。
1.树状结构运动补偿
每个宏块(16×16 像素)可以 4 种方式分割:一个 16×16,两个 16×8,两个 8×16,四个 8×8。其运动补偿也相应有四种。而 8×8 模式的每个子宏块还可以四种方式分割:一个 8×8,两个 4×8 或两个 8×4 及 4 个 4×4。这些分割和子宏块大大提高了各宏块之间的关联性。这种分割下的运动补偿则称为树状结构运动补偿。
每个分割或子宏块都有一个独立的运动补偿。每个 MV 必须被编码、传输,分割的选择也需编码到压缩比特流中。对大的分割尺寸而言, MV 选择和分割类型只需少量的比特,但运动补偿残差在多细节区域能量将非常高。小尺寸分割运动补偿残差能量低,但需要较多的比特表征 MV 和分割选择。分割尺寸的选择影响了压缩性能。 整体而言,大的分割尺寸适合平坦区域,而小尺寸适合多细节区域。
宏块的色度成分(Cr 和 Cb)则为相应亮度的一半(水平和垂直各一半)。 色度块采用和亮度块同样的分割模式,只是尺寸减半(水平和垂直方向都减半)。例如, 8×16 的亮度块相应色度块尺寸为 4×8, 8×4 亮度块相应色度块尺寸为 4×2 等等。色度块的 MV 也是通过相应亮度 MV 水平和垂直分量减半而得。
下图显示了一个残差帧(没有进行运动补偿)。 H.264 编码器为帧的每个部分选择了最佳分割尺寸,使传输信息量最小,并将选择的分割加到残差帧上。在帧变化小的区域(残差显示灰色),选择 16×16 分割;多运动区域(残差显示黑色或白色),选择更有效的小的尺寸。
2.运动矢量
帧间编码宏块的每个分割或者子宏块都是从参考图像某一相同尺寸区域预测而得。两者之间的差异(MV)对亮度成分采用 1/4 像素精度,色度 1/8 像素精度。亚像素位置的亮度和色度像素并不存在于参考图像中,需利用邻近已编码点进行内插而得。下图中,当前帧的 4×4 块通过邻近参考图像相应区域预测。如果 MV 的垂直和水平分量为整数,参考块相应像素实际存在(灰色点)。如果其中一个或两个为分数,预测像素(灰色点)通过参考帧中相应像素(白色点)内插获得。
3.内插像素生成
首先生成参考图像亮度成分半像素像素。半像素点(如 b,h,m)通过对相应整像素点进行 6 抽头滤波得出,权重为(1/32 ,-5/32 ,5/8, 5/8, -5/32, 1/32)。 b 计算如下:
类似的, h 由 A、 C、 G、 M、 R、 T 滤波得出。一旦邻近(垂直或水平方向)整像素点的所有像素都计算出,剩余的半像素点便可以通过对 6 个垂直或水平方向的半像素点滤波而得。例如, j 由cc, dd, h,m,ee,ff 滤波得出。这里说明的是, 6 抽头滤器比较复杂,但可明显改善运动补偿性能。
半像素点计算出来以后, 1/4 像素点就可通过线性内插得出,如图 6.23 所示。 1/4 像素点(如 a, c, i, k, d, f, n, q)由邻近像素内插而得,如
剩余 1/4 像素点(p, r)由一对对角半像素点线性内插得出。如, e 由 b 和 h 获得。相应地,色度像素需要 1/8 精度地 MV,也同样通过整像素地线性内插得出,如图 6.24 所示。
4.MV预测
每个分割 MV 的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可利用邻近分割的 MV 较强的相关性, MV 可由邻近已编码分割的 MV 预测而得。预测矢量 MVp 基于已计算 MV 和 MVD(预测与当前的差异)并被编码和传送。 MVp 则取决于运动补偿尺寸和邻近MV 的有无。
E 为当前宏块或宏块分割子宏块。 A、 B、 C 分别为 E 的左、上、右上方的三个相对应块。如果E 的左边不止一个分割,取其中最上的一个为 A;上方不止一个分割时,取最左边一个为 B。图 6.25显示所有分割有相同尺寸时的邻近分割选择。图 6.26 给出了不同尺寸时临近分割的选择。
其中:
- 传输分割不包括 16×8 和 8×16 时, MVp 为 A、 B、 C 分割 MV 的中值;
- 16×8 分割,上面部分 MVp 由 B 预测,下面部分 MVp 由 A 预测;
- 8×16 分割,左面部分 MVp 由 A 预测,右面部分 MVp 由 C 预测;
- 跳跃宏块(skipped MB),同 1)。
如果图 6.26 所示的已传送块不提供时(如在当前片外), MVp 选择需重新调整。在解码端, MVp以相同方式形成并加到 MVD 上。对跳跃宏块,不存在 MVD,运动补偿宏块也由 MV 直接生成。
5.B片预测
B 片中的帧间编码宏块的每个子块都是由一个或两个参考图像预测而得。该参考图像在当前图像的前面或者后面。参考图像存储于编解码器中,其选择有多种方式。下图显示了三种方式:一个前向和一个后向的(类似于 MPEG 的 B 图像预测);两个前向;两个后向。