曾嘉亮,張 杰
(1.汕頭職業(yè)技術(shù)學(xué)院機(jī)電工程系,廣東 汕頭 515078;2.汕頭大學(xué)計(jì)算機(jī)科學(xué)系,廣東 汕頭 515063)
在傳統(tǒng)的視頻傳輸和存儲(chǔ)系統(tǒng)中,視頻數(shù)據(jù)必須具有某種固定的時(shí)間和空間分辨力[1-2],以適應(yīng)所處系統(tǒng)的顯示和計(jì)算能力。由于現(xiàn)行網(wǎng)絡(luò)的帶寬跨越了一個(gè)很大的范圍[3],這種時(shí)、空分辨力固定的模式就導(dǎo)致網(wǎng)絡(luò)視頻應(yīng)用的種種問題:高分辨力的視頻在低端設(shè)備上處理不過來,低分辨力視頻在高端設(shè)備上的顯示效果很差;此外,還有錯(cuò)誤恢復(fù)的方法過于復(fù)雜等等[4]。
H.264/AVC[5]作為性能卓越的視頻編解碼技術(shù)標(biāo)準(zhǔn),在面對(duì)網(wǎng)絡(luò)視頻應(yīng)用時(shí),同樣存在上述問題。為此,JVT(Joint Video Team)提出了稱為可伸縮視頻編碼(Scalable Video Coding,SVC)[6-7]的解決方案。該方案允許應(yīng)用根據(jù)用戶的需要、網(wǎng)絡(luò)的帶寬以及終端的運(yùn)算能力等指標(biāo),從1個(gè)SVC碼流中提取出多個(gè)具有不同時(shí)間和空間分辨力的碼流,通過不同的網(wǎng)絡(luò)環(huán)境,送到各種終端進(jìn)行解碼播放,從而靈活地適應(yīng)多變的網(wǎng)絡(luò)環(huán)境和用戶需求。
SVC提供了時(shí)域、空域和精度等3方面的可伸縮編碼能力,代表了現(xiàn)代視頻編碼技術(shù)的發(fā)展趨勢(shì)。遺憾的是,SVC出現(xiàn)的時(shí)間較晚,目前許多視頻應(yīng)用中的H.264/AVC解碼器,大都早在SVC出現(xiàn)之前已經(jīng)投入應(yīng)用,因而無法直接兼容SVC碼流。要對(duì)這些解碼器進(jìn)行SVC解碼擴(kuò)展,所需成本無疑是巨大的。
通過對(duì)SVC各種方式[1,6]的詳細(xì)分析發(fā)現(xiàn):至少在時(shí)間維度上,可以在H.264/AVC基本檔次(Baseline Profile,BP,)編碼器上實(shí)現(xiàn)時(shí)域可伸縮編碼。
這一發(fā)現(xiàn)的意義在于:BP是所有的H.264/AVC解碼器都支持的一個(gè)檔次,一旦BP碼流包含時(shí)域可伸縮特性,則現(xiàn)有的解碼器不需任何修改,就能夠直接支持這種可伸縮性能。
H264/AVC基本檔次支持I幀、P幀以及多參考幀機(jī)制[5,8-9],而文獻(xiàn)[1]所列出的 3 種時(shí)域可伸縮編碼方案中,有1種是基于基本檔次編碼器的技術(shù)來實(shí)現(xiàn)的。
先來看看SVC是如何實(shí)現(xiàn)這種方案的。如圖1所示。圖1中,I0,P1~P16表示1個(gè)圖像組(GoP)中連續(xù)的17幀圖像,各幀上方帶箭頭的線段表示各幀間的參考關(guān)系。其中,I0的編碼預(yù)測(cè)模式為幀內(nèi)模式,因此沒有箭頭指向它,表明對(duì)它解碼不需參考其他幀;P1~P16的預(yù)測(cè)模式為幀間模式,因此每個(gè)P幀都被一個(gè)箭頭所指,箭頭的源端即該P(yáng)幀的參考幀,例如,P2的參考幀就是I0。
圖1 基于基本檔次的時(shí)域可伸縮編碼幀間預(yù)測(cè)模型
T0~T3表示時(shí)域?qū)蛹?jí):T0為時(shí)域基準(zhǔn)層;T1~T3為時(shí)域增強(qiáng)層。對(duì)于增強(qiáng)層T1~T3的各幀,在解碼時(shí)都必須參考其各個(gè)低層的幀[1]。
在SVC模型中,任何終端要想解碼時(shí)域可伸縮的視頻流,都必須先得到T0層的圖像。因此,服務(wù)器會(huì)先向各終端發(fā)送基準(zhǔn)層的數(shù)據(jù),然后根據(jù)不同終端所處網(wǎng)絡(luò)的帶寬及其該終端的運(yùn)算能力,來派發(fā)不同數(shù)目的增強(qiáng)層,這樣就實(shí)現(xiàn)了同一碼流對(duì)不同終端的時(shí)域可伸縮性。例如,圖1所示的編碼器輸出碼流,可以有4種不同的時(shí)域解碼方式,如圖2所示。
圖2 圖1所示視頻流的4種不同的時(shí)域解碼方式
SVC實(shí)現(xiàn)上述時(shí)域可伸縮方案,有2項(xiàng)關(guān)鍵技術(shù):
1)多參考幀機(jī)制
H.264/AVC的多參考幀機(jī)制,允許待編碼圖像在進(jìn)行幀間預(yù)測(cè)編碼時(shí)參考多個(gè)之前已編碼的圖像。該機(jī)制將參考幀分為長期參考和短期參考兩類:長期參考幀用于預(yù)測(cè)其后的多幀圖像,因此需要一直駐留在參考幀隊(duì)列中;而短期參考幀最多只能對(duì)其后面的5幀進(jìn)行預(yù)測(cè)[9],因此在參考幀隊(duì)列中停留的時(shí)間極短。
對(duì)于只含I,P幀的基本檔次碼流,編碼時(shí)只有1個(gè)參考幀隊(duì)列 list 0[8]。
引入多參考幀機(jī)制的本意,是通過增加參考幀數(shù)目來提高運(yùn)動(dòng)估計(jì)的匹配精度,從而提高壓縮效率。
但是在SVC中,這一機(jī)制被擴(kuò)展應(yīng)用,其作用變成將時(shí)域?qū)蛹?jí)比當(dāng)前幀低的圖像駐留在參考幀隊(duì)列中,以實(shí)現(xiàn)時(shí)域可伸縮編解碼。
以圖1中的I0為例,由于在解碼P2,P4和P8時(shí)都需要參考I0,因此I0必須作為長期參考幀,而P2只用作P3的參考幀,因此是1個(gè)典型的短期參考幀,解碼完P(guān)3后,就應(yīng)將P2移出參考幀隊(duì)列。
2)時(shí)域?qū)蛹?jí)
編碼器除了如上所述,負(fù)責(zé)確定各幀是長期還是短期參考幀,以及它們?cè)趨⒖紟?duì)列中的位置之外,還必須把這些信息通知給解碼器;解碼器依據(jù)此信息,對(duì)其參考幀隊(duì)列進(jìn)行與編碼器相同的控制動(dòng)作,以保證編解碼的一致性。
為了在傳輸參考幀隊(duì)列控制信息時(shí)盡量減少數(shù)據(jù)量,SVC定義了“時(shí)域?qū)蛹?jí)”這一概念,編碼器只需通知解碼器當(dāng)前幀所屬的時(shí)域?qū)蛹?jí),解碼器即可按照事先約定的步驟對(duì)參考幀隊(duì)列進(jìn)行操作,從而與編碼器保持一致。
以圖1中的P8為例,編碼器指定它為T0層,則在傳輸時(shí)域?qū)蛹?jí)信息時(shí),只需傳輸其編號(hào)0,解碼器就能恰當(dāng)?shù)剡M(jìn)行參考幀隊(duì)列的操作。
1.2節(jié)中所述的兩項(xiàng)關(guān)鍵技術(shù),1)屬于H.264/AVC基本檔次解碼器支持的技術(shù);而2)則是SVC新增的擴(kuò)展機(jī)制。
也就是說,對(duì)于2),基本檔次的解碼器無力解釋它,這就制約了上述時(shí)域可伸縮方案在H.264/AVC基本檔次中的實(shí)現(xiàn)。這一點(diǎn)正是本文所提交的方法要解決的問題。
如前所述,基本檔次編碼器無法實(shí)現(xiàn)圖1所示的時(shí)域可伸縮性,主要障礙在于:不支持時(shí)域?qū)蛹?jí)的句法,使編解碼雙方無法通過傳遞時(shí)域?qū)蛹?jí)來同步對(duì)參考幀隊(duì)列的操作。
實(shí)際上,在基本檔次編碼器的句法元素中,存在著時(shí)域?qū)蛹?jí)的替代品內(nèi)存管理控制操作。
內(nèi)存管理控制操作(Memory Management Control Operation,MMCO)是一組命令集,通過這一命令集,包括基本檔次編碼器在內(nèi)的所有H.264/AVC編碼器,就能夠指示解碼器對(duì)參考幀隊(duì)列進(jìn)行相應(yīng)操作。
內(nèi)存管理控制操作與時(shí)域?qū)蛹?jí),均是用于同步編解碼雙方對(duì)多參考幀隊(duì)列的操作。
二者的區(qū)別在于:使用時(shí)域?qū)蛹?jí)時(shí),僅需傳送其編號(hào),該編號(hào)所對(duì)應(yīng)的一組操作是編解碼雙方事先約定好的,不需傳輸;而使用內(nèi)存管理控制操作時(shí),編碼器對(duì)參考幀隊(duì)列每做一個(gè)操作,都必須發(fā)送一條對(duì)應(yīng)的MMCO命令。
可見,在實(shí)現(xiàn)圖1所示的時(shí)域可伸縮編碼方案時(shí),基本檔次編碼器雖然無法直接傳送時(shí)域?qū)蛹?jí),卻可以將時(shí)域?qū)蛹?jí)各編號(hào)所對(duì)應(yīng)的操作解析出來,用MMCO命令告知解碼器,從而令解碼器實(shí)現(xiàn)時(shí)域可伸縮解碼。
在基本檔次編碼器中使用MMCO命令實(shí)現(xiàn)圖1所示的可伸縮編碼方案,是一個(gè)繁復(fù)的過程,限于文章篇幅,為便于說明,將該方案簡化為2個(gè)時(shí)域?qū)蛹?jí),如圖3所示。
圖3 H.264/AVC基本檔次編碼器實(shí)現(xiàn)時(shí)域可伸縮編碼的方法
其中,BT0,BT1表示用基本檔次編碼器實(shí)現(xiàn)的時(shí)域?qū)蛹?jí),BT0對(duì)應(yīng)圖2中的T1,而BT1則對(duì)應(yīng)圖2的T3,也就是說,圖3所示的碼流有2種不同的時(shí)域解碼方式,如圖4所示。
圖4 圖3所示視頻流的2種不同的時(shí)域解碼方式
下面結(jié)合圖5,給出在基本檔次編碼器中,利用多參考幀和內(nèi)存管理控制操作機(jī)制實(shí)現(xiàn)圖3所示碼流編碼方案的詳細(xì)步驟[5,8-9]。
圖5 2個(gè)時(shí)域?qū)蛹?jí)的時(shí)域可伸縮編碼參考幀隊(duì)列l(wèi)ist0的管理
1)編碼前,設(shè)置參考幀數(shù)目為2。
2)編完I0后,將其long_term_reference_flag標(biāo)志設(shè)為1,以通知解碼器,該幀為長期參考幀,且其長期參考幀索引值為0,如圖5中a所示。
3)編完P(guān)1后,將其adaptive_ref_pic_marking_mode_flag標(biāo)志均置為0,解碼器收到該標(biāo)志后,將P1設(shè)置為短期參考幀,推入?yún)⒖紟?duì)列l(wèi)ist 0的位置[0]處;并將I0推入?yún)⒖紟?duì)列l(wèi)ist 0的位置[1]處,如圖5中b所示。
對(duì)P1后面的所有短期參考幀,編碼器都執(zhí)行步驟3),解碼器就會(huì)將當(dāng)前短期參考幀覆蓋掉先前位于list 0[0]處的短期參考幀;并保持I0的位置list 0[1]不動(dòng),如圖5中 c,d,f所示。
4)編完P(guān)4后,將其adaptive_ref_pic_marking_mode_flag標(biāo)志均置為1,以告知解碼器:該幀為長期參考幀;緊跟著發(fā)出如下3個(gè)MMCO命令:
(1)memory_management_control_operation=6,該值非0,表示MMCO指令開始,該值為6是告訴解碼器:后面馬上要給當(dāng)前幀指定1個(gè)長期參考幀索引值;
(2)long_term_frame_idx=0,明確指出P4的長期參考幀索引值與I0相同,均為0,這樣解碼器就會(huì)將P4置于list 0[1]處,覆蓋掉 I0;
(3)memory_management_control_operation=0,該值為0是告知解碼器:MMCO指令結(jié)束了。
對(duì)P4后面的所有長期參考幀,編碼器都執(zhí)行步驟4),以令解碼器將當(dāng)前長期參考幀覆蓋掉先前位于list 0[1]處的長期參考幀,如圖5中e所示。
其余步驟可按上述4步進(jìn)行類推后得出。
顯然,將該例加以推廣,只要將參考幀數(shù)目增加到4,并輔以相應(yīng)的MMCO指令,就完全可以在基本檔次的H.264/AVC編碼器中實(shí)現(xiàn)圖1所示的時(shí)域可伸縮編碼方案。
本實(shí)驗(yàn)采用開源的H264/AVC編碼器[10]和解碼器[11]。對(duì)編碼器進(jìn)行修改,以實(shí)現(xiàn)2.3所述編碼方案。解碼器則不做任何修改。
修改后的編碼器輸出2個(gè)碼流,理論上這2個(gè)碼流應(yīng)與圖4一致。但是在實(shí)現(xiàn)上需要對(duì)碼流BT0做一個(gè)折中,如圖6所示。
圖6 編碼器實(shí)際輸出的2種不同的時(shí)域?qū)蛹?jí)碼流
對(duì)比圖4和圖6,不難看出:BT1'和BT1完全相同,而BT0'則須比BT0多傳1個(gè)P1幀。這樣折中的目的是利用P1幀讓BT0'端的解碼器將I0、P4等長期參考幀推入list 0[1]這個(gè)位置。
對(duì)CIF格式的測(cè)試視頻文件“foreman.yuv”截取前17幀YUV數(shù)據(jù)進(jìn)行編碼,生成圖6所示碼流BT0'和BT1',然后用解碼器對(duì)BT0'和BT1'分別解碼,在解碼輸出的2個(gè)數(shù)據(jù)流中截取對(duì)應(yīng)于長期參考幀I0,P4,P8,P12,P16的YUV數(shù)據(jù),利用文件對(duì)比工具[12]進(jìn)行二進(jìn)制比較,結(jié)果表明,從2個(gè)不同時(shí)域?qū)蛹?jí)碼流解出的所有長期參考幀的圖像數(shù)據(jù),對(duì)比結(jié)果均為“二進(jìn)制相同”[12]。
另外,使用通用的H.264/AVC碼流播放器[13]對(duì)BT0'和BT1'進(jìn)行直接播放,所有圖像均能正常顯示。
上述結(jié)果表明,對(duì)于本文所提交的方案生成的時(shí)域可伸縮碼流,解碼器不需做任何修改就可以直接解碼,并且不同時(shí)域?qū)蛹?jí)解碼器解出來的同一時(shí)間點(diǎn)上的圖像,內(nèi)容完全一致。
本文提出一種在H.264/AVC基本檔次編碼器中實(shí)現(xiàn)時(shí)域可伸縮編碼的方案,該方案利用H.264/AVC標(biāo)準(zhǔn)所提供的多參考幀和內(nèi)存管理控制操作等機(jī)制,實(shí)現(xiàn)了時(shí)域可伸縮性。
理論分析及實(shí)驗(yàn)結(jié)果表明,現(xiàn)有的H.264/AVC解碼器,不需任何修改,就可直接解碼由本方案生成的時(shí)域可伸縮碼流。
本方案允許視頻服務(wù)器根據(jù)用戶需要、網(wǎng)絡(luò)帶寬以及終端運(yùn)算能力等指標(biāo),從全碼流中提取出多個(gè)具有不同時(shí)間分辨力的子碼流,送到各種終端進(jìn)行解碼播放;以極低的代價(jià)實(shí)現(xiàn)了視頻服務(wù)器對(duì)多變的網(wǎng)絡(luò)環(huán)境和用戶需求的適應(yīng)能力。
[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]林福宗.多媒體技術(shù)基礎(chǔ)[M].3版.北京:清華大學(xué)出版社,2012.
[3]鄢欣萌,何小海,曾強(qiáng)宇,等.基于SVC碼流自適應(yīng)機(jī)制的視頻轉(zhuǎn)碼技術(shù)[J].電視技術(shù),2010,34(1):22-25.
[4]袁濤,樊豐.無線網(wǎng)絡(luò)中基于H.264/SVC的RoI視頻流傳輸[J].電視技術(shù),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.