关键词:错误恢复编码 错误隐藏 H.264
一、引言
随着宽带网络的发展和用户需求的驱动,多媒体技术和相关的应用得到了越来越多的关注,被认为是未来高速网络的主流应用之一。多媒体应用尤其是视频应用,相对于Internet的传统应用如WWW、E-mail等,其对实时性要求更严,对带宽的需求更大。基于IP的视频应用分为三类:交互应用,如可视电话和视频会议;预编码的视频流下载,基于IP的实时视频流;数字电视广播。为满足这些应用的需求,必须解决四个QoS问题:吞吐量,传输时延,时延抖动,误码率。但是,由于视频应用中大多采用了高压缩率的编码技术,其对传输误码的要求尤为苛刻,而Internet的本质是尽力而为的网络,不提供传输的QoS保证,因此提高视频应用对传输误码的抗干扰和恢复能力一直是多媒体通信领域的研究热点。
视频通信系统通常由五部分组成:视频源编码、复用/包封装/信道编码、信道传输、解复用/解包/信道解码和视频解码。视频通信中的错误恢复由于以下原因显得尤为重要:
(1)由于在源编码器中采用了空间和时间预测编码以及可变长编码(VLC),压缩的视频流对传输中的错误特别敏感;
(2)视频源和网络环境通常是时变的,因此基于某些统计模型设计出一个“优化”的解决方案是很困难的,甚至是不可能的;
(3)视频源码率通常很高,对于某些实时应用而言,编解码器不可能过于复杂。
传统上,抗误码的机制分为三类:在编码器和信道编码中引入冗余,使编码流对传输错误具有更强的抗干扰能力;解码器根据错误检测的结果对错误进行隐藏;通过编码器、传输信道和解码器之间进行交互,编码器根据检测到的错误信息调整自身的操作。在本文中,我们将它们统称为错误恢复技术。
二、错误恢复技术综述
1.编码器中的错误恢复编码
错误恢复编码的设计旨在于使用最小的冗余来获得错误恢复的最大增益。有很多方法用于添加冗余比特,一些有益于防止错误扩散,另一些用于协助解码器通过错误监测更好地进行错误隐藏,还有一些目标在于保证基本级别的视频质量,以保证发生传输错误时图像质量不会极度恶化。
鲁棒熵编码是一种简单有效的提高编码流鲁棒性的方法,就是在编码流中周期地插入重同步标记,这样,解码器可以在检测到重同步标记之后继续进行正确的解码。反向变长编码(RVLC)是另一种常用方法,它通过提供重同步前的反向解码功能,以及前向解码器和后向解码器之间的交叉检查功能,减少了有效数据的丢弃,仅适度地增加了运算复杂度。
编码流对传输错误敏感的一个主要原因就是使用了时间预测和空间预测。一旦有误码发生,在解码器上重构的帧将会与原图像有较大差别,这样会导致使用这一帧作为参考帧的后续帧重构时产生错误。阻止时域错误扩散的一个方法是周期的插入帧内编码的帧或宏块,对于实时应用,使用足够数量的帧内编码的宏块是一个有效的错误恢复工具。对于帧内编码宏块的数量和位置的确定,目前所知最好的方法是使用基于丢包率的率失真优化方案。另一个限制错误扩散的方法就是将数据分成多个段,仅在同一段内部进行时间和空间预测,即独立的段预测。
分层编码(LC)是指将视频编码成一个基本层和一个或多个加强层。基本层提供了一个较低的但可接受的质量,每个附加的加强层逐步地提高质量。用于错误恢复时,LC必须与传输系统中的非均衡错误保护(UEP)相结合,因为基本层必须得到更强的保护。多描述编码(MDC)同LC一样,也将同一个源编码成多个子流,称为描述,区别是产生的各个描述是相关的,有着同样的重要性。任何一个单独的描述必须提供一个基本级别的视频质量,多个描述一起提供改善的质量。MDC相对于LC的一个优点是它不需要网络提供可靠的子信道。
2.解码器中的错误隐藏技术
解码器错误隐藏是指对传输错误导致的丢失信息的恢复和估计。在基于块的混合编码范例中,损坏的MB有三类信息需要估计:纹理信息,包括原始图像块和预测错误块的像素或DCT系数的值;运动信息,包括P模式或B模式编码的MB中的MV;宏块的编码模式。众所周知,图像的能量主要集中在低频分量,即空间和时间相邻的像素点的色度值的变化很平滑,除了在区域的边缘。所有的用于恢复纹理信息的技术都是基于上述特性进行某种空间、时间内插。MV域也采取同样的方法,对于编码模式,倾向于采用启发式的方法。
对于纹理信息的恢复,有四种方法:运动补偿时间预测;空间内插;基于重构图像平滑度的空间和时间内插;使用POCS技术的空间内插。运动补偿时间预测就是根据宏块的MV复制前一帧中相应的宏块。空间内插是根据相邻的正确接收的块中像素点内插估计损坏的块中像素点,通常只使用相邻块中的边缘像素点用于内插估计。为保证重构的图像足够平滑,在进行时间内插和空间内插时,根据正确接收的DCT系数,对内插的像素点进行调整。此外还有一个空间内插方法是使用POCS,但由于它通过迭代的过程进行,不适合实时应用,故不多加讨论。
编码模式和运动矢量同样可能损坏。一个编码模式估计的方法是统计相邻的MB的编码模式信息,并选择一个最可能的模式;另一个简单保守的方式就是假设MB是采用帧内模式。估计丢失的MV有下面几个简单的方法:(1)假设丢失的MV为零,这对于相对变化较小的视频序列很有效;(2)使用前一帧中的对应块的MV;(3)使用空间相邻的块的MV均值;(4)使用空间相邻的块的MV中间值。
3.编解码器之间的交互错误控制
通过编码器和解码器的交互进行错误控制是一个有效的方法。当在编码器和解码器之间建立一个反馈信道时,解码器可以通知编码器哪块数据损坏,这样编码器可相应调整操作来抑制甚至消除错误造成的影响。
如果网络的时延允许,在实时交互应用中可以采取ARQ机制,重传损坏的信息,只要这些重传数据在解码器使用之前到达,就能部分地消除错误影响。在使用这种方法时,考虑到实时应用的需求,重传的信息应是重要的,且数据量须相对较小。例如ARQ机制可以与LC相结合,只重传图像的基本层。
另一种有效利用反馈信道的途径就是参考帧的选择(RPS)。如果编码器通过反馈了解某个编码帧N受到损坏,那么它可以决定下一个P帧不使用帧N作为参考帧,而使用更前一帧(已经被解码器正确接收)。这要求编码器和解码器存储多个过去的解码帧,使用RPS的方法相对于直接使用I帧,效率更高。除了使用更早的帧作为参考帧外,编码器还可以跟踪第N帧中损坏的区域对其后d帧的影响,并采取下列某种方法:(1)将帧n+d中将要使用帧n+d-1中的损坏像素点进行预测的区域使用I模式;(2)避免使用帧n+d-1中的损坏区域来预测帧n+d;(3)对帧n+1到n+d-1进行与解码器相同的错误隐藏,这样编码器中的参考帧在进行帧n+d编码时将与解码器一致。
三、H.264中的网络适配层设计和新的错误恢复技术
H.264是ITU-T的最新视频编码建议,也称为ISO/IEC14496-10,它是由MPEG和ITU组成的联合视频专家组JVT推出的。H.264包含了VCL(视频编码层)和NAL(网络抽象层)。VCL包括核心压缩引擎和块/宏块/片的语法级别定义,它被设计成尽可能地独立于网络。NAL将VCL产生的比特字符串适配到各种各样的网络和多元环境中,它覆盖了所有片级以上的语法级别,并包含了以下机制:
(1)包含对每个片解码时所需要的参数数据;
(2)防止了起始码冲突;
(3)对附加增强信息(SEI)的支持;
(4)将编码片的比特字符串在基于比特流的网络上进行传送的实现框架。
将NAL与VCL分离的主要目的有两个。首先,建议中定义了一个VCL信号处理与NAL传输的接口,这样就允许VCL和NAL工作在完全不同的处理器平台上。其次,VCL和NAL都被设计成适应于异质传输环境,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。由于在IP网络环境中,绝大部分视频应用所采用的网络协议层次是RTP/UDP/IP,因此在以下描述中主要基于这个传输框架。下面首先对H.264中新增的三个错误恢复工具进行功能分析,然后分析NAL层的基本处理单元NALU以及它的RTP封装、聚合和拆分的方法。
1.H.264中的错误恢复工具
H.264包括了大量的错误恢复工具,其中帧内编码模式的内插、RPS和数据分割等工具,已应用于以前的视频压缩方案中,故只介绍H.264对它们的改进,但有些工具是全新的或者是用一种创新的方法实现的,如参数集、灵活宏块排序(FMO)、冗余分片(RS),下面将作详细的分析。
H.264对帧内编码模式内插的改进主要体现在,对何时使用、使用哪种级别、使用多少数量、在什么位置使用等问题的确定上。H.264使用RDO(率失真优化)的方法确定上述要素,经实验验证,这种方法取得了很好的效果。对于RPS,H.264的可选择范围更广,并可以使用前向或后向的参考帧,且数量可多达15帧。
在H.264中,使用了三种不同类型的数据分割:(1)帧头信息,包括宏块类型、量化参数和运动矢量,这种分割类型最重要,叫A型分割;(2)帧内分割,又称B型分割,包括帧内编码块模式和帧内系数,该型数据分割要求给定分片的A型分割有效,相对于帧间信息,帧内信息能更好地阻止漂移效应,因此它比帧间分割更为重要;(3)帧间分割,即C型分割,它仅包括帧间编码块模式和帧间系数,一般情况下它是编码分片的最大分区,帧间分割是最不重要的,它同样要求给定分片的A型分割有效。当使用数据分割时,源编码器把不同类型的分割安排在三个不同的缓冲器中,同时分片的尺寸必须进行调整以保证小于网络的MTU(最大传输单元)长度,由编码器而不是NAL来实现数据分割。在解码器上,所有分割用于信息重建,尽管如此,如果帧内或帧间信息丢失了,有效的帧头信息仍能用于错误隐藏,即当宏块类型和运动矢量有效时,仍可获得一个较高的图像重构质量,而仅仅丢失了细节信息。
参数集是H.264新提出的一个概念。在H.264中有两类参数集:序列参数集和图像参数集。序列参数集包括了一个图像序列(定义为两个IDR图像间的所有图像)中的所有图像级编解码参数,而一个图像参数集包括一个图像的所有分片的编解码参数。参数集的灵活使用能较大提高错误恢复能力,因此需要保证参数集的正确收发,有三种方法:可使用一个可靠的控制协议通过带外传输,但必须保证在使用此参数集的第一个分片到达之前将参数集送到解码器;也可以通过带内传输,但需要相应的应用层保护(如通过发送复制包来保证不丢包);第三种方法就是在编解码器中都使用硬件的编解码参数集。FMO用于H.264的基本档次和扩展档次,它允许以任意顺序将宏块分配给片。通过使用宏块分配映射图,每一个宏块被静态分配给某个片组。在片组中,宏块用传统扫描顺序编码。图像内部预测机制,例如帧内预测或运动矢量预测等,仅允许用同一片组里的空间相邻的宏块之间进行。为举例说明,请参见图1中FMO棋盘分片例图,所有的MB被分成片组0和片组1,相应地分别用灰和白色描绘。假设在传输过程中,包含片组1的信息丢失了,因为每个丢失的MB都有几个属于其他片的相邻MB,基于错误隐藏机制就可以恢复大部分信息。实验证明,在CIF图像的视频会议中,在网络丢包率达10%的情况下,使用FMO时视频失真低到需要训练有素的眼睛才能识别。使用FMO的代价是稍微降低了编码效率,时延较大。
H.264中的最后一个工具是冗余分片。冗余分片允许编码器对同一个MB采用不同编码参数进行多次编码,产生一个主片和多个冗余片,其中主片使用较低的QP(因此质量较好)来编码,而冗余片使用一个高QP的方式来编码,这样质量粗糙一些但码率更低。主片和冗余片在NAL层被封装到不同的包进行传输。解码器在重构时,首先使用主片,如果它可用就抛弃冗余片;当主片丢失(比如因为包的丢失)时冗余片也能被用于重构。RS主要用于更好支持高误码的移动环境。
2.NAL单元(NALU)
作为NAL层的基本处理单元,一个NALU是一个包含一定语法元素的可变长字节字符串,它可以携带一个编码片,A、B、C型数据分割,或者一个序列或图像参数集。每个NALU由一个字节的头和一个包含可变长编码符号的字节组成。头部含三个定长比特区,参见图2:NALU类型(T),NAL-REFERENCE-IDC(R)和隐藏比特位(F)。NALU类型用5bit来代表NALU的32种不同类型,类型1~12是H.264定义的基本类型,类型24~31用于标志在RTP封装中NALU的聚合和拆分,其他值保留。R比特用于标志在重构过程中的重要性,值为0表示没有用于预测参考,值越大,用于预测参考的次数越多。F比特默认为0,当网络检测到NALU中存在比特错误(在无线网络环境易出现)时,可将其置为1,主要适用于异质网络环境(如有线无线相结合的环境)。
3.包封装机制
在H.264中,RTP封装规范有如下几个设计原则:
(1)应该低负载,以便小于MTU长度(从100字节或更少到64千字节);
(2)应易于区分RTP包的重要性,而不需对包内数据进行解码;
(3)应能检测到数据的类型,而不需解码整个数据流,并能根据编码流之间的相关性丢弃无用数据,如网关应能检测A型分割的丢失,并能丢弃相应的B型和C型分割;
(4)应支持将一个NALU拆分为若干个RTP包;
(5)应支持NALU单元聚合,即在一个RTP包中传输超过一个NALU。H.264的NAL概念主要设计用于IP网络,一般直接将NALU头作为RTP头,这个功能满足上述设计原则的1、2、3项。为支持4和5,使用了NALU头中的类型用于标志拆分和聚合,这样所有的拆分和聚合功能都直接基于NALU头字节信息进行,不需对流进行解析就可以完成拆分、聚合和它们各自的逆功能。
H.264中NALU的RTP封装方案称为“简单包”方案,即直接将一个NALU放进一个RTP包。一般情况下,VCL不会产生超过MTU尺寸的NAL单元。在接收端,解码器通过RTP序列信息识别并丢弃应用层的复制包,取出有效RTP包里的NAL单元。基本档次和扩展档次允许片的无序解码,这样在抖动缓存中就不必对包进行重新排序;在使用主档次时,要通过RTP序列信息来对包进行重新排序。
当网络支持非平衡保护方案时,数据分割是提高错误恢复能力而不增加更多开销的有效方法,通过对数据分割在信息重构中的重要性来实行分级保护,对A型分割使用最好的保护,而C型分割是尽力而为。当A型分割丢失后,B、C型都不可用,因此一个RTP接收器可以抛弃那些仅包含B或C型分割的RTP包,这在具体的媒介网关中非常有效,即当一个网关判断A型分割被丢失后,它将抛弃那些属于同一个片的B和C型分割,因此可降低网络拥塞。
而当编码器进行内容预编码时,由于它不了解底层网络的MTU大小,将产生一些大于MTU尺寸的NALU,同时由于UDP数据包不能大于64千字节,这个限制不适合类似数码相机的应用,所以应用层的拆分方案是RTP封装方案的必需部分。目前的拆分方案正在IETF的调整之中,下面的功能有望成为RFC标准的一部分:(1)拆分的NALU包按RTP序列增序传输;(2)有标示机制用于表明NALU拆分的第一个和最后一个拆分块;(3)存在一个机制用于检测在NALU边界内丢失的拆分块。一些NALU,如SEI NALU或参数集NALU,通常都非常小,最多几个字节。将它们和其他的NALU聚合到一个RTP包,可以减少IP/UDP/RTP协议栈的头开销,因此包聚合方案是必需的。聚合包存在两种基本类型:单时戳的聚合包(STAP),仅包含一个时间戳的多个NALU;多时戳的聚合包(MTAP),包含多个时间戳的NALU。STAP一般用于低时延环境,MTAP一般用于高时延环境,比如流应用。
四、结束语
H.264除了具有高效编码的特性,还引入了一些新工具用于提高错误恢复能力,特别是参数集、NAL上的NALU的概念、视频编码层的FMO和数据分割等都历史性地提高了在尽力而为的IP网络环境下视频通信的性能。传统的工具,如增强的参考图像选择和帧内编码模式内插都提高了在高误码环境中的数据再生能力。在某些情况下,它们与那些新工具的性能相当。尽管这样,如果缺少一个良好的视频比特流RTP封装方案,这些新旧工具对编码器仍然没有太大意义。H.264中RTP封装的草案规范,与H.264的NAL层紧密结合,提供了对数据封装的指导,它还附加了一些传输层的低开销机制用于NALU包的高效拆分和聚合。当联合使用这些工具时,可以达到更高的性能,在尽力而为的IP网络上进行高质量的视频压缩也将最终成为现实。