摘要:該文首先對(duì)RTP/RTCP協(xié)議、JMF中的關(guān)鍵技術(shù)、流媒體實(shí)時(shí)傳輸?shù)脑磉M(jìn)行了分析和研究,并詳細(xì)介紹了IPV6網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境的配置和視頻監(jiān)控的實(shí)現(xiàn)過程。
關(guān)鍵詞:IPv6;視頻;JMF
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)24-6969-03
Design of Video Frequency Monitoring System Based on lPV6
CAI Bo1, CHEN Yu-hai2, CHEN Ping-sheng1
(1.Computer Department of Shaoxing Top Vocational Institute of Information And Technology,Shaoxing 312000,China;2.Hangzhou Hikvision Digital Technology Co., Ltd. ,Hangzhou 310012,China)
Abstract: This paper has first carried on the analysis and the research to the RTP/RTCP agreement, key technology of JMF,basic princip of Streaming Media real-time transport, and tailedly introduced the configuration of IPV6 Experimental environment, the implementation of video frequency Monitoring.
Key words: IPv6; Video; JMF
下一代互聯(lián)網(wǎng)的網(wǎng)絡(luò)層協(xié)議將由IPv4轉(zhuǎn)到IPv6,以解決全球的IP地址空間即將耗盡,和日益復(fù)雜和擴(kuò)張的流媒體業(yè)務(wù)需要高效傳輸?shù)膯栴}。在下一代IPv6互聯(lián)網(wǎng)中,由于流媒體的時(shí)間敏感性和承載網(wǎng)絡(luò)的動(dòng)態(tài)性,遲到分組、分組失序和延遲抖動(dòng)等現(xiàn)象都將直接影響媒體的回放質(zhì)量。因此,在下一代IP網(wǎng)絡(luò)中如何有效地進(jìn)行流媒體的傳輸和服務(wù)質(zhì)量的控制將成為研究的重點(diǎn)。
1 關(guān)鍵技術(shù)
1.1 RTP/RTCP協(xié)議
實(shí)時(shí)傳輸協(xié)議RTP(real-time Transport protocal)是在網(wǎng)絡(luò)上針對(duì)多媒體數(shù)據(jù)流的一種傳輸協(xié)議,RTP是一對(duì)一或一對(duì)多的傳輸情況下工作的。其目的是提供實(shí)時(shí)和實(shí)現(xiàn)多媒體數(shù)據(jù)流的同步,RTP通常在UDP協(xié)議的基礎(chǔ)上來傳送數(shù)據(jù)。當(dāng)一個(gè)應(yīng)用程序開始一個(gè)RTP會(huì)話時(shí)將使用兩個(gè)端口,一個(gè)端口分配給RTP,一個(gè)端口分配給RTCP。RTP協(xié)議本身并不能為按順序傳送數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量控制或擁塞控制。RTP協(xié)議可以確定正在傳輸?shù)臄?shù)據(jù)類型,確定數(shù)據(jù)包的正確順序以便正常播放,它還可以同步由不同數(shù)據(jù)源傳輸?shù)拿襟w流,例如,接收并同步播放MPEG流中的視、音頻數(shù)據(jù)流。在網(wǎng)絡(luò)傳輸中,RTP數(shù)據(jù)包不一定按照發(fā)送時(shí)的順序到達(dá),它甚至不一定能夠到達(dá)發(fā)送的目的地,順序的重新組織、丟失包的檢測(cè),都是有接收端根據(jù)RTP包頭里面提供的信息完成。
傳輸控制協(xié)議RTCP(real-time Transport control protocal)是提供多媒體數(shù)據(jù)流量控制和擁塞控制服務(wù)的,使用RTP協(xié)議的應(yīng)用程序在RTP會(huì)話期間,各個(gè)參與者都需要周期性地傳送RTCP包,RTCP包中包含有已發(fā)送的數(shù)據(jù)包數(shù)量、丟失的數(shù)據(jù)包的數(shù)量等統(tǒng)計(jì)資料,服務(wù)器利用這些信息可以動(dòng)態(tài)地改變傳輸速率,改變有效載荷類型、監(jiān)視和控制實(shí)時(shí)數(shù)據(jù)的傳輸?shù)取TP協(xié)議和RTCP協(xié)議是配合使用的,它們能以有效的反饋和最小的開銷使傳輸效率最佳化,RTP和RTCP協(xié)議特別適合傳輸網(wǎng)絡(luò)上的實(shí)時(shí)數(shù)據(jù)。
1.2 JMF中的關(guān)鍵技術(shù)
Java媒體框架(JMF,Java Media Frame)是Sun公司推出的一個(gè)能夠把音頻、視頻和其它基于時(shí)間的媒體結(jié)合到Java Application和Java Applet的應(yīng)用程序接口,它是基于Java平臺(tái)設(shè)計(jì)的。使Java程序具有許多新功能:捕捉音頻信號(hào)、存儲(chǔ)、播放并處理媒體數(shù)據(jù),能夠傳輸媒體數(shù)據(jù)和對(duì)多媒體數(shù)據(jù)進(jìn)行編碼。同時(shí),它還支持壓縮的媒體流及存儲(chǔ)媒體的同步、控制、處理和播放,功能非常強(qiáng)大。JMF包括兩個(gè)部分:JMF API和RTP API。前者的主要功能是捕捉、處理、存儲(chǔ)和播放媒體;后者主要是在網(wǎng)絡(luò)上傳輸和接收媒體流。
JMF中的幾個(gè)關(guān)鍵技術(shù)是:RTP會(huì)話、媒體定位器、數(shù)據(jù)源、播放器(Player)和處理器、會(huì)話管理器。
RTP會(huì)話:RTP會(huì)話是使用RTP協(xié)議來進(jìn)行通信交流的應(yīng)用程序之間的一個(gè)關(guān)聯(lián)。一個(gè)會(huì)話由一個(gè)網(wǎng)絡(luò)地址和一對(duì)端口(UDP端口)所標(biāo)示。
媒體定位器(Media-locator):描述被處理的媒體所在的位置,類似于URL,可以由URL構(gòu)造,也可以是一個(gè)媒體文件或一個(gè)媒體捕獲數(shù)據(jù)源。
數(shù)據(jù)源(Data-Source):封裝數(shù)據(jù)媒體數(shù)據(jù),數(shù)據(jù)源可以由捕獲設(shè)備、本地媒體文件或網(wǎng)絡(luò)上的媒體流構(gòu)造產(chǎn)生。通常被用來管理媒體內(nèi)容的傳輸,一個(gè)數(shù)據(jù)源封裝了媒體的位置和用來傳輸媒體的協(xié)議和軟件,用媒體定位器或URL表示。
播放器(Player)和處理器(Processor):主要是對(duì)媒體數(shù)據(jù)的捕獲、處理和提交進(jìn)行管理。處理器只是播放器的一種的特定類型,它對(duì)媒體數(shù)據(jù)進(jìn)行處理,用適當(dāng)?shù)母袷捷敵鰯?shù)據(jù),輸出的目標(biāo)可以是本地的輸出設(shè)備、本地的文件或網(wǎng)絡(luò)。
會(huì)話管理器(Manager):管理器控制著對(duì)播放器的處理、數(shù)據(jù)源的建立。
圖1是利用JMF在IPV6網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)實(shí)時(shí)通信的模型,包括接受和發(fā)送兩個(gè)過程。
發(fā)送過程:客戶端使用USB視頻攝像頭輸入視頻信號(hào),通過一種被稱為數(shù)據(jù)源的數(shù)據(jù)結(jié)構(gòu)緩沖信號(hào)隊(duì)列,接著由媒體處理器對(duì)數(shù)據(jù)進(jìn)行處理,形成合適RTP協(xié)議格式封裝的媒體流,由會(huì)話管理器經(jīng)指定端口通過網(wǎng)絡(luò)發(fā)送到遠(yuǎn)程主機(jī)。
接受過程:與發(fā)送過陳相反,接受方要對(duì)接受到的數(shù)據(jù)報(bào)拆裝,經(jīng)會(huì)話管理器、播放器處理以特定的格式播放或保存為媒體文件。
2 IPV6網(wǎng)絡(luò)環(huán)境的建設(shè)
2.1 建立基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)
Ipv6測(cè)試用的基礎(chǔ)網(wǎng)絡(luò)結(jié)構(gòu)由4臺(tái)計(jì)算機(jī)、1個(gè)交換機(jī),1個(gè)集線器,如下圖2所示。
它們分別是:
·一臺(tái)運(yùn)行Windows 2003的計(jì)算機(jī)用作DNS服務(wù)器,命名為DNS。
·一臺(tái)運(yùn)行Windows XP的計(jì)算機(jī)用作路由器,命名為Router。
·兩臺(tái)運(yùn)行Windows XP的計(jì)算機(jī)用作客戶機(jī),分別命名為Client1和Client2。
先用Ipv4設(shè)置好它們的IP地址和子網(wǎng)掩碼等。
2.2 配置支持IPV6的DNS服務(wù)器
DNS是運(yùn)行Windows 2003的計(jì)算機(jī),它用來測(cè)試域名服務(wù)。
·用Administrator超級(jí)管理員登錄,并設(shè)置IP地址為10.0.1.2,子網(wǎng)掩碼為255.255.255.0,默認(rèn)網(wǎng)關(guān)為10.0.1.1
·配置好DNS服務(wù)器,創(chuàng)建名為testlab.Microsoft.com的向前查找區(qū),并將此查找區(qū)用作支持動(dòng)態(tài)更新的主區(qū)。
·安裝好Ipv6協(xié)議。
2.3 配置支持IPV6的客戶機(jī)
Client1是運(yùn)行Windows XP的計(jì)算機(jī),作為一個(gè)客戶機(jī)。
·Administrator超級(jí)管理員登錄,并設(shè)置IP地址為10.0.1.3,子網(wǎng)掩碼為255.255.255.0,默認(rèn)網(wǎng)關(guān)為10.0.1.1,DNS服務(wù)器地址為10.0.1.2。
·安裝好Ipv6協(xié)議。
·Client2是運(yùn)行Windows XP的計(jì)算機(jī),作為一個(gè)客戶機(jī)。
·Administrator超級(jí)管理員登錄,并設(shè)置IP地址為10.0.2.2,子網(wǎng)掩碼為255.255.255.0,默認(rèn)網(wǎng)關(guān)為10.0.2.1.1,DNS服務(wù)器地址為10.0.1.2。
·安裝好Ipv6協(xié)議。
2.4 配置支持IPV6的路由器
Router是運(yùn)行Windows XP的計(jì)算機(jī),并且安裝兩塊網(wǎng)卡,用作子網(wǎng)Subnet 1和子網(wǎng)Subnet 2之間的路由器。
·在“網(wǎng)絡(luò)連接”文件夾中,將連接到Subnet 1上的本地連接重命名為“Subnet 1 Connection”, 將連接到Subnet 2上的本地連接重命名為“Subnet 2 Connection”,以便加以區(qū)別。
·為“Subnet 1 Connection”配置TCP/IP協(xié)議,IP地址為10.0.1.1,子網(wǎng)掩碼為255.255.255.0,DNS服務(wù)器地址為10.0.1.2。
·為“Subnet 2 Connection”配置TCP/IP協(xié)議,IP地址為10.0.2.1,子網(wǎng)掩碼為255.255.255.0,DNS服務(wù)器地址為10.0.1.2。
·運(yùn)行注冊(cè)表編輯程序(Regedit),展開以下路徑:HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\,將“IPEnableRouter”改成“1”,這樣就啟用了在Subnet 1和Subnet 2之間進(jìn)行的路由。
·安裝好Ipv6協(xié)議并重新啟動(dòng)該計(jì)算機(jī)。
2.5 建立Ipv6靜態(tài)路由結(jié)構(gòu)
為配置一個(gè)靜態(tài)路由結(jié)構(gòu),以便測(cè)試任何兩臺(tái)計(jì)算機(jī)都可以連通。
·在路由器上,輸入netsh interface ipv6 show address顯示名為Subnet 1 Connetion的接口和名為Subnet 1 Connetion的接口的鏈路本地地址和接口索引號(hào)。
·在路由器上,輸入netsh interface ipv6 set interface 4 forwarding=enabled advertise=enabled。
(其中的“4”為Router1的Subnet1 Connection接口的索引號(hào))
·在路由器上,輸入netsh interface ipv6 set interface 5 forwarding=enabled advertise=enabled。
(其中的“5”為Router1的Subnet2 Connection接口的索引號(hào))
·在路由器上,輸入netsh interface ipv6 add route fee0:0:0:1::/64 4 publish=yes,和netsh interface ipv6 add route fee0:0:0:2::/64 5 publish=yes。
·這樣就在路由器上添加了靜態(tài)路由表,可以在Client1中輸入netsh interface ipv6 show route命令來查看。
2.6 IPV6網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境的測(cè)試
·在Client1客戶機(jī)中,輸入netsh interface ipv6 show address命令來顯示接口的鏈路本地地址和接口索引。
·在Client2客戶機(jī)中,輸入netsh interface ipv6 show address命令來顯示接口的鏈路本地地址和接口索引。
·在Client1客戶機(jī)中,可以輸入ping fc80::5cfc:10.0.2.2%2命令來驗(yàn)證在Ipv6環(huán)境下不同網(wǎng)段中的節(jié)點(diǎn)是否連通。(其中fc80::5cfc:10.0.2.2是Client2客戶機(jī)中接口的鏈路本地地址,”%”后面的數(shù)字”2”是指接口索引。)
3 捕獲并傳輸RTP媒體流
3.1 視頻信號(hào)捕獲
視頻信號(hào)通過麥克風(fēng)、攝像機(jī)等的硬件設(shè)備捕獲。可以使用CaptureDeviceManager對(duì)象獲得系統(tǒng)中可用的視頻獲取設(shè)備。通過調(diào)用getDeviceList()方法你可以獲得設(shè)備的列表。每個(gè)設(shè)備都對(duì)應(yīng)一個(gè)CaptrueDeviceInfo對(duì)象。也可以通過調(diào)用CaptureDevieceManager對(duì)象的getDevice()方法來獲得特定的CaptureDeviceInfo對(duì)象。在使用設(shè)備截取多媒體數(shù)據(jù)前,還需要從CaptureDeviceInfo對(duì)象中獲得設(shè)備對(duì)應(yīng)的MediaLocator對(duì)象。
String device = \"vfw:Microsoft WDM Image Capture (Win32):0\";
CaptureDeviceInfodi = CaptureDeviceManager.getDevice(device);
String rtpURL = \"rtp://\" + ipAddress + \":\" + port + \"/video\";
MediaLocator outputLocator = di.getLocato (rtpURL);
3.2 發(fā)送RTP媒體流
將數(shù)據(jù)以RTP實(shí)時(shí)流的形式發(fā)送出去;通過會(huì)話管理器(Session Manager)傳輸?shù)街付ǖ腎P地址和端口上。RTP數(shù)據(jù)的步驟:產(chǎn)生一個(gè)JMF處理器(Processor),為每一種RTP格式設(shè)置相應(yīng)的軌跡格式。從處理器獲取輸出數(shù)據(jù)流;會(huì)話管理器產(chǎn)生一個(gè)發(fā)送數(shù)據(jù)流,即以數(shù)據(jù)源和序號(hào)作為參數(shù)調(diào)用會(huì)話管理器的createDataSink()方法;開始會(huì)話傳輸;通過監(jiān)聽ControllerEvent事件控制會(huì)話的過程。
Processorprocessor = Manager.createProcessor(ds);
TrackControl [] tracks = processor.getTrackControls();
DataSink rtptransmitter = Manager.createDataSink(dataOutput, outputLocator);
rtptransmitter.open();
rtptransmitter.start();
dataOutput.start();
4 接受并播放RTP媒體流
4.1 監(jiān)聽并接收數(shù)據(jù)流
RTP會(huì)話是通過RTPManager管理器來管理的,為接收RTP會(huì)話和表現(xiàn)媒體數(shù)據(jù),RTP接收類需要實(shí)現(xiàn)SessionListener,ReceiverStreamListener和ControllerListener監(jiān)聽接口。
當(dāng)有相應(yīng)的事件發(fā)生時(shí),監(jiān)聽器監(jiān)聽到事件并調(diào)用update()方法,在此方法內(nèi)接收到媒體流。
實(shí)現(xiàn)ReceiveStreamListener監(jiān)聽接口,監(jiān)聽NewReceiveStreamEvent事件。當(dāng)監(jiān)聽到NewReceiveStreamEvent事件后,通知事件獲取接收媒體數(shù)據(jù)流ReceiveStream,然后通過接收媒體流獲取RTP數(shù)據(jù)源(DataSourcr)。
argv[0]=\"fe80::5efe:10.0.2.2/8801/1\";
AVReceive2 avReceive = new AVReceive2(argv);
//省略部分代碼
else if (evt instanceof NewReceiveStreamEvent)
{
try {
stream = ((NewReceiveStreamEvent)evt).getReceiveStream();
DataSource ds = stream.getDataSource();
4.2 視頻播放
將數(shù)據(jù)源傳給Manager.createPlayer()產(chǎn)生一個(gè)播放器。
給播放器添加監(jiān)聽器,等到播放器實(shí)現(xiàn)后,即可顯示播放數(shù)據(jù)。實(shí)時(shí)接收并播放網(wǎng)絡(luò)媒體數(shù)據(jù)流的程序?yàn)槊恳环N新接到的媒體數(shù)據(jù)流產(chǎn)生一個(gè)播放器,一邊接收媒體數(shù)據(jù)流,一邊將媒體數(shù)據(jù)流播放出來,實(shí)現(xiàn)利用rtp協(xié)議在網(wǎng)絡(luò)中實(shí)時(shí)接收并播放媒體數(shù)據(jù)流。
Player p = javax.media.Manager.createPlayer(ds);
p.addControllerListener(this);
p.realize();
PlayerWindow pw = new PlayerWindow(p, stream);
playerWindows.addElement(pw);
5 結(jié)束語
本文主要介紹了RTP/RTCP協(xié)議和實(shí)現(xiàn)視頻監(jiān)控的JMF中的關(guān)鍵技術(shù)。然后配置IPV6網(wǎng)絡(luò)實(shí)驗(yàn)環(huán)境,利用Jbuilder和JMF實(shí)現(xiàn)了視頻監(jiān)控功能。
參考文獻(xiàn):
[1] 郭永宏,劉宏忠,張運(yùn)凱.IPV6實(shí)驗(yàn)網(wǎng)建設(shè)研究[J].實(shí)驗(yàn)室科學(xué),2005,(4):76-79.
[2] [美]Joseph Davies.理解IPV6[M].張曉彤,晏國晟,曾慶峰,譯.北京:清華大學(xué)出版社,2004.
[3] 華為3COM技術(shù)有限公司.PV6技術(shù)[M].北京:清華大學(xué)出版社,2004.
[4] 周艷.全球IPV6發(fā)展近況分析[J].世界電信,2006,(1):12-15.
[5] 喬曉琳.基于IPv6網(wǎng)絡(luò)下的視頻電話系統(tǒng)的實(shí)現(xiàn)[J].中國高新技術(shù)企業(yè),2007,(13):103-105.
[6] 黃銳強(qiáng),張凌,張平,等.基于移動(dòng)IPv6的視頻電話會(huì)議系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2003,(35):139-144.