李毓麗
(廣州大學 華軟軟件學院 網絡技術系,廣州 510990)
目前國內外軟件視頻會議系統解決方案基本是通過網絡即時通訊技術,實現基于互聯網的視頻、聲音、文字、文件的即時通訊服務,在網上實現人與人面對面交流。客戶端傳輸數據到服務器,服務器統一處理后再傳輸到客戶端,加大服務器的帶寬壓力。另外,會議系統基本都是基于WINDOWS操作系統,能擺脫平臺依賴的會議系統簡直就是鳳毛麟角。
總的來說,目前軟件視頻會議系統的主要不足在于:1)基于網絡單播;2)沒有提供跨平臺功能;3)沒有提供多國語言支持功能。為了實現一款跨平臺、支持多國語言及基于網絡組播視頻會議系統需要解決以下的問題:
1)如何實現音視頻數據的捕獲、播放、存儲、傳輸前編碼、組播傳輸
2)如何實現聊天文字、白板信息的組播傳輸及在線用戶信息對象的同步
3)如何實現平臺無關性
本文從中小規模企業對視頻會議系統的實際需要出發,提出并實現了一個基于JMF和JGROUP的視頻會議系統原型。由于JAVA語言本身跨平臺特性,本系統還具備大多同類軟件所不具備的強大的可移植功能。另外,JAVA語言對國際化的大力支持,本系統還具備了支持多種界面文字語言的功能。加之應用了多播技術、高效的編碼格式和簡捷穩定的信息傳輸機制,本系統在測試中體現出了較高的性能和穩定性。
JMF(Java Media Framework)是Sun 公司提出的Java 媒體架構。它是對應Java 2平臺標準版(J2SE)的一種可選用的應用編程接口(API)。JMF所提供的多媒體功能如下:1)可以在Java Applet和應用程序中播放各種媒體文件。它提供了對各種主要媒體形式和編碼的支持,如JPEG、H.263、MP3、Macromedias Flash。JMF 2.1.1 還支持多種媒體類型如Quicktime、MOV、Microsoft AVI和MPEG-1。2)在互聯網上傳輸音頻和視頻數據流。3)可以利用攝像機一類的設備截取音頻和視頻并保存為多媒體文件。4)處理多媒體文件轉換文件格式。5)在互聯網上廣播音頻和視頻數據。JMF主要由兩大部分構成:JMF API和JMF RTP API。前者是JMF的核心,負責對媒體的基本操作;后者則屬于前者的擴展,用于RTP媒體流的發送與接收。JMF 針對RTP 的媒體傳輸類型相當有限,只有一種內容描述(ContentDescriptor)RAW_RTP。JMF所支持的RTP 負載類型也非常有限,如表1 所示。

表1 JMF 所支持的RTP 傳輸FORMAT
基于JMF 的RTP/RTCP傳輸模型的整體設計如圖1所示:

圖1 基于JMF 的RTP/RTCP傳輸模型的整體設計示意圖
1.1.1 降低網絡帶寬
網絡帶寬是視頻軟件設計中首先要考慮的問題。本系統采用組播方式代替傳統的單播方式。組播的源和目的地是一對多的關系,并且該用戶同一組播地址的用戶才能接收到。組播允許路由器在分支處將數據包復制到多條鏈路上,因此發送方只需發送一個數據包即可讓該數據包被同一組播地址的用戶所接收,每個用戶就不再需要為向其他用戶發送/接收數據包而一一建立鏈接,大大降低用戶所需帶寬。以最低帶寬需求為例:視頻采用h263/rtp格式、160×120分辨率、10幀/秒需帶寬為60kb/s ,音頻采用G723/rtp、單聲道、8位采樣格式所需帶寬為5kb/s。以目前家庭ADSL寬帶1M的帶寬,完全能實現16人同時參加視頻會議。
1.1.2 對來自同一硬件的音/視頻數據流同時進行播放、
編碼后存儲及編碼后發送
JMF可捕獲來自于硬件的多媒體數據并創建數據源,并且JMF Manger類提供了createCloneableDataSource(數據源對象)方法,創建一個新的可克隆的數據源對象。每種操作都能獲取一個克隆的數據源對象,而且可以對自己的數據源對象進行不同的編碼(如存儲操作采用MOV視頻格式編碼,而發送操作則采用適合RTP要求的多媒體格式編碼)而不影響其他操作,不用像其他語言一樣采用各種技術方法復制數據流。
1.2.1 數據源(DataSource)的捕獲
JMF能捕獲的本地數據源有兩種:一種是來自于多媒體文件,另一種是來自于本地音視頻硬件。多媒體文件的數據源可通過JMF提供的MediaLocator類定位本地或網絡上多媒體文件的位置,然后采用Manager 類的createDataSource法捕獲數據源。對于本地音視頻硬件通過CaptureDeviceManager類的getDeviceList()方法獲取所有設備的CaptureDeviceInfo對象,然后通過JMFUtils類的createCaptureDataSource()方法捕獲數據源。
1.2.2 多媒體數據播放
在JMF中對應播放器的接口是Player,可通過Manager類的createPlayer(數據源對象)方法獲取。Player對象將音頻/視頻數據源、文件數據源作為輸入,然后將數據流輸出到音箱或屏幕上,就像CD播放機讀取CD唱片中的歌曲,然后將信號送到音箱上一樣。獲得了一個Player對象后,你可以通過調用getVisualComponent()方法得到Player對象的圖像部件(Visual Component,在圖像部件上可以播放多媒體的圖像)。然后將圖像部件加入到應用程序界面上。
1.2.3 多媒體數據的編碼和發送
同樣使用處理器來處理實時的視頻、音頻數據并且將數據軌道分別進行編碼,使其適合網絡傳輸。利用從處理器獲取的數據源建立可用于網絡傳輸的PushBufferDataSource數據源對象和PushBufferStream數據流對象數組,并建立RTP通訊管理類對象。為音/視頻分別創建一個RTPManger。一般所有參與者選擇一致的端口號,以便于管理。創建一個會話分為兩步:初始化本地地址和添加目的地址。為了實現組播,采用組播IP 地址,本地與目的地址均設為組播IP 地址。利用從RTPManger對象獲取的數據流發送多媒體數據。在初始化RTPManager 時,可通過BufferControl來設置接收buffer,以提高播放質量。1.2.4 多媒體數據接收
用上述的方法建立RTP通訊管理類對象數組,分別監聽音、視頻數據發送端口,添加SessionListener和ReceiveStreamListener監聽對象,用于監聽回話事件和接收數據流事件。當ReceiveStreamListener對象獲取到NewReceiveStreamEvent事件時,可通過NewReceiveStreamEvent對象獲取數據源,然后即可利用上面所提到的方法處理數據的播放和保存。
JGroup是一種可靠的群組通訊工具,用Java實現。JGroup以IP多播為基礎并且提供可靠性和群組功能。其中,可靠性包括: 消息不丟失; 大消息拆分和重組功能; 保證消息有序性; 消息原子性(某條消息要么全部成員都收到,或都收不到)。群組功能包括:群組成員知道群組內所有其他成員;當群組發生以下的事件,所有群組成員都能收到通知:1)新組員加入群;2)舊組員離開群;3)某現有組員意外脫離群 。
實現在線用戶信息對象的同步,如果采用基于TCP的可序列化對象傳輸方法非常繁瑣,要建立服務器和客戶端鏈接并且進行對象傳輸。如果直接采用JGROUP的消息發送機制,在用戶加入、離開、狀態變更時都有發送信息到組內,過程也不簡單。因此,JGROUP提供了兩個類來實現數據同步:分布式哈希表(DistributedHashtable)、分布式哈希樹(DistributedTree)。本系統通過建立分布式哈希表對象,保存一個在線用戶列表,使得所用在線用戶都能知道其他用戶的狀態。分布式哈希表允許在不同的主機上建立多個哈希表對象,所有的對象都具有同樣的狀態。當新建一個含指定組的分布式哈希表對象時,新對象會向已有的成員查詢當前狀態并更新。當對象調用put()或remove()時,不同主機上的哈希表對象亦會同時更新。
2.2.1 聊天文字、白板信息的組播傳輸
要想加入一個組,并與組內其他的成員交互,必須建立一個信道(Channel)連接到組,同一個組內的所有成員使用相同的組名稱。首先是創建一個信道,可以直接實例化一個Channel的實現,這里用的是JChannel。創建完之后,信道現在處于未連接狀態,需要通過connect方法將之連接到組,使其處于連接狀態,這時就可以發送/接收消息了。
2.2.2 用戶管理
使用上述方法一樣建立JChannel,利用JChannel建立分布式哈希表對象,已本地地址為關鍵字保存用戶對象,并注冊監聽器。當分布式哈希表對象有用戶對象加入、狀態變更、離開時,監聽器會接收到相應事件,各客戶端可根據事件修改在線用戶列表。
java體系已經支持java程序的平臺無關性,只需要在編寫程序時不直接或者間接調用不屬于java api的本地方法,不接使用文件路徑分隔符,而是采用File類的separator屬性獲取當前系統的文件分隔符。
[1] 孫一林,彭波.Java網絡編程實例[M].北京:清華大學出版社.2005.
[2] 馮博,應群.網絡視頻流媒體技術與應用[M].北京:清華大學出版社.2001.
[3] 劉東華,王巍,唐剛.O'Reilly:Java網絡編程(第2版)[M].北京:中國電力出版社.2001.
[4] 孫奎,殷兆麟.基于JMF的多人視頻聊天軟件的設計與實現[J].計算機工程與設計.2007:68-72.
[5] 江霖及,遲佳.基于JMF 的音,視頻聊天實現 [DB,CD].中國科技論文在線.2007.
[6] 王丹.視頻會議系統現狀、關鍵技術及其應用[J].現代電視技術. 2002(1):20-24.
[7] 楊波.視頻會議系統發展分析報告[J].江蘇通信技術.2003.19(3):34-40.