摘要:利用Java媒體框架(JMF)開發的視頻點播系統具有開發簡單#65380;跨平臺#65380;提供QoS保證和交互性好等優點,具有廣泛的應用前景#65377;介紹了JMF應用編程接口的特點和結構,闡述了基于JMF開發的跨平臺的視頻點播系統的整體結構設計,并詳細介紹了基于RTP的實時媒體傳輸#65380;基于RTCP的擁塞控制#65380;完整VCR操作和穿越NAT等關鍵技術的具體實現#65377;
關鍵詞:Java媒體框架;視頻點播;實時傳輸協議
中圖分類號:TP393文獻標志碼:A
文章編號:1001-3695(2007)04-0235-04
0引言
隨著網絡帶寬的拓寬和計算機技術的發展,以視頻點播為代表的實時流媒體業務得到了飛速的發展#65377;視頻點播業務以豐富的內容#65380;自主的點播形式等特點受到了廣大網絡用戶的歡迎#65377;但是,現今市場上的視頻點播系統還有許多缺點:①不支持跨平臺應用部署#65377;通常的系統服務器端為Linux,客戶端為Windows,如需要改變其部署操作系統,則需要重新開發#65377;②直接采用UDP或TCP進行流媒體數據的傳輸,沒有一定的QoS保證#65377;③VCR操作簡單,不支持穿越NAT等#65377;
Java語言具有跨平臺可移植性,在網絡上應用廣泛而且靈活#65377;Sun公司推出的Java語言的媒體軟件開發包JMF(Java Media Framework,Java媒體框架[1])使得流媒體應用開發變得簡單#65377;基于JMF的優點,筆者設計開發了一個跨平臺的視頻點播系統,這個系統具有開發簡單#65380;成本低;跨平臺#65380;可移植性好;采用實時傳輸協議[2](RTP/RTCP)進行流媒體數據傳輸,服務質量(QoS)有保證;提供完整的VCR控制操作,交互性好;支持穿越NAT等優點#65377;
1JMF介紹
JMF是一個把音頻#65380;視頻及其他基于時間的媒體結合到Java程序和Applet中的應用程序接口#65377;它使得Java程序可以支持以下功能:捕捉和存儲媒體數據,控制回放時執行的處理類型,進行媒體數據流的個性化處理#65377;而且,最新版本的JMF還支持用戶利用插件應用程序接口(Plugin API)自定義和擴展JMF的功能#65377;JMF不僅支持本地媒體文件#65380;媒體設備的采集#65380;處理#65380;存儲#65380;播放等功能,還支持基于網絡的壓縮媒體流的同步#65380;控制#65380;處理和播放#65377;所謂媒體流,指的是可以邊下載邊播放的媒體傳輸方式#65377;
JMF包括JMF API和JMF RTP API兩個部分#65377;前者的主要功能是捕捉#65380;處理#65380;存儲和播放媒體;后者主要是在網絡上傳輸和接收媒體流#65377;
1.1JMF API的特點與結構
JMF API支持媒體捕捉并能夠滿足應用程序開發人員對媒體處理和播放進行控制的需要#65377;JMF API還提供了一個可以直接訪問處理底層媒體數據的插件架構,使得JMF可以很容易地被擴展#65377;它的特點有:易于編程;支持捕捉媒體數據;使Java可以開發媒體流傳輸和媒體會議等應用;使得高級開發人員和技術供應商能夠在已存在的API基礎上實現自定義解決方案,并能夠方便地在已存在的框架中集成新的特征;提供對原始的媒體數據的存取等#65377;通過利用Java平臺的優勢,JMF保持了“Write once,run anywhere”的承諾,為訪問底層的媒體框架提供了一個通用的跨平臺Java API#65377;
JMF為基于時間的媒體數據的獲取#65380;處理和傳送提供了一個統一的框架和消息協議,它可以支持大部分標準的媒體類型#65377;JMF API的結構主要由以下幾部分組成:捕捉設備#65380;數據源#65380;播放器和處理器等#65377;數據源類似于磁帶,封裝了捕捉設備或者媒體文件獲取的媒體流;播放器類似于錄像機,將數據源中的數據播放出來,輸出到顯示器#65380;聲卡等設備;而處理器類似于轉錄機,將數據源中的數據經過某些處理后得到另一個數據源#65377;以上的這些部分都是以接口的形式出現,JMF通過使用被稱為Manager(管理器)的中間對象來創建適應不同應用要求的接口#65377;
數據源和播放器是JMF中用來管理捕捉#65380;表現和處理基于時間的媒體的高層API#65377;JMF還提供用于集成用戶化的處理組件和擴展應用的低層API,用于擴展編解碼器#65380;復用/解復用器等#65377;
1.2JMF RTP API的特點與結構
JMF RTP API提供了對實時傳輸協議RTP的支持#65377;RTP是一種應用型的傳輸層協議,用于Internet上針對多媒體數據流的傳輸#65377;RTP被定義為在一對一或一對多的傳輸情況下工作,其目的是提供時間信息并實現流同步#65377;RTP協議位于UDP之上,本身并不能為按順序傳送數據包提供可靠的傳送機制,也不提供流量控制或擁塞控制,這些功能由RTCP來完成#65377;RTP和RTCP配合使用,它們能以有效的反饋和最小的開銷使傳輸效率最佳化,因而特別適合傳送網上的實時數據#65377;JMF對RTP的支持使用戶開發基于流媒體實時傳輸的應用,如視頻點播#65380;視頻會議#65380;在線直播等,變得更為簡單#65377;
JMF使用SessionManager(會話管理器)來建立和管理用于傳輸實時流媒體的RTP會話#65377;會話管理器跟蹤會話的參與者和被傳輸的流,從本地參與者的角度維護會話狀態#65377;將JMF框架和RTP結合就形成了如圖1所示的JMF RTP總體結構#65377;
2系統結構設計
系統可分為四個部分,即Web服務器#65380;流媒體服務器#65380;IP網絡和客戶機#65377;整個視頻點播系統的結構如圖2所示#65377;各個部分的功能如下:
(1)控制服務器#65377;它由節目信息管理模塊#65380;用戶信息管理模塊和認證計費模塊三個模塊組成,負責系統數據傳輸以外的其他控制功能,主要功能都是基于Web服務器實現#65377;節目信息管理模塊負責節目信息的配置,并將配置好的節目信息發布到Web上,供用戶點播;用戶信息管理模塊負責用戶信息的維護;認證計費模塊負責用戶的注冊#65380;登錄#65380;點播記錄,并根據點播情況和計費策略生成點播費用清單#65377;
(2)視頻服務器#65377;它由RTSP服務器和數據泵兩部分組成,負責點播連接的建立#65380;數據的傳輸及控制,主要功能都是基于Java和JMF實現#65377;RTSP服務器負責接收處理各種RTSP請求,實現點播連接的建立#65380;釋放和各種VCR控制操作;數據泵負責流媒體數據傳輸#65377;
(3)IP網絡#65377;它既可以是寬帶局域網,也可以是國際互聯網#65377;為支持流媒體的實時傳輸,IP網絡需要保證足夠的帶寬#65377;
(4)客戶機#65377;它由瀏覽器#65380;數據接收器和RTSP請求發生器三部分組成,負責流媒體數據的接收和回放#65380;用戶與服務器的交互,主要是基于Java Web技術和JMF流媒體接收#65380;播放技術實現#65377;瀏覽器負責用戶與控制服務器交互;數據接收器負責流媒體數據的接收#65380;緩沖及回放,還要實現基于RTCP的擁塞控制信息反饋;RTSP請求發生器負責與RTSP服務器交互,實現點播請求的發送#65380;VCR控制信令的發送等#65377;
點播進行過程可以描述如下:用戶通過客戶機的瀏覽器登錄系統,選擇節目并通過RTSP請求發生器發送點播請求#65377;RTSP服務器接收處理點播請求,選擇流媒體服務器,定位媒體文件#65377;數據泵從磁盤陣列上的媒體文件或者音視頻采集設備等多種媒體源獲取媒體流,經過特定編碼處理后建立RTP會話,以RTP/RTCP將媒體數據傳輸給客戶機#65377;客戶機從網絡上接收RTP數據,邊接收邊播放,同時不停地發送RTCP反饋信息#65377;在點播的過程中,用戶可以通過RTSP請求發生器來進行各種VCR控制操作#65377;
系統的實現和運行表明,采用控制信息和數據處理的分開數據傳輸和傳輸控制的分開,能夠降低系統實現的復雜度,采用模塊化的實現方法可以提高實現效率,簡化系統的調試和維護#65377;客戶機和服務器之間采用標準的協議(RTSP#65380;RTP/RTCP#65380;HTTP)進行交互,降低了兩者的耦合程度,有利于對某一方面進行改進的時候不會對另一方造成影響#65377;
3關鍵技術及實現
視頻點播系統的技術指標包括音視頻的回放質量和連續性#65380;傳輸的實時性#65380;友好靈活的交互性#65380;對各種網絡環境和網絡變化情況的自適應性等#65377;要實現這些指標,基于RTP的實時媒體流傳輸[3]#65380;基于RTCP的擁塞控制[4]#65380;完整VCR控制#65380;穿越NAT[6]等技術是關鍵的技術#65377;
3.1基于RTP的實時流媒體傳輸
基于JMF對媒體流和實時傳輸協議RTP的支持,采用JMF可以很方便地實現基于RTP/RTCP的實時媒體流傳輸#65377;傳輸的建立過程可以分為以下兩部分#65377;
(1)創建并配置處理器對象,產生數據源
處理器(Processor)對象是用來設置和控制從媒體源讀取媒體數據的#65377;媒體源可以是媒體文件也可以是音視頻采集設備,這里以媒體文件為例#65377;創建處理器對象的方法是:新建以媒體文件路徑為參數的MediaLocator對象,以此對象為參數調用Manager(管理器)對象的createProcessor方法#65377;
配置處理器對象首先要對處理器對象的通道(Track)設置參數#65377;方法是:調用處理器對象的getTrackControls方法,得到通道的TrackControl對象,然后調用TrackControl對象的setFormat方法設置處理后的媒體格式(即適合于RTP傳輸的媒體編碼格式)#65377;對于音頻,JMF提供五種編碼格式,即ULAW/RTP#65380;G723/RTP#65380;GSM/RTP#65380;DVI/RTP和MPEGAudio/RTP;對于視頻,JMF提供四種編碼格式,即JPEG/RTP#65380;MPEG/RTP#65380;H261/RTP和H263/RTP#65377;采用哪種編碼格式依賴于媒體文件存儲時的壓縮編碼格式,如以XVID#65380;MP3壓縮的MPEG4媒體文件可以采用H263/RTP#65380;MPEGAudio/RTP編碼格式進行傳輸#65377;
配置處理器對象還要設置處理器對象的數據輸出格式,方法是調用處理器對象的setContentDescriptor設置#65377;可設置的數據輸出格式有CONTENT_UNKNOWN#65380;RAW#65380;MIXED#65380;RAW_RTP;一般采用默認值RAW即可#65377;例如編碼格式為JPEG/RTP,還可以通過調用JPEG編碼格式的QualityControl對象的setQuality(float newQuality)方法設置圖像質量,一般設置為0.5#65377;處理器對象配置完成后就可以調用getDataOutput方法獲取數據源,以供下一步使用#65377;
(2)創建傳輸器,進行RTP數據流傳輸
JMF中傳輸RTP數據流有兩種方法:①使用數據接收器(DataSink)進行數據流傳輸;②使用會話管理器(SessionManager)創建輸出數據流并控制傳輸的進行#65377;
使用數據接收器進行傳輸是比較簡單的方法,只需要創建一個數據接收器對象,然后調用此對象的open()#65380;start()方法來開啟傳輸,調用stop()方法來停止傳輸#65377;但是,使用數據接收器進行傳輸只能傳輸一個數據流,而且無法監控會話狀態#65377;在本系統中,一般傳輸的媒體文件均包括音頻#65380;視頻兩個數據流,而且利用RTCP進行傳輸擁塞控制時需要監控會話狀態,所以無法使用數據接收器來進行傳輸#65377;這時候就需要使用會話管理器創建多個輸出數據流來進行傳輸#65377;
使用會話管理器傳輸音視頻RTP數據流的方法如下:
(1)創建一個會話管理器對象(實例化一個RTPSessionMgr對象);
(2)調用initSession方法初始化會話管理器;
(3)調用startSession方法開啟會話管理器;
(4)調用createSendStream方法創建輸出流對象;
(5)調用輸出流對象的start()方法開始RTP數據流的傳輸#65377;
3.2基于RTCP的擁塞控制
Internet是不能提供帶寬保證的網絡,很容易發生擁塞#65377;而且Internet接入用戶的網絡情況帶寬都不太一樣,發生擁塞的情況也不一樣#65377;如果以單一的傳輸速率進行傳輸,對于連接速率低于設定的傳輸速率的用戶,將會出現頻繁緩沖的現象;而對于連接速率高于傳輸速率的用戶來說,浪費了部分帶寬,接收的效果并沒有達到最好#65377;為了實現Internet視頻點播系統的應用級QoS保證,可以根據RTCP反饋的傳輸統計信息,動態地對RTP傳輸速率進行調整,以適應網絡帶寬的變化,提高音視頻的傳輸質量#65377;
判斷網絡擁塞有不同的策略,這里主要根據某段時間內的丟包率的大小作為標準來判斷#65377;自適應流媒體傳輸控制策略分為三個步驟:
(1) RTCP分析#65377;根據接收包RR的反饋信息得出包丟失率等參數#65377;
(2) 網絡狀況分析#65377;根據包丟失率的大小分析出網絡擁塞狀況#65377;
(3) 帶寬調整#65377;根據網絡擁塞狀況調整流媒體數據的發送速率#65377;
本系統采用AIMD(加性增#65380;乘性減)算法對傳輸速率進行動態調整#65377;具體算法如下所示: