李毓麗
(廣州大學(xué) 華軟軟件學(xué)院 網(wǎng)絡(luò)技術(shù)系,廣州 510990)
目前國內(nèi)外軟件視頻會(huì)議系統(tǒng)解決方案基本是通過網(wǎng)絡(luò)即時(shí)通訊技術(shù),實(shí)現(xiàn)基于互聯(lián)網(wǎng)的視頻、聲音、文字、文件的即時(shí)通訊服務(wù),在網(wǎng)上實(shí)現(xiàn)人與人面對面交流。客戶端傳輸數(shù)據(jù)到服務(wù)器,服務(wù)器統(tǒng)一處理后再傳輸?shù)娇蛻舳?,加大服?wù)器的帶寬壓力。另外,會(huì)議系統(tǒng)基本都是基于WINDOWS操作系統(tǒng),能擺脫平臺依賴的會(huì)議系統(tǒng)簡直就是鳳毛麟角。
總的來說,目前軟件視頻會(huì)議系統(tǒng)的主要不足在于:1)基于網(wǎng)絡(luò)單播;2)沒有提供跨平臺功能;3)沒有提供多國語言支持功能。為了實(shí)現(xiàn)一款跨平臺、支持多國語言及基于網(wǎng)絡(luò)組播視頻會(huì)議系統(tǒng)需要解決以下的問題:
1)如何實(shí)現(xiàn)音視頻數(shù)據(jù)的捕獲、播放、存儲、傳輸前編碼、組播傳輸
2)如何實(shí)現(xiàn)聊天文字、白板信息的組播傳輸及在線用戶信息對象的同步
3)如何實(shí)現(xiàn)平臺無關(guān)性
本文從中小規(guī)模企業(yè)對視頻會(huì)議系統(tǒng)的實(shí)際需要出發(fā),提出并實(shí)現(xiàn)了一個(gè)基于JMF和JGROUP的視頻會(huì)議系統(tǒng)原型。由于JAVA語言本身跨平臺特性,本系統(tǒng)還具備大多同類軟件所不具備的強(qiáng)大的可移植功能。另外,JAVA語言對國際化的大力支持,本系統(tǒng)還具備了支持多種界面文字語言的功能。加之應(yīng)用了多播技術(shù)、高效的編碼格式和簡捷穩(wěn)定的信息傳輸機(jī)制,本系統(tǒng)在測試中體現(xiàn)出了較高的性能和穩(wěn)定性。
JMF(Java Media Framework)是Sun 公司提出的Java 媒體架構(gòu)。它是對應(yīng)Java 2平臺標(biāo)準(zhǔn)版(J2SE)的一種可選用的應(yīng)用編程接口(API)。JMF所提供的多媒體功能如下:1)可以在Java Applet和應(yīng)用程序中播放各種媒體文件。它提供了對各種主要媒體形式和編碼的支持,如JPEG、H.263、MP3、Macromedias Flash。JMF 2.1.1 還支持多種媒體類型如Quicktime、MOV、Microsoft AVI和MPEG-1。2)在互聯(lián)網(wǎng)上傳輸音頻和視頻數(shù)據(jù)流。3)可以利用攝像機(jī)一類的設(shè)備截取音頻和視頻并保存為多媒體文件。4)處理多媒體文件轉(zhuǎn)換文件格式。5)在互聯(lián)網(wǎng)上廣播音頻和視頻數(shù)據(jù)。JMF主要由兩大部分構(gòu)成:JMF API和JMF RTP API。前者是JMF的核心,負(fù)責(zé)對媒體的基本操作;后者則屬于前者的擴(kuò)展,用于RTP媒體流的發(fā)送與接收。JMF 針對RTP 的媒體傳輸類型相當(dāng)有限,只有一種內(nèi)容描述(ContentDescriptor)RAW_RTP。JMF所支持的RTP 負(fù)載類型也非常有限,如表1 所示。
表1 JMF 所支持的RTP 傳輸FORMAT
基于JMF 的RTP/RTCP傳輸模型的整體設(shè)計(jì)如圖1所示:
圖1 基于JMF 的RTP/RTCP傳輸模型的整體設(shè)計(jì)示意圖
1.1.1 降低網(wǎng)絡(luò)帶寬
網(wǎng)絡(luò)帶寬是視頻軟件設(shè)計(jì)中首先要考慮的問題。本系統(tǒng)采用組播方式代替?zhèn)鹘y(tǒng)的單播方式。組播的源和目的地是一對多的關(guān)系,并且該用戶同一組播地址的用戶才能接收到。組播允許路由器在分支處將數(shù)據(jù)包復(fù)制到多條鏈路上,因此發(fā)送方只需發(fā)送一個(gè)數(shù)據(jù)包即可讓該數(shù)據(jù)包被同一組播地址的用戶所接收,每個(gè)用戶就不再需要為向其他用戶發(fā)送/接收數(shù)據(jù)包而一一建立鏈接,大大降低用戶所需帶寬。以最低帶寬需求為例:視頻采用h263/rtp格式、160×120分辨率、10幀/秒需帶寬為60kb/s ,音頻采用G723/rtp、單聲道、8位采樣格式所需帶寬為5kb/s。以目前家庭ADSL寬帶1M的帶寬,完全能實(shí)現(xiàn)16人同時(shí)參加視頻會(huì)議。
1.1.2 對來自同一硬件的音/視頻數(shù)據(jù)流同時(shí)進(jìn)行播放、
編碼后存儲及編碼后發(fā)送
JMF可捕獲來自于硬件的多媒體數(shù)據(jù)并創(chuàng)建數(shù)據(jù)源,并且JMF Manger類提供了createCloneableDataSource(數(shù)據(jù)源對象)方法,創(chuàng)建一個(gè)新的可克隆的數(shù)據(jù)源對象。每種操作都能獲取一個(gè)克隆的數(shù)據(jù)源對象,而且可以對自己的數(shù)據(jù)源對象進(jìn)行不同的編碼(如存儲操作采用MOV視頻格式編碼,而發(fā)送操作則采用適合RTP要求的多媒體格式編碼)而不影響其他操作,不用像其他語言一樣采用各種技術(shù)方法復(fù)制數(shù)據(jù)流。
1.2.1 數(shù)據(jù)源(DataSource)的捕獲
JMF能捕獲的本地?cái)?shù)據(jù)源有兩種:一種是來自于多媒體文件,另一種是來自于本地音視頻硬件。多媒體文件的數(shù)據(jù)源可通過JMF提供的MediaLocator類定位本地或網(wǎng)絡(luò)上多媒體文件的位置,然后采用Manager 類的createDataSource法捕獲數(shù)據(jù)源。對于本地音視頻硬件通過CaptureDeviceManager類的getDeviceList()方法獲取所有設(shè)備的CaptureDeviceInfo對象,然后通過JMFUtils類的createCaptureDataSource()方法捕獲數(shù)據(jù)源。
1.2.2 多媒體數(shù)據(jù)播放
在JMF中對應(yīng)播放器的接口是Player,可通過Manager類的createPlayer(數(shù)據(jù)源對象)方法獲取。Player對象將音頻/視頻數(shù)據(jù)源、文件數(shù)據(jù)源作為輸入,然后將數(shù)據(jù)流輸出到音箱或屏幕上,就像CD播放機(jī)讀取CD唱片中的歌曲,然后將信號送到音箱上一樣。獲得了一個(gè)Player對象后,你可以通過調(diào)用getVisualComponent()方法得到Player對象的圖像部件(Visual Component,在圖像部件上可以播放多媒體的圖像)。然后將圖像部件加入到應(yīng)用程序界面上。
1.2.3 多媒體數(shù)據(jù)的編碼和發(fā)送
同樣使用處理器來處理實(shí)時(shí)的視頻、音頻數(shù)據(jù)并且將數(shù)據(jù)軌道分別進(jìn)行編碼,使其適合網(wǎng)絡(luò)傳輸。利用從處理器獲取的數(shù)據(jù)源建立可用于網(wǎng)絡(luò)傳輸?shù)腜ushBufferDataSource數(shù)據(jù)源對象和PushBufferStream數(shù)據(jù)流對象數(shù)組,并建立RTP通訊管理類對象。為音/視頻分別創(chuàng)建一個(gè)RTPManger。一般所有參與者選擇一致的端口號,以便于管理。創(chuàng)建一個(gè)會(huì)話分為兩步:初始化本地地址和添加目的地址。為了實(shí)現(xiàn)組播,采用組播IP 地址,本地與目的地址均設(shè)為組播IP 地址。利用從RTPManger對象獲取的數(shù)據(jù)流發(fā)送多媒體數(shù)據(jù)。在初始化RTPManager 時(shí),可通過BufferControl來設(shè)置接收buffer,以提高播放質(zhì)量。1.2.4 多媒體數(shù)據(jù)接收
用上述的方法建立RTP通訊管理類對象數(shù)組,分別監(jiān)聽音、視頻數(shù)據(jù)發(fā)送端口,添加SessionListener和ReceiveStreamListener監(jiān)聽對象,用于監(jiān)聽回話事件和接收數(shù)據(jù)流事件。當(dāng)ReceiveStreamListener對象獲取到NewReceiveStreamEvent事件時(shí),可通過NewReceiveStreamEvent對象獲取數(shù)據(jù)源,然后即可利用上面所提到的方法處理數(shù)據(jù)的播放和保存。
JGroup是一種可靠的群組通訊工具,用Java實(shí)現(xiàn)。JGroup以IP多播為基礎(chǔ)并且提供可靠性和群組功能。其中,可靠性包括: 消息不丟失; 大消息拆分和重組功能; 保證消息有序性; 消息原子性(某條消息要么全部成員都收到,或都收不到)。群組功能包括:群組成員知道群組內(nèi)所有其他成員;當(dāng)群組發(fā)生以下的事件,所有群組成員都能收到通知:1)新組員加入群;2)舊組員離開群;3)某現(xiàn)有組員意外脫離群 。
實(shí)現(xiàn)在線用戶信息對象的同步,如果采用基于TCP的可序列化對象傳輸方法非常繁瑣,要建立服務(wù)器和客戶端鏈接并且進(jìn)行對象傳輸。如果直接采用JGROUP的消息發(fā)送機(jī)制,在用戶加入、離開、狀態(tài)變更時(shí)都有發(fā)送信息到組內(nèi),過程也不簡單。因此,JGROUP提供了兩個(gè)類來實(shí)現(xiàn)數(shù)據(jù)同步:分布式哈希表(DistributedHashtable)、分布式哈希樹(DistributedTree)。本系統(tǒng)通過建立分布式哈希表對象,保存一個(gè)在線用戶列表,使得所用在線用戶都能知道其他用戶的狀態(tài)。分布式哈希表允許在不同的主機(jī)上建立多個(gè)哈希表對象,所有的對象都具有同樣的狀態(tài)。當(dāng)新建一個(gè)含指定組的分布式哈希表對象時(shí),新對象會(huì)向已有的成員查詢當(dāng)前狀態(tài)并更新。當(dāng)對象調(diào)用put()或remove()時(shí),不同主機(jī)上的哈希表對象亦會(huì)同時(shí)更新。
2.2.1 聊天文字、白板信息的組播傳輸
要想加入一個(gè)組,并與組內(nèi)其他的成員交互,必須建立一個(gè)信道(Channel)連接到組,同一個(gè)組內(nèi)的所有成員使用相同的組名稱。首先是創(chuàng)建一個(gè)信道,可以直接實(shí)例化一個(gè)Channel的實(shí)現(xiàn),這里用的是JChannel。創(chuàng)建完之后,信道現(xiàn)在處于未連接狀態(tài),需要通過connect方法將之連接到組,使其處于連接狀態(tài),這時(shí)就可以發(fā)送/接收消息了。
2.2.2 用戶管理
使用上述方法一樣建立JChannel,利用JChannel建立分布式哈希表對象,已本地地址為關(guān)鍵字保存用戶對象,并注冊監(jiān)聽器。當(dāng)分布式哈希表對象有用戶對象加入、狀態(tài)變更、離開時(shí),監(jiān)聽器會(huì)接收到相應(yīng)事件,各客戶端可根據(jù)事件修改在線用戶列表。
java體系已經(jīng)支持java程序的平臺無關(guān)性,只需要在編寫程序時(shí)不直接或者間接調(diào)用不屬于java api的本地方法,不接使用文件路徑分隔符,而是采用File類的separator屬性獲取當(dāng)前系統(tǒng)的文件分隔符。
[1] 孫一林,彭波.Java網(wǎng)絡(luò)編程實(shí)例[M].北京:清華大學(xué)出版社.2005.
[2] 馮博,應(yīng)群.網(wǎng)絡(luò)視頻流媒體技術(shù)與應(yīng)用[M].北京:清華大學(xué)出版社.2001.
[3] 劉東華,王巍,唐剛.O'Reilly:Java網(wǎng)絡(luò)編程(第2版)[M].北京:中國電力出版社.2001.
[4] 孫奎,殷兆麟.基于JMF的多人視頻聊天軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì).2007:68-72.
[5] 江霖及,遲佳.基于JMF 的音,視頻聊天實(shí)現(xiàn) [DB,CD].中國科技論文在線.2007.
[6] 王丹.視頻會(huì)議系統(tǒng)現(xiàn)狀、關(guān)鍵技術(shù)及其應(yīng)用[J].現(xiàn)代電視技術(shù). 2002(1):20-24.
[7] 楊波.視頻會(huì)議系統(tǒng)發(fā)展分析報(bào)告[J].江蘇通信技術(shù).2003.19(3):34-40.