摘要:針對目前流媒體中視頻數據發送速度難以控制的問題,以當前廣泛使用的MPEG2視頻解碼模型為例,設計并實現了一種Linux下視頻流多播速率控制方法。這種方法能夠有效的控制服務器視頻數據的發送速率,具有占用服務器資源少,適應各種網絡要求的優點。經Linux平臺驗證結果表明,傳送視頻數據的網絡速度平穩,未出現視頻數據溢出現象,可以得到良好的視頻效果,具有很好的實用價值。
關鍵詞:視頻流;多播;速率控制;解碼器
中圖分類號:TP37文獻標識碼:A文章編號:1009-3044(2008)08-10ppp-0c
1 引言
隨著網絡、通信等技術的發展,流媒體技術在很多領域都得到了廣泛的應用,例如VOD、電視會議、遠程教育等,而流媒體技術的關鍵技術之一就是流媒體的網絡傳輸技術。一般來說,網絡傳輸方式包括單播、多播和廣播。與網絡單播和廣播技術相比,組播是一種優化使用帶寬的路由技術,允許數據流從一個源或多個源發送到多個目的地。采用組播技術后,應用僅發送每個數據包的一個拷貝給一組要接受信息的計算機,因而組播有助于控制網絡的流量,減少主機的處理量[1]。正是因為組播具有單播、廣播所不具有的優點,而流媒體又有流量大、實時性強的特點,所以組播技術在流媒體技術中得到了廣泛的應用。
從當今市場上來看,主流的流媒體技術產品有三種,分別是Microsoft的Windows Media Techology系統、Real Networks公司的Real System系統以及Apple的Quicktime系統[2]。盡管它們有些產品也具備了組播的功能,但是它們有一個缺點就是必須滿足它們自己的視頻壓縮格式,才能進行流媒體傳送。而本文的目的是只需有視頻的解碼器,就可以開發出適合自身需要的流媒體系統,這樣就可以滿足不同視頻壓縮格式文件網絡傳輸的需要。
如果視頻發送速率沒有得到有效的控制,當發送速率高于正常發送速率時,將會出現如圖1所示的情況,出現許多的馬賽克;當發送速率低于正常發送速率時,解碼器將會因為不能及時的解碼器而出現畫面暫停的現象。目前,視頻組播速率控制研究主要基于三種速率控制手段,即基于發送端的速率控制、基于接收端的速率控制和混合性速率控制的方法。發送端的速率控制方法主要基于反饋信息進行速率調節,可以適用于單播的方式或組播的方式。在基于接受端的速率控制中,發送方不參與速率控制,而由接受方通過增加和減少通道的數量來進行速率的調整。通常,這種方法用于采用可擴展編碼的組播的情況,組播的視頻流分為多層,每個層對應組播樹的一個通道。混合性速率控制的方法,兼有二者的特點,即接受方增加減少通道,而發送方同時根據反饋調整各個通道的速率[3]。
本文設計并實現了一種Linux下視頻流多播速率控制方法。這種方法屬于發送端的速率控制方法,基于實時解碼情況,得到反饋信息,從而實現視頻組播發送速率控制。這種方法以視頻解碼模型為基礎,以MPEG2為例,測試環境為局域網。在此基礎上,采用類比的方法,MPEG2壓縮格式可以推廣到MPEG4、H.263和H.264等視頻壓縮格式;同理,局域網環境也可以推廣到校園網、企業網等網絡環境。

圖1 原圖與發送速率高于正常發送速率的視頻對比圖
2 發送速率控制方法
如圖2所示,為一個局域網環境的連接圖。本方法由發送端來進行數據發送速率的控制,由服務器來完成。客戶端可以用視頻組播接收軟件如VLC、mplayer接收并播放,也可以自己編寫一個解碼器來進行網絡接收和視頻的播放。這種方法包含兩部分內容,分別是負責網絡組播的視頻組播發送程序,另一部分是負責網絡組播接收、視頻解碼、發送速率控制以及發送握手信息等功能。視頻組播發送程序運行服務器上,但用于速率控制的解碼程序可以放在局域網環境的任意一臺服務器或者PC上。

圖2 局域網連接示意圖
下面介紹一下這兩部分程序的工作原理及如何進行協同工作。整個方法的執行過程為:
(1)視頻組播發送程序首先讀取需要發送的一組視頻文件數據;
(2)視頻組播發送程序然后將這部分視頻數據組播至解碼程序;
(3)解碼程序在接收到視頻組播發送程序發送過來的組播數據之后進行解碼;
(4)解碼程序解碼完之后,如果:
①未解完一幀數據,則繼續,跳至5)繼續執行;
②解完一幀數據,判斷是否繼續執行,判斷的依據為:
(當前時間 - 上次顯示的時間) >= (1000000/幀率)… (依據1)
當滿足依據1的時候,則跳至(5)繼續執行,否則:
while((當前時間 - 上次顯示的時間) < 1000000/幀率)
{
執行空指令;
讀取當前時間;
}
注:上述的時間的單位均為微秒,執行空指令的作用為延時作用。
(5) 解碼程序將一個握手信息通過TCP連接發送至視頻組播發送程序;
(6) 視頻組播發送程序在接收到握手信息之后,如果未至視頻文件尾,則繼續讀取一組視頻數據,然后跳至(2)繼續執行,直至讀取視頻文件結束。
3 發送速率控制方法的實現
在上述講到,服務器程序由兩部分程序組成:視頻組播發送程序和MPEG2解碼程序。下面分別詳細介紹這兩部分程序的運行步驟和內容。本方法開發的環境為linux,采用gcc進行編譯,網絡連接圖如圖2所示。
3.1 視頻組播發送程序實現
下面介紹一下視頻組播發送程序的實現步驟:
(1)定義組播地址及端口號,定義發送緩沖區的容量為4KB(因為上述的解碼器每次處理4KB的數據),定義一個TCP連接用的端口號以及網絡的其它一些參數;
(2)建立一個基于UDP連接的組播用的套結字,綁定好相應的端口號;
(3)建立一個基于TCP連接的套結字,用于和解碼程序進行通信,然后進行端口綁定、連接以及監聽;
(4)讀取文件的4KB數據,通過UDP組播發送至解碼程序;
(5)等待解碼程序發送回來的握手信息(如hello信息),如果收到握手信息,重復(4)操作,否則一直等待解碼程序發送過來的握手信息(如hello信息);
(6) 直至文件結束,發送完數據為止。
3.2 解碼程序實現
解碼程序的實現是以開源軟件libmpeg2(http://libmpeg2.sourceforge.net/) 為原型,添加了網絡組播接收、發送速率控制以及發送握手信息功能。后面列出具體的函數名稱為libmpeg2開源軟件中的函數名稱。下面介紹一下解碼程序具體實現的程序流程:
(1)處理程序的輸入參數,調用handle_args()函數;
(2)初始化解碼器參數,給部分參數分配內存,調用mpeg2_init()和mpeg2_malloc_hooks()函數;
(3)判斷視頻的封裝形式:
1)如果是pva文件封裝格式,則調用pva_loop()函數;
2)如果是TS視頻流(一般是衛星電視傳送采取的格式),則調用ts_loop ()函數;
3)如果是PS視頻流(一般是DVD等所采取的格式),則調用ps_loop ()函數;
4)如果是ES純視頻流,則調用es_loop ()函數。
(4)解碼完畢,釋放分配的內存空間。
這里,MPEG2的封裝形式采用PS視頻流,因為這種封裝形式應用非常廣泛,例如VCD中的dat文件,DVD中的vob文件,都是采用PS視頻流結構。下面詳細介紹一下PS視頻流的處理過程及其步驟。
(1)定義組播地址及端口號,定義接收緩沖區的容量為4KB(因為解碼器每次處理4KB的數據,當然這個數據可調),定義一個TCP連接用的端口號以及網絡的其它一些參數;
(2)建立一個基于UDP連接的組播用的數據報套結字,綁定好相應的端口號;
(3)加入多播組;
(4)建立一個基于TCP連接的流式套結字,用于和視頻組播發送程序進行通信,然后進行端口綁定、連接以及監聽;
(5)監聽組播發送程序端口;
(6)等待視頻組播發送程序發過來的多播數據,如果有多播數據到達,則讀取組播發來的視頻流數據,否則,繼續等待;
(7)調用解視頻流封裝函數demux( )。demux( )函數主要內容為:
如果4K數據中包含視頻流數據,則調用mpeg2解碼器來對數據進行解碼,調用decode_mpeg2()函數。
(8)是否到文件結尾,如果是則結束,否則跳至(6)執行。
最后,介紹一下decode_mpeg2( )函數的運行步驟:
(1)分配內存空間給解碼器用,調用mpeg2_buffer( )函數;
(2)獲取視頻的頭信息,調用mpeg2_info( )函數;
(3)分析視頻流數據,獲取現在的狀態信息:
1)如果是序列頭(sequence)信息,則執行case STATE_SEQUENCE部分的內容;
2)如果是圖像頭信息,則執行case STATE_PICTURE部分的內容;
3)如果是slice信息,或者序列結束,或者無效的結尾標志,判斷是否解完一幀:
①如果未解完一幀數據,則跳出decode_mpeg2( )函數,繼續執行;
②如果解完一幀數據,則判斷是否繼續執行,判斷繼續執行的依據如依據1所述。如果滿足依據1則跳出decode_mpeg2( )函數,繼續執行,否則一直等待直至滿足依據1這個條件。
③如果不是參考幀,在顯示完后將解碼后的視頻數據丟棄,否則不能丟棄,用來作為參考幀的數據。
4 結果分析
測試結構如圖2所示,測試環境為linux,編譯和調試工具分別為gcc和gdb。經多次反復測試發現本程序不僅可以針對CIF、D1大小的圖像進行組播,還可以對高清節目(測試分辨率為1920* 1080i)進行組播,用戶接收效果良好,經多次測試,未出現任何跳幀、數據溢出的現象。下面只列出其中一組分別為CIF、D1和高清節目進行組播時的網絡接收速度的狀況圖,如圖3、4、5所示。圖中橫坐標為時間,縱坐標為客戶端的網絡接收速率。

圖3 CIF大小

圖4 D1大小

圖5 高清分辨率(1920* 1080i)大小
由于視頻組播發送程序和MPEG2解碼程序之間采取的是可靠的TCP連接,因此,除了極少數出現的網絡丟包情況外,端到端的丟包情況不存在,此外,也不存在緩沖區丟包的情況。
5 結論
本文設計并實現了一種Linux下視頻流多播速率控制方法。在linux環境下,用gcc進行了編譯,得以成功的實現。測試結果發現該方法不僅可以針對高清節目及以下任意分辨率的視頻進行組播發送,而且通過MEPG2的例子,還可以將這種方法擴充至對MPEG4、H.263、H.264等國際化標準的視頻壓縮格式的支持,具有良好的實用價值。
參考文獻:
[1]汪凡.組播技術概述[J].中國金融電腦,2001,(3):92-93.
[2]王萍,趙明,等.流式媒體中的關鍵技術[J].安徽大學學報,2006,(1):31.
[3]楊明川,解沖峰.Internet視頻傳輸中的關鍵技術分析[EB/OL].http://www.chinatelecom. com.cn,2002-12-27.
[4]Floyd S,Handley M,Padhye J,et al.Equation-Based Congestion Control for Unicast Applications[J].The Extended Version,2000,(2):147-163.
[5]李飛,楊林軍,王新,等.基于端系統的視頻流組播速率控制方法[J].計算機應用與軟件,2007,24(6):49-52.