唐貴進(jìn),朱秀昌
(南京郵電大學(xué) 江蘇省圖像處理與圖像通信重點(diǎn)實驗室,江蘇 南京 210003)
責(zé)任編輯:哈宏疆
隨著通信技術(shù)的不斷發(fā)展,現(xiàn)有網(wǎng)絡(luò)的帶寬和傳輸質(zhì)量都得到了很大的提高,然而丟包問題依然是通信網(wǎng)絡(luò)研究領(lǐng)域中不可避免的問題[1-2]。一般來說,當(dāng)數(shù)據(jù)包在網(wǎng)絡(luò)上傳輸時,發(fā)生丟包的原因大致有兩個:擁塞丟包與無線鏈路差錯丟包。前者發(fā)生的主要原因是網(wǎng)絡(luò)上數(shù)據(jù)傳輸量過大,導(dǎo)致網(wǎng)絡(luò)設(shè)備傳送處理不及時,使得設(shè)備隊列緩沖區(qū)溢出而丟包。這往往造成突發(fā)丟包(即連續(xù)丟包)。后者的發(fā)生又大致分為兩種情況,一種是受隨機(jī)差錯(如高斯白噪聲)的影響從而造成隨機(jī)丟包,另一種則是由于移動信號的多徑和快衰落等從而造成連續(xù)丟包。
H.264是國際電信聯(lián)盟ITU-T和國際標(biāo)準(zhǔn)化組織ISO聯(lián)合開發(fā)的新一代視頻壓縮編碼標(biāo)準(zhǔn),JM(jointmod?el)[3]是其官方測試源代碼,它實現(xiàn)了H.264的所有特性。H.264碼流文件有兩種格式,分別為附錄B格式和RTP打包格式,分別用于模擬數(shù)據(jù)存儲在介質(zhì)(如DVD光盤)上和網(wǎng)絡(luò)傳輸環(huán)境中。對于前者,一般不必考慮數(shù)據(jù)丟失,而對于后者,由于網(wǎng)絡(luò)的不確定性,往往有數(shù)據(jù)包丟失[4-6]。為了研究丟包對重建視頻質(zhì)量的影響,從JM13.0模型開始,增加了名稱為rtp_loss的丟包工具,可以對RTP打包格式的H.264碼流進(jìn)行丟包。然而,本文在模擬丟包時發(fā)現(xiàn),此丟包工具存在如下3個問題:1)實際的丟包率與所設(shè)定的預(yù)期值經(jīng)常會有偏差,且偏差在百分之十以上,當(dāng)RTP數(shù)據(jù)包較少時,偏差將更為明顯;2)只能模擬隨機(jī)丟包,不能模擬突發(fā)丟包;3)在丟包率不變的情況下,對同一個碼流進(jìn)行多次丟包實驗,則每次實驗丟棄包的序號總是一樣的,達(dá)不到隨機(jī)的效果。本文將對以上3個問題進(jìn)行分析并提出改進(jìn)方法。
JM模型中對網(wǎng)絡(luò)抽象層單元(Net Abstract Layer Unit,NALU)的RTP封裝方案稱為“簡單包”方案(即直接將一個NALU放進(jìn)一個RTP包),而沒有采用復(fù)雜的RFC3984[7]的方案(依據(jù)RFC3984,可以將多個NALU放進(jìn)一個RTP包或者將一個NALU拆開放進(jìn)多個RTP包中)。對于RTP包,采用RFC3550【8】格式封裝,具體如圖1所示。
圖1 把一個NALU封裝進(jìn)一個RTP包
對于已經(jīng)封裝好的RTP包,JM中對其又進(jìn)行了再次封裝(這里將此封裝樣式稱為寫文件包),然后寫入文件中。此處再次封裝的格式為(見圖2):先寫4 byte的包長,之后是4 byte的時間戳,但這個時間戳是固定值,恒為-1(即0XFF FF FF FF),最后是數(shù)據(jù)體(即RTP包)。每個RTP包寫入文件的封裝依此類推。
圖2 把RTP包再次封裝
1.2.1 丟包算法流程
在JM的丟包算法中,包含3個必需參數(shù)和1個可選參數(shù),其中3個必需參數(shù)為:參數(shù)1表示H.264的碼流文件,參數(shù)2表示生成的有丟包的H.264文件,參數(shù)3表示設(shè)定的丟包率,1個可選參數(shù)表示從碼流文件的第多少個包后可以開始丟包,即一開始保留多少包不允許丟棄。具體流程如圖3所示。
1.2.2 問題分析
對于實際的丟包率與所設(shè)定的預(yù)期值經(jīng)常會有偏差問題,從圖3中可以看出,JM模型的丟包算法是基于大數(shù)定律的,其內(nèi)容就是在試驗不變的條件下,重復(fù)試驗多次,隨機(jī)事件的頻率近似于它的概率。結(jié)合此算法,就是丟包的數(shù)目應(yīng)該等于設(shè)定的丟包率。而大數(shù)定理的基本條件就是實驗要重復(fù)多次,也就是說數(shù)據(jù)包的數(shù)目要盡可能的多,一旦H.264碼流文件中RTP包數(shù)目較少,則實際的丟包數(shù)往往與設(shè)定的不能一致。RTP包的數(shù)目越少,這種不一致的現(xiàn)象表現(xiàn)得越明顯。
對于不能模擬突發(fā)丟包問題則比較簡單,從圖3的流程中可以看出,此算法中沒有此功能。
至于在相同丟包率條件下對同一個碼流進(jìn)行多次丟包時丟棄包的序號相同的問題可以這樣解釋:在圖3中有一個“產(chǎn)生一個0~100之間隨機(jī)數(shù)”的功能模塊,其在具體代碼實現(xiàn)過程中直接調(diào)用的rand()函數(shù)。而rand()函數(shù)在生成隨機(jī)數(shù)序列時,需要一個稱為“隨機(jī)數(shù)種子”的參數(shù),如果每次實驗時這個參數(shù)值一樣,則每次實驗產(chǎn)生的隨機(jī)數(shù)序列也將一樣,反之,則不一樣。如果未設(shè)定隨機(jī)數(shù)種子,rand()函數(shù)在調(diào)用時會自動設(shè)隨機(jī)數(shù)種子為1,而JM丟包算法的代碼中恰恰沒有設(shè)定隨機(jī)數(shù)種子,因此,每次實驗時種子參數(shù)值都相同,從而導(dǎo)致在丟包率不變的情況下,對同一個碼流做多次丟包實驗,其每次產(chǎn)生的丟包序列的序號將完全一樣。
鑒于以上分析,提出了本文對解決這3個問題的改進(jìn)算法。
針對前面所述3個問題,筆者提出了解決辦法,現(xiàn)分別敘述之:
1)對于丟包數(shù)不準(zhǔn)確,采用了先計算出丟包數(shù),再嚴(yán)格按照丟包數(shù)隨機(jī)丟包的方法。具體步驟如下:
步驟(1):首先讀取H.264碼流文件,統(tǒng)計其寫文件包的總數(shù)N總。
步驟(2):根據(jù)設(shè)定的丟包率RLS和N總,確定丟包數(shù)N L。
步驟(3):產(chǎn)生一個Nstart-N總之間的隨機(jī)數(shù)ilost,并置序號為ilost的寫文件包的標(biāo)志位為“l(fā)ost”標(biāo)志,其中
步驟(4):重復(fù)步驟3)的過程(如果新產(chǎn)生的隨機(jī)數(shù)與先前產(chǎn)生的隨機(jī)數(shù)相同或者相近,則重新產(chǎn)生隨機(jī)數(shù),以避免同一個數(shù)據(jù)包要被丟棄兩次以及使丟包的序號看起來更加的隨機(jī)),直至共設(shè)置了NL個“l(fā)ost”標(biāo)志位。
步驟(5):依次讀取H.264碼流文件的寫文件包,如果此包的標(biāo)志位為“l(fā)ost”,則丟棄該包,否則將該包寫入到丟包的H.264碼流文件中,直至文件讀取結(jié)束。
2)對于突發(fā)丟包,采用Gilbert-Elliott模型[9](簡稱GE模型,見圖4)生成。
在GE模型中,PG表示當(dāng)傳輸通道處于“好”(G)狀態(tài)時發(fā)生數(shù)據(jù)包遺失的概率;PB表示當(dāng)傳輸通道處于“壞”(B)狀態(tài)時發(fā)生數(shù)據(jù)包遺失的概率;PGB代表傳輸通道的狀態(tài)從好變成壞的概率;PBG代表傳輸通道的狀態(tài)從壞變成好的概率。在穩(wěn)態(tài)的情形下,傳輸通道處于“好”的狀態(tài)和“壞”的狀態(tài)的概率分別為
因此,對于GE模型而言,整體的平均丟包率為
3)對于每次實驗結(jié)果都一致的問題,采取給rand函數(shù)每次實驗時賦不同隨機(jī)數(shù)種子的方法。這個賦值工作在程序中借助srand函數(shù)完成,調(diào)用srand函數(shù)將會把其參數(shù)值傳遞給rand函數(shù)的種子。而為了讓每次運(yùn)行程序的種子值是不同的,可以用time函數(shù)的返回值作為srand函數(shù)的參數(shù),time函數(shù)返回從1970年1月1日零時零分零秒到目前為止(即程序執(zhí)行時)所經(jīng)過的時間,單位為秒。因為每次運(yùn)行程序的時間是不同的,從而保證了每次實驗時種子值是不同的,也就保證了每次實驗生成的丟包序號的不一樣。
下面采用JM15.0對視頻foreman.cif進(jìn)行編碼,編碼結(jié)構(gòu)為IPPP…,GoP大小為15,QPISlice和QPPSlice均為28,RTP打包方式,每個包長設(shè)為100 byte。具體測得的實際丟包率如表1所示。
表1 不同幀數(shù)、不同丟包率下本文算法與原算法的實際丟包率
根據(jù)表1的數(shù)據(jù),計算出兩個算法的實際丟包率RLA與設(shè)定丟包率RLS的差值RΔ,計算公式為
將差值RΔ圖形化表示,結(jié)果如圖5所示。
由圖4可見,JM中算法的實際丟包率與設(shè)定丟包率之間的差值較大,而且當(dāng)幀數(shù)較少(即相應(yīng)的編碼生成的數(shù)據(jù)包較少)時,差值往往更大。而本文算法的差值則遠(yuǎn)小于原來的算法,差值絕大多數(shù)都圍繞在0的附近。
接下來測試突發(fā)丟包模塊以及每次實驗所得序列是否不同。以100幀foreman.cif碼流為測試對象,設(shè)定丟包率為1%。丟包結(jié)果如表2所示。
表2 不同實驗下本文算法與原算法的丟包序列
從表2中可以看出,本文的突發(fā)丟包模塊能夠正確地模擬連續(xù)的丟包。同時,原算法每次實驗時丟包序列都一樣,而本文算法,不管是隨機(jī)丟包還是突發(fā)丟包,每次實驗結(jié)果都不一樣,從而達(dá)到了“隨機(jī)”的目的。
盡管網(wǎng)絡(luò)通信技術(shù)發(fā)展迅猛,但是數(shù)據(jù)丟包始終是其無法回避的問題。本文對H.264建議的參考軟件JM模型中丟包算法進(jìn)行了研究,分析了其存在的問題,并提出了相應(yīng)的解決辦法。實驗結(jié)果表明,本文的算法能夠比較精確地進(jìn)行隨機(jī)丟包和突發(fā)丟包,并具有隨機(jī)的效果。
[1]李秀敏,王立,李桂苓.數(shù)字電視傳送流丟包和丟包率研究[J].電視技術(shù),2005,29(6):43-45.
[2]盧劉明,陸肖元.基于網(wǎng)絡(luò)丟包的網(wǎng)絡(luò)視頻質(zhì)量評估[J].中國圖象圖形學(xué)報,2009,14(1):52-58.
[3]H.264/AVC Reference Software[EB/OL].[2010-06-01].http://iphome.hhi.de/suehring/tml/.
[4]LIN T-L,COSMAN P C,REIBMAN A R.Perceptual Impactof Bursty Versus Isolated Packet Losses in H.264 Compressed Video[C]//Proc.15th IEEE International Conference on Image Processing.[S.l.]:IEEE Press,2008:2780-2783.
[5]KANUMURI S,SUBRAMANIAN S G,COSMAN P C,et al.Predicting H.264 packetloss visibility using a generalized linear model[C]//IEEE International Conference on Image Processing,2006.[S.l.]:IEEE Press,2006:2245-2248.
[6]楊林濤,江昊,郭成城,等.基于Markov鏈Packet-Level的VANET差錯預(yù)測模型及性能預(yù)估[J].電子學(xué)報,2009,37(10):2333-2337.
[7]WENGER S,HANNUKSELA M M,STOCKHAMMER T,et al.RTP payload formatfor H.264 video:RFC3984[S].2005.
[8]SCHULZRINNE H,CASNER S,F(xiàn)REDERICK R,etal.RTP:A transport protocolforreal-time applications:RFC 3550[S].2003.
[9]EBERT J-P,WILLIG A.A gilbert-elliotbiterrormodeland the efficient use in packetlevelsimulation:TKN-99-002[R].Berlin:TKN,1999.