笔记——H.264/AVC编码器原理基础
H.264的优势和特性:
1、将每个视频帧分离成由像素组成的块,因此视频帧的编码处理的过程可以达到块的级别。
2、采用空间冗余的方法,对视频帧的一些原始块进行空间预测、转换、优化和熵编码(可变长编码)。
3、对连续帧的不同块采用临时存放的方法,这样,只需对连续帧中有改变的部分进行编码。该算法采用运动预测和运动补偿来完成。对某些特定的块,在一个或多个已经进行了编码的帧执行搜索来决定块的运动向量,并由此在后面的编码和解码中预测主块。
4、采用剩余空间冗余技术,对视频帧里的残留块进行编码。例如:对于源块和相应预测块的不同,再次采用转换、优化和熵编码。
不仅具有优异的压缩性能,而且具有良好的网络亲和性。
MPEG-4中重点是灵活性不同,H.264着重在压缩的高效率和传输的可靠性。
H.264/AVC编解码器
H.264编解码器特点:
不明确规定编解码器如何实现,而是规定了一个编了码的比特流的句法和该比特流的解码方法。在实现上具有较大灵活性。
H.264编码器:
编码器采用的仍是变换和预测的混合编码法。
由图 6.1,输入的帧或场 Fn 以宏块为单位被编码器处理。首先,按帧内或帧间预测编码的方法进行处理。 如果采用帧内预测编码,其预测值 PRED(图中用 P 表示)是由当前片中前面已编码的参考图像 经运动补偿(MC)后得出,其中参考图像用 F’n-1 表示。为了提高预测精度,从而提高压缩比,实际的参考图像可在过去或未来(指显示次序上)已编码解码重建和滤波的帧中进行选择。 预测值 PRED 和当前块相减后,产生一个残差块 Dn,经块变换、量化后产生一组量化后的变换系数X,再经熵编码,与解码所需的一些边信息(如预测模式量化参数、运动矢量等)一起组成一个压缩后的码流,经 NAL(网络自适应层)供传输和存储用。
如上所述,为了提供进一步预测用的参考图像,编码器必须有重建图像的功能。因此必须使残差图像经反量化、反变换后得到的 Dn’ 与预测值 P 相加,得到 uFn’(未经滤波的帧)。为了去除编码解 码环路中产生的噪声,为了提高参考帧的图像质量,从而提高压缩图像性能,设置了一个环路滤波器,滤波后的输出 Fn’即重建图像可用作参考图像。
H.264解码器:
由编码器的 NAL 输出一个压缩后的 H.264 压缩比特流。由图 6.2,经熵解码得到 量化后的一组变换系数 X,再经反量化、反变换,得到残差 Dn’。利用从该比特流中解码出的头信 息,解码器就产生一个预测块 PRED,它和编码器中的原始 PRED 是相同的。当该解码器产生的 PRED 与残差 Dn’ 相加后,就产生 uFu’,再经滤波后,后就得到滤波后的 Fn’ 这个 Fn’ 就是后的解码 输出图像。
H.264/AVC的基础概念:
(1)场和帧
视频中因为逐行扫描和隔行扫描的原因,在采用隔行扫描方式进行播放的设备中,每一帧画面都会被拆分开进行显示,而拆分后得到的残缺画面就称为 “场” 。
也就是说,在采用NTSC制式的电视中,显示设备每秒要播放60场画面(NTSC制式的帧速率为30fps,即每秒钟会有30帧或30画,每帧或每画被隔行扫描分割为两场,故而总计60场,PAL制同理);对于PAL制式的电视来说,则需要每秒播放50场的画面。
在这一过程中,一帧画面内首先显示的场被称为“顶场”,而组成该帧画面的另一场被称为“底场”。
视频的一场或一帧可用来产生一个编码图像。通常,视频帧可分成两种类型:连续或隔行视频帧。 在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。显然,这时场内邻行之间的空间相 关性较强,而帧内邻近行空间相关性强,因此活动量较小或静止的图像宜采用帧编码方式,对活动量较大的运动图像则宜采用场编码方式
(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 宏块则利用双向的参考图象(当前和未来的已编码图象帧)进行帧内预测。
档次和级:
1)基本档次:利用 I 片和 P 片支持帧内和帧间编码,支持利用基于上下文的自适应的变长编码 进行的熵编码(CAVLC)。主要用于可视电话、会议电视、无线通信等实时视频通信;
2)主要档次:支持隔行视频,采用 B 片的帧间编码和采用加权预测的帧内编码;支持利用基于 上下文的自适应的算术编码(CABAC)。主要用于数字广播电视与数字视频存储;
3)扩展档次:支持码流之间有效的切换(SP 和 SI 片)、改进误码性能(数据分割),但不支持 隔行视频和 CABAC。
H.264编码格式:
制订 H.264 的主要目标有二个:
1、高的视频压缩比,当初提出的指标是比 H.263,MPEG-4,约为它们的 2 倍
2、良好的网络亲和性,即可适用于各种传输网络。为此,H.264 的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,Network Abstraction Layer)。VCL 数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元中。
每个 NAL 单元包括一个原始字节序列负(RBSP)、一组对应于视频编码数据的NAL 头信息。 NAL 单元序列的结构如图。
片和片组
片:
一个视频图像可编码成一个或更多个片,每片包含整数个宏块(MB),即每片至少一个 MB, 多时每片包含整个图像的宏块。总之,一幅图像中每片的宏块数不一定固定。
设置片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。 编码片共有 5 种不同类型,除已讲过的 I 片、P 片、B 片外,还有 SP 片和 SI 片。
其中 SP(切换 P)是用于不同编码流之间的切换;它包含 P 和/或 I 宏块。它是扩展档次中必须具有的切换,它包含了一种特殊类型的编码宏块,叫做SI 宏块,SI也是扩展档次中的必备功能。
SP帧的作用:
为了解决定期插入I帧带来的视频流数据量急剧增加和流间切换引起的漂移问题, H.264视频编码标准定义了两种新型帧, 即SP帧和SI帧。
SP帧能够像I帧一样提供无缝切换点,从而实现码流间的无缝连接。同时由于SP帧采用基于帧间预测的运动补偿预测编码技术,所以其大小远小于I帧。
SP帧的编码基本原理
同P帧类似,仍是基于帧间预测的运动补偿预测编码,两者之间的差异在于:SP帧能够参考不同参考帧重构出相同的图像帧。由于这一特性, SP帧可以取代I帧,广泛应用于流间切换、拼接、随机接入、快进快退和错误恢复中,同时大大降低了码率的开销。在某些应用中, SI帧与SP帧一起被使用,例如不同码流间的切换、错误恢复等。SI帧像I帧一样仅仅用空间预测,但重构图像与采用运动补偿预测编码技术的SP帧完全相同。
片组:
片组是一个编码图象中若干 MB 的一个子集,它可包含一个或若干个片。 在一个片组中,每片的 MB 按光栅扫描次序被编码,如果每幅图象仅取一个片组,则该图象中所 有的 MB 均按光栅扫描次序被编码(除非使用 ASO,即任意的片次序,即一个编码帧中的片之后可 跟随任一解码程序的片) 。 还有一种片组,叫灵活宏块次序(FMO),它可用灵活的方法,把编码 MB 序列映射到解码图象 中 MB 的分配用 MB 到片组之间的映射来确定,它表示每一个 MB 属于哪个片组。
信号化帧内预测模式
帧内预测以绝对误差和(SAE)为标准选取佳预测模式,使预测帧更加接近原始帧, 减少了相互间的差异,去除时间上的数据冗余,提高了编码的压缩效率。帧内预测中,块或宏块利 用已编码并重建的块作为参考,进行预测。具体编程时,编码器通过计算并比较各种模式下的 SAE, 选取 SAE 值小的模式作为佳预测模式,并将该模式信息化,同时传送至解码端,以供正确解码。
帧间预测
H.264 帧间预测是利用已编码视频帧/场和基于块的运动补偿的预测模式。与以往标准帧间预测 的区别在于块尺寸范围更广(从 16×16 到 4×4)、亚像素运动矢量的使用(亮度采用 1/4 像素精度 MV)及多参考帧的运用等等。
树状结构运动补偿
每个宏块(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)则为相应亮度的一半(水平和垂直各一半)。色度块采用和亮度块 同样的分割模式,只是尺寸减半(水平和垂直方向都减半)。
在高精度的亚像素运动补偿
H.263中采用的是半像素精度的运动估计,而在H.264中可以采用1/4或者1/8像素精度的运动估值。在要求相同精度的情况下,H.264使用1/4或者1/8像素精度的运动估计后的残差要比H.263采用半像素精度运动估计后的残差来得小。这样在相同精度下,H.264在帧间编码中所需的码率更小。
MV 预测
每个分割 MV 的编码需要相当数目的比特,特别是使用小分割尺寸时。为减少传输比特数,可 利用邻近分割的 MV 较强的相关性,MV 可由邻近已编码分割的 MV 预测而得。预测矢量 MVp 基 于已计算 MV 和 MVD(预测与当前的差异)并被编码和传送。MVp 则取决于运动补偿尺寸和邻近 MV 的有无。
整数变换和量化
整数变换
在变换方面,H.264使用了基于4×4像素块的类似于DCT的变换,但使用的是以整数为基础的空间变换,不存在反变换,因为取舍而存在误差的问题,变换矩阵如图5所示。与浮点运算相比,整数DCT变换会引起一些额外的误差,但因为DCT变换后的量化也存在量化误差,与之相比,整数DCT变换引起的量化误差影响并不大。此外,整数DCT变换还具有减少运算量和复杂度,有利于向定点DSP移植的优点。
量化
量化过程在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。
H.264 采用标量量化技术,它将每个图像样点编码映射成较小的数值。一般标量量化器的原理为:
其中,y 为输入样本点编码,QP 为量化步长,FQ 为 y 的量化值,round()为取整函数(其输出为与 输入实数近的整数)。其相反过程,即反量化为:
在量化和反量化过程中,量化步长 QP 决定量化器的编码压缩率及图像精度。如果 QP 比较大, 则量化值 FQ 动态范围较小,其相应的编码长度较小,但反量化时损失较多的图像细节信息;如果 QP 比较小,则 FQ 动态范围较大,相应的编码长度也较大,但图像细节信息损失较少。编码器根据 图像值实际动态范围自动改变 QP 值,在编码长度和图像精度之间折衷,达到整体佳效果。
CAVLC(基于上下文自适应的可变长编码)
熵编码
熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立 在随机过程的统计特性基础上的
熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也不同。当 信源中各事件是等概率分布时,熵具有极大值。信源的熵与其可能达到的大值之间的差值反映了 该信源所含有的冗余度。信源的冗余度越小,即每个符号所独立携带的信息量越大,那么传送相同 的信息量所需要的序列长度越短,符号位越少。因此,数据压缩的一个基本的途径是去除信源的符 号之间的相关性,尽可能地使序列成为无记忆的,即前一符号的出现不影响以后任何一个符号出现的概率。
视频编码处理的最后一步就是熵编码,在H.264中采用了两种不同的熵编码方法:通用可变长编码(UVLC)和基于文本的自适应二进制算术编码(CABAC)。
在H.263等标准中,根据要编码的数据类型如变换系数、运动矢量等,采用不同的VLC码表。H.264中的UVLC码表提供了一个简单的方法,不管符号表述什么类型的数据,都使用统一变字长编码表。其优点是简单;缺点是单一的码表是从概率统计分布模型得出的,没有考虑编码符号间的相关性,在中高码率时效果不是很好。
因此,H.264中还提供了可选的CABAC方法。算术编码使编码和解码两边都能使用所有句法元素(变换系数、运动矢量)的概率模型。为了提高算术编码的效率,通过内容建模的过程,使基本概率模型能适应随视频帧而改变的统计特性。内容建模提供了编码符号的条件概率估计,利用合适的内容模型,存在于符号间的相关性可以通过选择目前要编码符号邻近的已编码符号的相应概率模型来去除,不同的句法元素通常保持不同的模型。
去方块滤波
H.264/MPEG-4 AVC 视频编码标准中,在编解码器反变换量化后图像会出现方块效应。其产生的原因有两个。重要的一个原因是基于块的帧内和帧间预测残差的 DCT 变换。变换系数的量化过 程相对粗糙,因而反量化过程恢复的变换系数带有误差,会造成在图像块边界上的视觉不连续。第二个原因来自于运动补偿预测。运动补偿块可能是从不是同一帧的不同位置上的内插样点数据复制而来。因为运动补偿块的匹配不可能是绝对准确的,所以就会在复制块的边界上产生数据不连续。 当然,参考帧中存在的边界不连续也被复制到需要补偿的图像块内。尽管 H.264/MPEG-4 AVC采用较小的 4×4 变换尺寸可以降低这种不连续现象,但仍需要一个去方块滤波器以大程度提高编码性能。
在视频编解码器中加入去方块滤波器的方法有两种:后置滤波器和环路滤波器。后置滤波器只 处理编码环路外的显示缓冲器中的数据,所以它不是标准化过程中的规范内容,在标准中只是可选项。相反,环路滤波器处理编码环路中的数据。在编码器中,被滤波的图像帧作为后续编码帧运动补偿的参考帧;在解码器中,滤波后的图像输出显示。