羅玉盤
隨著互聯(lián)網(wǎng)行業(yè)的快速發(fā)展和移動(dòng)智能手機(jī)的普及,移動(dòng)視頻的需求呈爆炸式增長(zhǎng),人們對(duì)于隨時(shí)隨地的多媒體訪問需求日益迫切[1]。本文基于Live555 和Androidpn 設(shè)計(jì)并實(shí)現(xiàn)了視頻實(shí)時(shí)傳輸系統(tǒng)。其中Live555 是一個(gè)為流媒體提供解決方案的跨平臺(tái)的C++開源項(xiàng)目,Androidpn 實(shí)現(xiàn)了從服務(wù)器到Android 移動(dòng)平臺(tái)的文本消息推送,是基于XMPP 協(xié)議的Java 實(shí)現(xiàn)。通過流媒體控制傳輸,軟硬件編解碼,在局域網(wǎng)內(nèi)實(shí)現(xiàn)Android 設(shè)備之間流暢視頻傳輸功能[2]。文章具體討論分析系統(tǒng)服務(wù)器端的設(shè)計(jì)和實(shí)現(xiàn),考慮到移動(dòng)設(shè)備的性能限制,通過服務(wù)器轉(zhuǎn)發(fā)視頻流后,可實(shí)現(xiàn)多終端播放。目前Live555 工程無法自定義視頻文件存放目錄和服務(wù)監(jiān)聽端口號(hào),通過優(yōu)化Live555 開源工程,加入啟動(dòng)參數(shù)設(shè)置,實(shí)現(xiàn)了多用戶同時(shí)進(jìn)行視頻傳輸。
本系統(tǒng)主要包含兩個(gè)子系統(tǒng),分別是客戶端和服務(wù)器端??蛻舳丝赏瑫r(shí)發(fā)送和播放視頻數(shù)據(jù),服務(wù)器端則集成了Live555 和Androidpn 兩個(gè)開源框架,其中Live555 負(fù)責(zé)視頻流處理,Androidpn 負(fù)責(zé)消息推送。系統(tǒng)的功能結(jié)構(gòu)如圖1 所示,業(yè)務(wù)流程如圖2 所示。
系統(tǒng)的各個(gè)子系統(tǒng)功能詳細(xì)介紹如下:
1)采集客戶端主要負(fù)責(zé)對(duì)視頻數(shù)據(jù)的采集、編碼和發(fā)送。采集客戶端的視頻發(fā)送過程是與服務(wù)器建立RTSP 連接[1],從攝像頭提取視頻數(shù)據(jù),使用H.264 進(jìn)行編碼[3],打包成 RTP 數(shù)據(jù)包,發(fā)送至服務(wù)器端。
2)流媒體服務(wù)器端主要負(fù)責(zé)收集客戶端發(fā)送的視頻數(shù)據(jù),進(jìn)行存儲(chǔ)并轉(zhuǎn)發(fā),同時(shí)提供對(duì)視頻數(shù)據(jù)以及客戶端用戶進(jìn)行管理控制的功能。流媒體服務(wù)器集成了Live555 和Androidpn 兩個(gè)開源框架,其中Live555 負(fù)責(zé)實(shí)現(xiàn)視頻直播、點(diǎn)播以及錄制等功能,Androidpn 負(fù)責(zé)實(shí)現(xiàn)客戶端在線管理以及服務(wù)端到客戶端的消息推送。
3)播放客戶端主要負(fù)責(zé)對(duì)視頻數(shù)據(jù)的接收、解碼和播放。客戶端的視頻播放過程是與服務(wù)器建立RTSP 連接,接收并解析RTP 數(shù)據(jù)包,解碼出視頻數(shù)據(jù)進(jìn)行播放。
圖1 視頻實(shí)時(shí)傳輸系統(tǒng)功能結(jié)構(gòu)圖
圖2 視頻實(shí)時(shí)傳輸系統(tǒng)業(yè)務(wù)流程圖
為了支持多用戶同時(shí)在線進(jìn)行傳輸,需要對(duì)Live555 進(jìn)行功能擴(kuò)展,使其能夠自定義監(jiān)聽端口號(hào),不同用戶監(jiān)聽不同端口,同時(shí)能夠自定義視頻文件存放目錄,在點(diǎn)播視頻時(shí)可方便快捷地定位到視頻文件。
首先,優(yōu)化mediaServer 項(xiàng)目,此項(xiàng)目用于實(shí)現(xiàn)視頻文件點(diǎn)播功能。在DynamicRTSPServer.hh 中添加變量,用于記錄視頻文件存放目錄。在live555MediaServer.cpp中的main函數(shù)中,添加從命令行讀取端口號(hào)和視頻文件存放目錄參數(shù)的代碼。在RTSPServer 的初始化代碼行中,將原來的默認(rèn)端口號(hào)554 改為接收到的參數(shù)值。對(duì)DynamicRTSPServer 的視頻文件存放目錄變量進(jìn)行初始化。在DynamicRTSPServer.cpp 的lookupServerMediaSession 函 數(shù) 中,將目錄路徑和文件名進(jìn)行拼接形成完整路徑,作為ServerMediaSession 的鍵值。這樣,將項(xiàng)目編譯后可生成mediaServer.exe 文件,通過命令行執(zhí)行mediaServer.exe-p port-d fileDir 命令即可實(shí)現(xiàn)視頻文件點(diǎn)播功能。
其次,優(yōu)化proxyServer 項(xiàng)目,該項(xiàng)目用于實(shí)現(xiàn)視頻流轉(zhuǎn)發(fā)功能。在live555ProxyServer.cpp中同樣添加從命令行讀取端口號(hào)參數(shù)的代碼。在RTSPServer 的初始化代碼行中,將原來的默認(rèn)端口號(hào)554 改為接收到的參數(shù)值。這樣,將項(xiàng)目編譯后可生成proxyServer.exe 文件,通過命令行執(zhí)行proxyServer.exe-p port rtsp_url 命令即可實(shí)現(xiàn)對(duì)指定視頻流的轉(zhuǎn)發(fā)功能。
最后,優(yōu)化openRTSP 項(xiàng)目,該項(xiàng)目用于實(shí)現(xiàn)視頻流錄制功能。在playCommon.cpp 的main 函數(shù)中,已經(jīng)有從命令行讀取視頻文件存放目錄參數(shù)的代碼。但是在setupStreams 函數(shù)中,原有代碼對(duì)保存的視頻文件名進(jìn)行了修改,需將其改為接收到的參數(shù)值。這樣,將項(xiàng)目編譯后可生成openRTSP.exe 文件,通過命令行執(zhí)行openRTSP.exe-F filePath rtsp_url 命令即可實(shí)現(xiàn)對(duì)指定視頻流的錄制功能。
將Live555 優(yōu)化完畢并編譯好可執(zhí)行文件后,下一步,需要搭建服務(wù)器端程序。在Androidpn 項(xiàng)目的基礎(chǔ)上,集成Live555 的功能。
首先,將所有可執(zhí)行文件拷貝至Androidpn 工程的WEB-INF/video 目錄下。
其次,定義MediaServerFacade 類,該類實(shí)現(xiàn)多個(gè)服務(wù)接口,包括getUserList,getVideoList,call,reply,stop 等。其中g(shù)etUserList 方法返回當(dāng)前在線用戶列表,通過遍歷ClientSession獲取每個(gè)會(huì)話的用戶名;getVideoList 方法返回歷史視頻列表,通過Runtime.getRuntime().exec()方法執(zhí)行上節(jié)中的命令行啟動(dòng)點(diǎn)播服務(wù)進(jìn)程,然后掃描視頻文件存放目錄獲取所有視頻文件名稱;call 方法實(shí)現(xiàn)呼叫指定用戶,通過NotificationManager 的sendNotifications 方 法將呼叫請(qǐng)求推送給指定用戶;reply 方法實(shí)現(xiàn)用戶呼叫應(yīng)答,若被呼叫的用戶選擇拒絕本次呼叫,通過NotificationManager 的sendNotifications 方法將拒絕信息推送給呼叫用戶,若被呼叫的用戶選擇接受本次呼叫,通過Runtime.getRuntime().exec()方法執(zhí)行上節(jié)中的命令行啟動(dòng)轉(zhuǎn)發(fā)服務(wù)和錄制服務(wù)進(jìn)程,并通過NotificationManager 的sendNotifications 方法將轉(zhuǎn)發(fā)視頻流的地址推送給雙方用戶;stop 方法實(shí)現(xiàn)停止視頻傳輸,通過Process.destroy()方法結(jié)束轉(zhuǎn)發(fā)服務(wù)和錄制服務(wù)進(jìn)程,并將停止信息推送給另一方用戶。
最后,修改WEB-INF/web.xml,添加servlet,對(duì)客戶端的服務(wù)調(diào)用進(jìn)行攔截。
將集成完畢的服務(wù)端部署到中間件上,并啟動(dòng)中間件。這里以視頻實(shí)時(shí)傳輸功能為例,當(dāng)兩個(gè)移動(dòng)終端進(jìn)行視頻通信時(shí),在PC 上打開VLC 播放器[2],輸入其中一個(gè)終端的轉(zhuǎn)發(fā)視頻流地址,也能同時(shí)接收視頻,播放結(jié)果比較理想。
測(cè)試表明,在Android 移動(dòng)系統(tǒng)下,服務(wù)器對(duì)客戶端的視頻傳送非常流暢,可實(shí)現(xiàn)多終端接收,穩(wěn)定可靠。
當(dāng)今世界,隨著移動(dòng)終端的種類逐漸增多,功能逐漸增強(qiáng),普及率逐漸升高,視頻通信的市場(chǎng)需求越來越強(qiáng)烈。本系統(tǒng)實(shí)現(xiàn)了Android 移動(dòng)終端之間的視頻通信,多終端接收視頻流,視頻錄制及點(diǎn)播功能,具有實(shí)際意義。