曾嘉亮,张 杰
(1.汕头职业技术学院机电工程系,广东 汕头 515078;2.汕头大学计算机科学系,广东 汕头 515063)
在传统的视频传输和存储系统中,视频数据必须具有某种固定的时间和空间分辨力[1-2],以适应所处系统的显示和计算能力。由于现行网络的带宽跨越了一个很大的范围[3],这种时、空分辨力固定的模式就导致网络视频应用的种种问题:高分辨力的视频在低端设备上处理不过来,低分辨力视频在高端设备上的显示效果很差;此外,还有错误恢复的方法过于复杂等等[4]。
H.264/AVC[5]作为性能卓越的视频编解码技术标准,在面对网络视频应用时,同样存在上述问题。为此,JVT(Joint Video Team)提出了称为可伸缩视频编码(Scalable Video Coding,SVC)[6-7]的解决方案。该方案允许应用根据用户的需要、网络的带宽以及终端的运算能力等指标,从1个SVC码流中提取出多个具有不同时间和空间分辨力的码流,通过不同的网络环境,送到各种终端进行解码播放,从而灵活地适应多变的网络环境和用户需求。
SVC提供了时域、空域和精度等3方面的可伸缩编码能力,代表了现代视频编码技术的发展趋势。遗憾的是,SVC出现的时间较晚,目前许多视频应用中的H.264/AVC解码器,大都早在SVC出现之前已经投入应用,因而无法直接兼容SVC码流。要对这些解码器进行SVC解码扩展,所需成本无疑是巨大的。
通过对SVC各种方式[1,6]的详细分析发现:至少在时间维度上,可以在H.264/AVC基本档次(Baseline Profile,BP,)编码器上实现时域可伸缩编码。
这一发现的意义在于:BP是所有的H.264/AVC解码器都支持的一个档次,一旦BP码流包含时域可伸缩特性,则现有的解码器不需任何修改,就能够直接支持这种可伸缩性能。
H264/AVC基本档次支持I帧、P帧以及多参考帧机制[5,8-9],而文献[1]所列出的 3 种时域可伸缩编码方案中,有1种是基于基本档次编码器的技术来实现的。
先来看看SVC是如何实现这种方案的。如图1所示。图1中,I0,P1~P16表示1个图像组(GoP)中连续的17帧图像,各帧上方带箭头的线段表示各帧间的参考关系。其中,I0的编码预测模式为帧内模式,因此没有箭头指向它,表明对它解码不需参考其他帧;P1~P16的预测模式为帧间模式,因此每个P帧都被一个箭头所指,箭头的源端即该P帧的参考帧,例如,P2的参考帧就是I0。
图1 基于基本档次的时域可伸缩编码帧间预测模型
T0~T3表示时域层级:T0为时域基准层;T1~T3为时域增强层。对于增强层T1~T3的各帧,在解码时都必须参考其各个低层的帧[1]。
在SVC模型中,任何终端要想解码时域可伸缩的视频流,都必须先得到T0层的图像。因此,服务器会先向各终端发送基准层的数据,然后根据不同终端所处网络的带宽及其该终端的运算能力,来派发不同数目的增强层,这样就实现了同一码流对不同终端的时域可伸缩性。例如,图1所示的编码器输出码流,可以有4种不同的时域解码方式,如图2所示。
图2 图1所示视频流的4种不同的时域解码方式
SVC实现上述时域可伸缩方案,有2项关键技术:
1)多参考帧机制
H.264/AVC的多参考帧机制,允许待编码图像在进行帧间预测编码时参考多个之前已编码的图像。该机制将参考帧分为长期参考和短期参考两类:长期参考帧用于预测其后的多帧图像,因此需要一直驻留在参考帧队列中;而短期参考帧最多只能对其后面的5帧进行预测[9],因此在参考帧队列中停留的时间极短。
对于只含I,P帧的基本档次码流,编码时只有1个参考帧队列 list 0[8]。
引入多参考帧机制的本意,是通过增加参考帧数目来提高运动估计的匹配精度,从而提高压缩效率。
但是在SVC中,这一机制被扩展应用,其作用变成将时域层级比当前帧低的图像驻留在参考帧队列中,以实现时域可伸缩编解码。
以图1中的I0为例,由于在解码P2,P4和P8时都需要参考I0,因此I0必须作为长期参考帧,而P2只用作P3的参考帧,因此是1个典型的短期参考帧,解码完P3后,就应将P2移出参考帧队列。
2)时域层级
编码器除了如上所述,负责确定各帧是长期还是短期参考帧,以及它们在参考帧队列中的位置之外,还必须把这些信息通知给解码器;解码器依据此信息,对其参考帧队列进行与编码器相同的控制动作,以保证编解码的一致性。
为了在传输参考帧队列控制信息时尽量减少数据量,SVC定义了“时域层级”这一概念,编码器只需通知解码器当前帧所属的时域层级,解码器即可按照事先约定的步骤对参考帧队列进行操作,从而与编码器保持一致。
以图1中的P8为例,编码器指定它为T0层,则在传输时域层级信息时,只需传输其编号0,解码器就能恰当地进行参考帧队列的操作。
1.2节中所述的两项关键技术,1)属于H.264/AVC基本档次解码器支持的技术;而2)则是SVC新增的扩展机制。
也就是说,对于2),基本档次的解码器无力解释它,这就制约了上述时域可伸缩方案在H.264/AVC基本档次中的实现。这一点正是本文所提交的方法要解决的问题。
如前所述,基本档次编码器无法实现图1所示的时域可伸缩性,主要障碍在于:不支持时域层级的句法,使编解码双方无法通过传递时域层级来同步对参考帧队列的操作。
实际上,在基本档次编码器的句法元素中,存在着时域层级的替代品内存管理控制操作。
内存管理控制操作(Memory Management Control Operation,MMCO)是一组命令集,通过这一命令集,包括基本档次编码器在内的所有H.264/AVC编码器,就能够指示解码器对参考帧队列进行相应操作。
内存管理控制操作与时域层级,均是用于同步编解码双方对多参考帧队列的操作。
二者的区别在于:使用时域层级时,仅需传送其编号,该编号所对应的一组操作是编解码双方事先约定好的,不需传输;而使用内存管理控制操作时,编码器对参考帧队列每做一个操作,都必须发送一条对应的MMCO命令。
可见,在实现图1所示的时域可伸缩编码方案时,基本档次编码器虽然无法直接传送时域层级,却可以将时域层级各编号所对应的操作解析出来,用MMCO命令告知解码器,从而令解码器实现时域可伸缩解码。
在基本档次编码器中使用MMCO命令实现图1所示的可伸缩编码方案,是一个繁复的过程,限于文章篇幅,为便于说明,将该方案简化为2个时域层级,如图3所示。
图3 H.264/AVC基本档次编码器实现时域可伸缩编码的方法
其中,BT0,BT1表示用基本档次编码器实现的时域层级,BT0对应图2中的T1,而BT1则对应图2的T3,也就是说,图3所示的码流有2种不同的时域解码方式,如图4所示。
图4 图3所示视频流的2种不同的时域解码方式
下面结合图5,给出在基本档次编码器中,利用多参考帧和内存管理控制操作机制实现图3所示码流编码方案的详细步骤[5,8-9]。
图5 2个时域层级的时域可伸缩编码参考帧队列list0的管理
1)编码前,设置参考帧数目为2。
2)编完I0后,将其long_term_reference_flag标志设为1,以通知解码器,该帧为长期参考帧,且其长期参考帧索引值为0,如图5中a所示。
3)编完P1后,将其adaptive_ref_pic_marking_mode_flag标志均置为0,解码器收到该标志后,将P1设置为短期参考帧,推入参考帧队列list 0的位置[0]处;并将I0推入参考帧队列list 0的位置[1]处,如图5中b所示。
对P1后面的所有短期参考帧,编码器都执行步骤3),解码器就会将当前短期参考帧覆盖掉先前位于list 0[0]处的短期参考帧;并保持I0的位置list 0[1]不动,如图5中 c,d,f所示。
4)编完P4后,将其adaptive_ref_pic_marking_mode_flag标志均置为1,以告知解码器:该帧为长期参考帧;紧跟着发出如下3个MMCO命令:
(1)memory_management_control_operation=6,该值非0,表示MMCO指令开始,该值为6是告诉解码器:后面马上要给当前帧指定1个长期参考帧索引值;
(2)long_term_frame_idx=0,明确指出P4的长期参考帧索引值与I0相同,均为0,这样解码器就会将P4置于list 0[1]处,覆盖掉 I0;
(3)memory_management_control_operation=0,该值为0是告知解码器:MMCO指令结束了。
对P4后面的所有长期参考帧,编码器都执行步骤4),以令解码器将当前长期参考帧覆盖掉先前位于list 0[1]处的长期参考帧,如图5中e所示。
其余步骤可按上述4步进行类推后得出。
显然,将该例加以推广,只要将参考帧数目增加到4,并辅以相应的MMCO指令,就完全可以在基本档次的H.264/AVC编码器中实现图1所示的时域可伸缩编码方案。
本实验采用开源的H264/AVC编码器[10]和解码器[11]。对编码器进行修改,以实现2.3所述编码方案。解码器则不做任何修改。
修改后的编码器输出2个码流,理论上这2个码流应与图4一致。但是在实现上需要对码流BT0做一个折中,如图6所示。
图6 编码器实际输出的2种不同的时域层级码流
对比图4和图6,不难看出:BT1'和BT1完全相同,而BT0'则须比BT0多传1个P1帧。这样折中的目的是利用P1帧让BT0'端的解码器将I0、P4等长期参考帧推入list 0[1]这个位置。
对CIF格式的测试视频文件“foreman.yuv”截取前17帧YUV数据进行编码,生成图6所示码流BT0'和BT1',然后用解码器对BT0'和BT1'分别解码,在解码输出的2个数据流中截取对应于长期参考帧I0,P4,P8,P12,P16的YUV数据,利用文件对比工具[12]进行二进制比较,结果表明,从2个不同时域层级码流解出的所有长期参考帧的图像数据,对比结果均为“二进制相同”[12]。
另外,使用通用的H.264/AVC码流播放器[13]对BT0'和BT1'进行直接播放,所有图像均能正常显示。
上述结果表明,对于本文所提交的方案生成的时域可伸缩码流,解码器不需做任何修改就可以直接解码,并且不同时域层级解码器解出来的同一时间点上的图像,内容完全一致。
本文提出一种在H.264/AVC基本档次编码器中实现时域可伸缩编码的方案,该方案利用H.264/AVC标准所提供的多参考帧和内存管理控制操作等机制,实现了时域可伸缩性。
理论分析及实验结果表明,现有的H.264/AVC解码器,不需任何修改,就可直接解码由本方案生成的时域可伸缩码流。
本方案允许视频服务器根据用户需要、网络带宽以及终端运算能力等指标,从全码流中提取出多个具有不同时间分辨力的子码流,送到各种终端进行解码播放;以极低的代价实现了视频服务器对多变的网络环境和用户需求的适应能力。
[1]SCHWARZ H,MARPE D,WIEGAND T.Overview of the scalable video coding extension of the H.264/AVC standard[J].Circuits And Systems For Video Technology,2007,17(9):1103-1120.
[2]林福宗.多媒体技术基础[M].3版.北京:清华大学出版社,2012.
[3]鄢欣萌,何小海,曾强宇,等.基于SVC码流自适应机制的视频转码技术[J].电视技术,2010,34(1):22-25.
[4]袁涛,樊丰.无线网络中基于H.264/SVC的RoI视频流传输[J].电视技术,2011,35(5):29-34.
[5]ITU-T and ISO/IEC JTC 1,Advanced video coding for generic audiovisual services ITU-T recommendation H.264 and ISO/IEC 14496-10(MPEG4-AVC)[S].2007.
[6]JVT-T202,Joint scalable video model JSVM-7[S].2006.
[7]RICHARDSON I E G.H.264 and MPEG-4 video compression[M].UK:John Wiley&Sons Ltd,2003.
[8]RICHARDSON I E G.H.264_MPEG-4 part 10 white paper[EB/OL].[2012-04-01].http://www.vcodex.com.
[9]钟似玢,曾嘉亮.一种视频压缩方法:中国,200810216851.4[P/OL].[2012-04-01].http://211.157.104.87:8080/sipo/zljs/hyjs-yx-new.jsp?recid=CN200810216851.4&leixin=fmzl&title=一种视频压缩方法 &ipc=H04N7/32(2006.01)I.
[10]X264 software[EB/OL].[2012-05-01].ftp://ftp.videolan.org/pub/videolan/x264/snapshots.
[11]FFMPEG software[EB/OL].[2012-04-30].http://ffmpeg.org.
[12]Beyond compare software[EB/OL].[2012-04-30].http://www.scootersoftware.com.
[13]Elecard streameye application[EB/OL].[2012-04-30].http://www.elecard.com.