于志楠 尹偉靜
(沈陽師范大學(xué) 科信軟件學(xué)院,遼寧 沈陽110034)
隨著人們對(duì)音頻和視頻信息需求,視頻會(huì)議系統(tǒng)廣泛應(yīng)用于現(xiàn)代企業(yè)中。視頻會(huì)議系統(tǒng)[1]的可以適應(yīng)現(xiàn)代社會(huì)的快捷、高效,使視頻會(huì)議系統(tǒng)的使用正在向各行各業(yè)滲透。本文總結(jié)和借鑒其他視頻會(huì)議軟件系統(tǒng)的基礎(chǔ),結(jié)合JAVA跨平臺(tái)[2-3]等優(yōu)點(diǎn),提出一種基于JAVA簡單應(yīng)用于局域網(wǎng)視頻會(huì)議系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)方案。
視頻會(huì)議系統(tǒng)的示意圖如圖1所示。
圖1 視頻會(huì)議系統(tǒng)的示意圖
從圖看出,視頻會(huì)議系統(tǒng)主要有三個(gè)部分組成,即通信網(wǎng)絡(luò)、會(huì)議終端和多點(diǎn)控制單元。會(huì)議終端是將視頻、音頻、數(shù)據(jù)、信令等各種數(shù)字信號(hào)送上信道進(jìn)行傳輸;多點(diǎn)控制單元是視頻會(huì)議系統(tǒng)用于多點(diǎn)視聽信息的傳輸與切換部分;通信網(wǎng)絡(luò)是一系列的設(shè)備、機(jī)構(gòu)和進(jìn)程,附著在網(wǎng)絡(luò)上的終端用戶設(shè)備能夠進(jìn)行有意義的信息交換。涉及網(wǎng)絡(luò)傳輸協(xié)議、網(wǎng)絡(luò)編程接口等內(nèi)容。
網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)硬件主要:有網(wǎng)卡、聲卡的電腦,攝像頭,帶麥克風(fēng)的耳機(jī)其組成結(jié)構(gòu)。
在軟件結(jié)構(gòu)上,由于整個(gè)系統(tǒng)是基于純軟件開發(fā),設(shè)計(jì)上類似于TCP/IP模型,我們依然采用分層思想,降低復(fù)雜度,使程序更容易修改,軟件開發(fā)速度更快,每層利用緊鄰的下層服務(wù),更容易記住各層功能,并有許多可選部分完成類似的任務(wù)。在體系結(jié)構(gòu)上分為四個(gè)層次:IO層、處理層、傳輸層、網(wǎng)絡(luò)層。
安裝JMF后,利用它進(jìn)行音視頻的捕獲。在JMF中,Capture Device Manager也是一個(gè)manager類,它提供給了一個(gè)列表,這個(gè)列表顯示當(dāng)前系統(tǒng)被使用的設(shè)備。同時(shí)Capture Device Manager通過查詢的方法對(duì)設(shè)備進(jìn)行定位并返回設(shè)備的配置信息對(duì)象Capture Devicelnfo,它也通過注冊(cè)的方法向列表加入一個(gè)新的設(shè)備信息,以便為JMF使用。設(shè)備可通過Capture Device Manager的get Device0方法直接獲得設(shè)備控制權(quán),設(shè)備的控制權(quán)一旦得到,就以此設(shè)備作為一個(gè)Media Locator,通過Capture Devicelnfo的get Locator0方法得到。在JMF中,Capture Device Manager也是一個(gè)manager類,它提供給了一個(gè)列表,這個(gè)列表顯示當(dāng)前系統(tǒng)可以被使用的設(shè)備。同時(shí)Capture Device Manager通過查詢的方法對(duì)設(shè)備進(jìn)行定位并返回設(shè)備的配置信息對(duì)象Capture Devicelnfo,它也通過注冊(cè)的方法向列表加入一個(gè)新的設(shè)備信息,以便為JMF使用。設(shè)備通過Capture Device Manager的get Device0方法直接獲得設(shè)備控制權(quán),設(shè)備控制權(quán)一旦得到,以此設(shè)備作為一個(gè)Media Locator,通過Capture Devicelnfo的get Locator0方法得到。
采集到的數(shù)據(jù)源是不適合直接傳輸?shù)模?jīng)過處理,使其適合為RTP傳輸格式并產(chǎn)生新的數(shù)據(jù)源再進(jìn)行傳輸,處理過程為:
用前面獲得的數(shù)據(jù)源構(gòu)造處理器對(duì)象,以便得到采集到的數(shù)據(jù);
processor=javax.media.Manager.create Processor(datasource);
然后將數(shù)據(jù)源處理為適合RTP傳輸?shù)母袷剑?/p>
然后調(diào)用處理器對(duì)象的get Track Control0方法,得到通道的Track Control對(duì)象;
媒體流中每一個(gè)磁道得到一個(gè)控制器;接下來調(diào)用Track Control對(duì)象的set Format()方法設(shè)置每個(gè)軌道的編碼格式;
最后,調(diào)用處理器對(duì)象的get Data Output0方法產(chǎn)生數(shù)據(jù)源,以便數(shù)據(jù)傳輸時(shí)使用;RTP會(huì)話是由RTP Manager完成的,每個(gè)軌道都需要有一個(gè)管理器,管理器對(duì)象采用RTP Manager.new lnstance()方法來獲得。建立會(huì)話時(shí),需創(chuàng)建Session Address對(duì)象描述發(fā)送端與接收端的地址信息,再加入RTP管理器。會(huì)話建立后,由管理器創(chuàng)建流將數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送。
接收媒體流也同樣建立RTP會(huì)話,過程與發(fā)送流時(shí)建立會(huì)話的過程類似,不同的是每個(gè)RTP管理器需要加上監(jiān)聽器來監(jiān)聽相應(yīng)地址與端口,包括會(huì)話請(qǐng)求、數(shù)據(jù)流到達(dá)等。系統(tǒng)實(shí)現(xiàn)Session Listener和Receive Stream Listener兩個(gè)接口,前者用于監(jiān)聽RTP會(huì)話請(qǐng)求,后者用于監(jiān)聽是否有數(shù)據(jù)流到達(dá)。當(dāng)創(chuàng)建一個(gè)新的數(shù)據(jù)流后,Session Manager會(huì)發(fā)出一個(gè)New Receive Stream Event。注冊(cè)了Receive Stream Listener接收數(shù)據(jù)流監(jiān)聽器,會(huì)收到事件。為每一個(gè)新接收數(shù)據(jù)流創(chuàng)建Player。從接收數(shù)據(jù)流中獲取Data Source,并作為參數(shù)傳遞給Manager來創(chuàng)建Player。發(fā)送端和接收端播放多媒體信息過程是相同的,由Session Manager到Data Source到Player,直接將播放的數(shù)據(jù)源交由播放器;創(chuàng)建并初始化RTP Session,創(chuàng)建一個(gè)Session Manager(會(huì)話管理器),并調(diào)用add Receive Stream Listener方法為RTP Manager對(duì)象添加RTP時(shí)間監(jiān)聽器,監(jiān)聽New Receive Stream Event事件,然后調(diào)用RTP Manager對(duì)象的initialize方法初始化RTP會(huì)話,設(shè)置本地和目的地地址和端口;Receive Stream Listener update方法,監(jiān)視New Receive Stream Event事件,它會(huì)指示新數(shù)據(jù)流被檢測(cè)到。當(dāng)一個(gè)New Receive Stream Evem事件被檢測(cè)到時(shí),以New Receive Stream Event事件調(diào)用get Receive Stream方法,以取得Receive Stream數(shù)據(jù)流對(duì)象,然后通過調(diào)用輸入數(shù)據(jù)流對(duì)象get Data Source獲取RTP數(shù)據(jù)源對(duì)象;把數(shù)據(jù)源對(duì)象作為參數(shù)傳遞到Manager的create Player方法中來創(chuàng)建Player。直接將播放數(shù)據(jù)源交由播放器,播放器界面分為播放界面和控制界面兩部分,分別用get Visual Component和get Control Panel Component方法來得到。
Player P=javax.media.Manager.create Player(ds);
P.add Controller Listener(this);P.realize();
Component VC,cc;VC=player.get Visual Component0;
CC=player.get Control Panel Component0;
通過SUN公司提供IP多播類實(shí)現(xiàn)多播技術(shù)分發(fā)媒體流,在具體實(shí)現(xiàn)時(shí)可通過.Multicast Socket類創(chuàng)建一個(gè)所獲得的指定端口號(hào)的多播套接字,然后調(diào)用join Group方法加入到該多播組,接收端程序加入多播組后,便可以從該多播地址和端口號(hào)處接收媒體流。
系統(tǒng)采用JAVAGUI編程,運(yùn)用SWING組件來編寫,通過連接服務(wù)器取得連接后進(jìn)行視頻連接,連接后視頻在屏幕顯示其界面如圖2。
本文總結(jié)和借鑒其他視頻會(huì)議軟件系統(tǒng)的基礎(chǔ),結(jié)合JAVA提出一種基于JAVA的應(yīng)用于局域網(wǎng)的視頻會(huì)議系統(tǒng)的設(shè)計(jì)方案。
[1]黃永峰,等.IP 網(wǎng)絡(luò)多媒體通信技術(shù)[M].北京:人民郵電出版社,2003.
[2][美]Chad Darby,John Griffin,Pascal de Haan,等.Java 網(wǎng)絡(luò)編程指南[M].邱仲潘,等,譯.北京:電子工業(yè)出版社,2002.
[3]孫衛(wèi)秦.Java 程序設(shè)計(jì)[M].電子工業(yè)出版社,2006.
[4]孫奎,殷兆麟.基于JMF的多人視頻聊天軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(9):2196-2198.
[5]閏改珍,師衛(wèi).基于RTP的音頻流多播系統(tǒng)的JMF實(shí)現(xiàn)[J].科技情報(bào)開發(fā)與經(jīng)濟(jì),2007,17(5):240-242.