文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2015.08.035
中文引用格式: 張彤,蘆愛(ài)余,莫建文. 基于Darwin的多平臺(tái)多用戶直播、點(diǎn)播系統(tǒng)設(shè)計(jì)[J].電子技術(shù)應(yīng)用,2015,41(8):124-127.
英文引用格式: Zhang Tong,Lu Aiyu,Mo Jianwen. Design of live video streaming, video-on-demand system based on Darwin[J].Application of Electronic Technique,2015,41(8):124-127.
0 引言
隨著3G、4G移動(dòng)互聯(lián)網(wǎng)的發(fā)展,市場(chǎng)上利用手機(jī)等移動(dòng)設(shè)備實(shí)現(xiàn)視頻會(huì)議的方案越來(lái)越多。無(wú)論哪種方案,基本都是由移動(dòng)設(shè)備客戶端、服務(wù)器端、視頻播放客戶端三部分組成。而視頻播放客戶端不外乎采用客戶端/服務(wù)器端(C/S)或?yàn)g覽器/服務(wù)器端(B/S)架構(gòu)。代表性的方案有利用WEBRTC實(shí)現(xiàn)基于谷歌瀏覽器的視頻會(huì)議系統(tǒng)[1-2]。這種B/S架構(gòu)的用戶通過(guò)系統(tǒng)內(nèi)置的攝像頭和麥克風(fēng)采集視頻圖像和語(yǔ)音信號(hào),通過(guò)谷歌瀏覽器接入Internet建立連接,在網(wǎng)絡(luò)傳輸層利用RTP/RTCP協(xié)議實(shí)時(shí)傳輸語(yǔ)音和視頻數(shù)據(jù)給其他客戶端。這種架構(gòu)的優(yōu)點(diǎn)是無(wú)需安裝插件即可在瀏覽器上打開(kāi)視頻會(huì)議,但是視頻編碼采用VP8編碼方式,大部分手機(jī)不提供支持,而且在多人視頻會(huì)議時(shí),會(huì)因帶寬不足影響會(huì)議質(zhì)量?;贑++的crtmpserver流媒體服務(wù)器[3]使用RTMP[4]協(xié)議,在Linux平臺(tái)下運(yùn)行,支持將手機(jī)上傳的RTMP流轉(zhuǎn)發(fā)、存儲(chǔ)的功能。RTMP協(xié)議的客戶端是Flash,可以很好地支持B/S架構(gòu)的流媒體服務(wù)器設(shè)計(jì)。然而RTMP協(xié)議基于TCP/IP協(xié)議,不支持UDP協(xié)議,所以網(wǎng)絡(luò)負(fù)荷比UDP大,傳輸速度也要比UDP慢。
本系統(tǒng)采用開(kāi)源的Darwin流媒體服務(wù)器對(duì)實(shí)時(shí)視頻流進(jìn)行處理,結(jié)合開(kāi)源庫(kù)mp4v2[5]實(shí)現(xiàn)實(shí)時(shí)視頻的轉(zhuǎn)發(fā)和錄制。Darwin服務(wù)器[6]基于RTSP協(xié)議進(jìn)行傳輸,相比RTMP協(xié)議,支持TCP/IP協(xié)議和UDP/RTP協(xié)議,具有更高的實(shí)時(shí)性。系統(tǒng)使用手機(jī)硬編碼實(shí)時(shí)采集音視頻數(shù)據(jù)。C/S播放客戶端采用開(kāi)源RTSP架構(gòu)live555[7]結(jié)合開(kāi)源編解碼庫(kù)ffmpeg實(shí)現(xiàn)視頻直播、點(diǎn)播播放。B/S播放客戶端采用Html5[8]技術(shù)實(shí)現(xiàn)視頻點(diǎn)播,由支持RTSP協(xié)議的VLC Flash插件實(shí)現(xiàn)直播。
1 多平臺(tái)播放解決方案模型
系統(tǒng)由移動(dòng)設(shè)備客戶端、服務(wù)器端、視頻播放客戶端三部分組成。本文中實(shí)驗(yàn)的移動(dòng)客戶端為支持安卓系統(tǒng)的手機(jī),通過(guò)調(diào)用手機(jī)設(shè)備上的攝像頭和麥克風(fēng),進(jìn)行音視頻采集。由于在3G網(wǎng)絡(luò)下服務(wù)器訪問(wèn)手機(jī)移動(dòng)IP地址需要“打洞”,故采用手機(jī)主動(dòng)推送的方式進(jìn)行視頻傳輸。服務(wù)器端采用支持RTSP協(xié)議的Darwin Stream Server開(kāi)源服務(wù)器,負(fù)責(zé)RTSP流的轉(zhuǎn)發(fā),因不支持視頻存儲(chǔ)功能,所以結(jié)合開(kāi)源庫(kù)mp4v2實(shí)現(xiàn)服務(wù)器端視頻流的錄制,存儲(chǔ)手機(jī)客戶端采集的視頻到服務(wù)器上。播放客戶端包括C/S架構(gòu)的PC播放客戶端和B/S架構(gòu)的瀏覽器客戶端,實(shí)現(xiàn)在播放列表中直播或點(diǎn)播文件。系統(tǒng)整體架構(gòu)如圖1所示。
2 手機(jī)端設(shè)計(jì)
2.1 手機(jī)端方案
利用手機(jī)本身硬件的編碼功能,視頻采用H264編碼,音頻采用AAC編碼,將編碼后的音視頻數(shù)據(jù)封裝到RTP包中發(fā)送到服務(wù)器端。手機(jī)客戶端主要由音視頻采集及編碼模塊、RTP/RTCP[9]數(shù)據(jù)壓縮及控制模塊、RTSP傳輸控制模塊三部分組成,流程框圖如圖2所示。
2.2 模塊設(shè)計(jì)
(1)音視頻采集及編碼模塊
采用MediaRecorder類,首先調(diào)用該類的setAudioSource和setVideoSource設(shè)置音視頻采集源,再通過(guò)該類的setAudioEncoder()和setVideoEncoder()設(shè)置音視頻的編碼方式。以h.264視頻編碼為例,調(diào)用該類中的SetoutputFile函數(shù)綁定LocalSocket實(shí)現(xiàn)。在編碼過(guò)程中可以使用硬編碼的方式,硬編碼是在預(yù)覽過(guò)程提前確定視頻的sps、pps、head(一般為0x00000001)。
(2)RTP/RTCP數(shù)據(jù)壓縮及控制模塊
RTP包傳送可以基于UDP或者TCP,采用TCP作為傳輸層協(xié)議注重可靠性而不是及時(shí)性,在RTP傳輸過(guò)程中應(yīng)用很少,大部分RTP包發(fā)送都是采用UDP方式。在RTP會(huì)話過(guò)程前,發(fā)送方需要確定接收方的目標(biāo)IP及接收端口。
(3)RTSP傳輸控制模塊
RTSP協(xié)議作為應(yīng)用層協(xié)議,RTSP命令的傳輸是基于TCP協(xié)議,RTSP本身不作為數(shù)據(jù)傳輸?shù)膮f(xié)議,而是作為一種流媒體傳輸過(guò)程的控制協(xié)議。
通過(guò)RTSP與服務(wù)器進(jìn)行音視頻流媒體傳輸有兩種方式:拉模式和推模式。拉模式是主從模式,拉方(例如視頻播放客戶端)需要維護(hù)各個(gè)被拉方(例如攝像頭)的狀態(tài),如url信息、端口信息等,只有拉方主動(dòng)請(qǐng)求被拉方告知相應(yīng)信息才能啟動(dòng)。推模式主動(dòng)權(quán)在推方(本文即為安卓移動(dòng)設(shè)備端),從接方(本文即為Darwin服務(wù)器)來(lái)看,只要做好標(biāo)準(zhǔn)接口即可,無(wú)需關(guān)注有多少推方會(huì)推送數(shù)據(jù)。由于移動(dòng)設(shè)備在3G網(wǎng)絡(luò)下,如果選擇拉模式,同一個(gè)網(wǎng)段下還需穿透NAT,即“打洞”,不方便做遠(yuǎn)程音視頻傳輸,所以選擇推模式下的視頻傳輸。
3 Darwin服務(wù)器端設(shè)計(jì)
本系統(tǒng)中服務(wù)器端負(fù)責(zé)轉(zhuǎn)發(fā)和存儲(chǔ)音視頻數(shù)據(jù),主要由RTSP連接建立模塊、視頻轉(zhuǎn)發(fā)模塊及視頻錄制模塊三部分構(gòu)成。視頻播放客戶端發(fā)送RTSP請(qǐng)求,Darwin流媒體服務(wù)器通過(guò)Modules發(fā)送數(shù)據(jù)包來(lái)回復(fù)客戶,處理相應(yīng)的RTSP請(qǐng)求。Darwin服務(wù)器作為流媒體客戶端的中繼代理,移動(dòng)設(shè)備在RTSP協(xié)議中的ANNOUNCE命令攜帶.sdp文件到Darwin服務(wù)器接收sdp的目錄文件中。此后視頻播放客戶端就可以通過(guò)rtsp://<DSS IP>/***.sdp請(qǐng)求.sdp文件獲取到手機(jī)客戶端對(duì)應(yīng)地址和端口的流。由于Darwin服務(wù)器本身不支持視頻錄制,故加入開(kāi)源庫(kù)mp4v2實(shí)現(xiàn)視頻錄制,具體各模塊如下:
3.1 RTSP連接建立模塊
Darwin Streaming Server定義了RTSPListenerSocket Class,它繼承自TCPListenerSocket Class,用于對(duì)RTSP連接請(qǐng)求進(jìn)行處理,進(jìn)入RTSP狀態(tài)機(jī)。通過(guò)RTSPSession對(duì)象完成對(duì)請(qǐng)求類型的匹配,如果匹配成功,則注冊(cè)QTSS_RTSPPreProcessor_Role角色的模式。在這個(gè)角色模式下,進(jìn)入QTSSReflectorModule類處理了每種RTSP消息,比如本次RTSP請(qǐng)求的Describe、Setup、Play指令。該類中針對(duì)各種請(qǐng)求指令都有對(duì)應(yīng)的單獨(dú)函數(shù)處理,分別對(duì)應(yīng)著DoAnnounce、DoDescribe、DoSetup和DoPlay函數(shù)。除此之外,RTSP狀態(tài)機(jī)的終結(jié)點(diǎn)所在位置也是在QTSSReflectorModule類中,通過(guò)Shutdown()函數(shù)實(shí)現(xiàn)RTSP會(huì)話的結(jié)束。
3.2 視頻轉(zhuǎn)發(fā)建立模塊
當(dāng)收到一路RTSP連接請(qǐng)求時(shí),在DSS中為RTSPSession類對(duì)象,首先需要解析請(qǐng)求頭部是否為轉(zhuǎn)發(fā)請(qǐng)求,進(jìn)而解析其請(qǐng)求的后續(xù)部分。進(jìn)行查詢字符串的解析,得到需要轉(zhuǎn)發(fā)的具體url,建立一路面向url源的會(huì)話,通過(guò)Describe命令獲取到sdp信息進(jìn)行保存,再轉(zhuǎn)發(fā)到請(qǐng)求Describe的客戶端,而且Setup、Play分別將對(duì)應(yīng)的響應(yīng)碼返回給客戶端,在轉(zhuǎn)發(fā)具體的數(shù)據(jù)時(shí),建立一路ReflectorSession,將獲取到的rtp數(shù)據(jù)轉(zhuǎn)發(fā)到添加進(jìn)ReflectorSession轉(zhuǎn)發(fā)列表的客戶端中。
3.3 視頻錄制模塊
要實(shí)現(xiàn)視頻錄制,首先需要找到音視頻RTP數(shù)據(jù)包,然后將編碼過(guò)后的H264視頻和AAC音頻數(shù)據(jù)從RTP包中按續(xù)提取出來(lái),并以MP4文件格式封裝,最后存成文件。在Darwin服務(wù)器中的ProcessRTPData()函數(shù)內(nèi)部處理處理接收到的RTP包,提取char* packetData數(shù)據(jù)傳遞到MP4文件生成函數(shù)中。具體通過(guò)創(chuàng)建MP4文件句柄、設(shè)置時(shí)間標(biāo)度、添加h264視頻軌道及aac音頻軌道[10]、添加序列參數(shù)集和圖像參數(shù)集,最后再寫入文件的方式生成MP4文件。具體視頻存儲(chǔ)步驟如下:
(1)通過(guò)MP4Create創(chuàng)建MP4文件句柄。
(2)通過(guò)MP4SetTimeScale設(shè)置時(shí)間標(biāo)度,即每秒的時(shí)鐘ticks數(shù)。
(3)通過(guò)MP4AddH264VideoTrack添加h264視頻track,MP4AddAudioTrack添加aac音頻track。
(4)通過(guò)MP4AddH264SequenceParameterSet和MP4AddH264PictureParameterSet添加序列參數(shù)集和圖像參數(shù)集。
(5)通過(guò)MP4WriteSample寫一幀視頻數(shù)據(jù)或?qū)懸欢我纛l數(shù)據(jù)。
其中duration這個(gè)參數(shù)是用來(lái)實(shí)現(xiàn)音視頻同步用的,如果設(shè)置錯(cuò)了會(huì)造成音視頻不同步,甚至?xí)霈F(xiàn)crash現(xiàn)象。對(duì)于視頻流MP4WriteSample函數(shù),每次調(diào)用是錄制前一幀數(shù)據(jù),用當(dāng)前幀的時(shí)間戳和前一幀的時(shí)間戳計(jì)算duration值,然后把當(dāng)前幀保存下來(lái)在下次調(diào)用MP4WriteSample時(shí)用,寫音頻數(shù)據(jù)一樣。
(6)通過(guò)MP4Close關(guān)閉打開(kāi)的MP4文件。
4 B/S架構(gòu)及C/S架構(gòu)客戶端設(shè)計(jì)
4.1 C/S架構(gòu)客戶端原理
C/S架構(gòu)的播放客戶端通過(guò)支持RTSP的開(kāi)源live555構(gòu)建與手機(jī)移動(dòng)客戶端的RTSP通信,通過(guò)開(kāi)源編解碼框架ffmpeg的解碼功能進(jìn)行解碼。
通過(guò)live555構(gòu)建RTSP的過(guò)程為:首先創(chuàng)建BasicTaskScheduler和BasicUsageEnvironment對(duì)象,用于調(diào)度不同事件。創(chuàng)建RTSPClient對(duì)象,由RTSPClient對(duì)象向服務(wù)器發(fā)送RTSP中的OPTION消息命令并等待接受回應(yīng),返回SDPDescription字符串即sdp文件內(nèi)容。在任務(wù)調(diào)度while循環(huán)中配置所有子會(huì)話對(duì)象,為每個(gè)子會(huì)話創(chuàng)建RTPSource和RTCPInstance對(duì)象,并創(chuàng)建兩個(gè)GroupSock對(duì)象。將每個(gè)GroupSock對(duì)象中創(chuàng)建的socket描述符置入 BasicTaskScheduler::fReadSet中,RTPSource對(duì)象的創(chuàng)建的依據(jù)是SDPDescription。由RTSPClient對(duì)象向服務(wù)器發(fā)送SETUP消息并接受回應(yīng),while循環(huán)中為每個(gè)子會(huì)話創(chuàng)建接收器FileSink對(duì)象,由RTSPClient對(duì)象向服務(wù)器發(fā)送PLAY消息并接受回應(yīng),F(xiàn)ileSink的緩沖區(qū)和包含寫入文件操作的一個(gè)函數(shù)指針配置給RTPSource對(duì)象,這個(gè)緩沖區(qū)將會(huì)在networkReadHandler中接收來(lái)自網(wǎng)絡(luò)的視音頻數(shù)據(jù)。
獲取到音視頻數(shù)據(jù)后,通過(guò)ffmpeg[11]的解碼功能進(jìn)行解碼處理,流程如圖3所示。
avformat_open_input函數(shù)對(duì)輸入的文件名進(jìn)行解析,并發(fā)起與Darwin服務(wù)器的RTSP交互。在數(shù)據(jù)讀取線程中,使用rtsp_read_packet函數(shù)用于每個(gè)RTP包的讀取和第一次排序解析。首先調(diào)用rtp_read函數(shù)從緩沖區(qū)獲取數(shù)據(jù),然后通過(guò)包隊(duì)列交給RTP解析函數(shù)rtp_parse_packet進(jìn)行第一次解析。第一次解析的目的是對(duì)包進(jìn)行重新排序,解決因?yàn)榫W(wǎng)絡(luò)抖動(dòng)導(dǎo)致接收到的包序列號(hào)不連續(xù)的問(wèn)題。具體是根據(jù)RTP協(xié)議解析RTP包頭信息,對(duì)RTP包頭的包序列號(hào)按遞增順序重新排序。然后調(diào)用av_parser_parse2函數(shù)對(duì)RTP包進(jìn)行第二次重組幀解析,目的是將包中的數(shù)據(jù)重新按幀進(jìn)行組合,組成一幀數(shù)據(jù)的avpacket。
4.2 B/S架構(gòu)的實(shí)現(xiàn)
B/S架構(gòu)的服務(wù)器端采用Apache服務(wù)器,Web客戶端采用HTML5的技術(shù)直接播放緩存在Darwin服務(wù)器下的MP4[12]視頻。Web客戶端通過(guò)訪問(wèn)Darwin服務(wù)器下錄制視頻存放的文件夾,獲取mp4后綴的文件名,輸出到Web客戶端播放列表中。Web客戶端實(shí)現(xiàn)圖片保存及視頻大小控制等功能。注冊(cè)VLC的ActiveX[13]嵌入到網(wǎng)頁(yè)中,實(shí)現(xiàn)直播功能。B/S架構(gòu)播放客戶端如圖4所示。
5 測(cè)試及分析
根據(jù)上述設(shè)計(jì),客戶端采用B/S架構(gòu)的Web客戶端及C/S架構(gòu)的PC客戶端均可正常觀看直播視頻,通過(guò)mp4v2可實(shí)現(xiàn)視頻存儲(chǔ)功能。本系統(tǒng)服務(wù)器使用中國(guó)電信100M光纖網(wǎng)絡(luò),用60個(gè)B/S架構(gòu)及C/S架構(gòu)客戶端分3組同時(shí)請(qǐng)求3路手機(jī)推送視頻。3路手機(jī)視頻端碼率均設(shè)為為500 kb/s,視頻采集分辨率分別為320×240、640×480、720×1 280,并在720p分辨率的條件下分3次在中國(guó)聯(lián)通3G網(wǎng)絡(luò)、中國(guó)電信3G網(wǎng)絡(luò)及無(wú)線WiFi網(wǎng)絡(luò)下分別統(tǒng)計(jì)手機(jī)移動(dòng)客戶端的視頻播放延遲時(shí)間。其中服務(wù)器所用的硬件環(huán)境為:中央處理器:Inter Core I5-2 450 M 2.5 GHz雙核四線程;內(nèi)存:4 GB DDR3 1 333 MHz;硬盤:5 400 rad/min;操作系統(tǒng):32位 Windows7 操作系統(tǒng)。
播放客戶端通過(guò)RTSP請(qǐng)求觀看直播,請(qǐng)求如:rtsp:// 202.193.53.103/teststream.sdp,由sdp文件名區(qū)分不同推送視頻源。表1統(tǒng)計(jì)了在中國(guó)聯(lián)通3G網(wǎng)絡(luò)、中國(guó)電信3G網(wǎng)絡(luò)及無(wú)線WiFi網(wǎng)絡(luò)下分別統(tǒng)計(jì)手機(jī)移動(dòng)客戶端的視頻播放延遲時(shí)間。
通過(guò)60個(gè)客戶端同時(shí)請(qǐng)求服務(wù)器連接,表明服務(wù)器在帶寬為100M光纖網(wǎng)絡(luò)的條件下,可以同時(shí)滿足60個(gè)用戶同時(shí)請(qǐng)求連接??蛻舳送瑫r(shí)請(qǐng)求的數(shù)量由服務(wù)器網(wǎng)絡(luò)帶寬決定。通過(guò)分別在中國(guó)聯(lián)通3G網(wǎng)絡(luò)、中國(guó)電信3G網(wǎng)絡(luò)及無(wú)線WiFi網(wǎng)絡(luò)下推送視頻的播放延遲區(qū)別表明,系統(tǒng)整體滿足不同網(wǎng)絡(luò)條件下的需求,具有較好的實(shí)時(shí)性。
6 結(jié)束語(yǔ)
本文通過(guò)移動(dòng)設(shè)備客戶端、服務(wù)器端、視頻播放客戶端組成的系統(tǒng)架構(gòu)闡述了一個(gè)新的視頻直播、錄制及多平臺(tái)播放的解決方案。詳細(xì)討論了移動(dòng)設(shè)備客戶端音視頻采集及傳輸方案、服務(wù)器端的轉(zhuǎn)發(fā)及存儲(chǔ)方案,以及視頻播放客戶端的兩種架構(gòu),分析了基于live555的RTSP通信過(guò)程及基于mp4v2的視頻存儲(chǔ)過(guò)程,開(kāi)發(fā)出了整套直播、點(diǎn)播系統(tǒng)。同時(shí),設(shè)計(jì)了相應(yīng)的測(cè)試實(shí)驗(yàn),為實(shí)現(xiàn)高可靠、高實(shí)時(shí)性的視頻直播系統(tǒng)提供了一種較為可行的方法。
參考文獻(xiàn)
[1] ELLEUCH W.Models for multimedia conference between browsers based on WebRTC[C].Wireless and Mobile Computing,Networking and Communications(WiMob),2013 IEEE 9th International Conference on,IEEE,2013:279-284.
[2] RHINOW F,VELOSO P P,PUYELO C,et al.P2P live video streaming in WebRTC[C].2014 World Congress on WCCAIS,2014:1-6.
[3] 丁杰,潘晨光,田源.基于crtmpserver的手機(jī)直播系統(tǒng)[J].計(jì)算機(jī)工程與設(shè)計(jì),2014,35(9):3173-3178.
[4] 姜浩然,徐林.基于RTMP的流媒體服務(wù)器的研究[J].計(jì)算機(jī)與數(shù)字工程,2011,39(10):104-108.
[5] 史紅周,黃晁.一種基于MP4文件的視頻流關(guān)鍵幀索引播放方法[J].微電子學(xué)與計(jì)算機(jī),2002,19(7):44-47.
[6] 李新樂(lè),蘇鴻根.流媒體搜索和發(fā)布技術(shù)在移動(dòng)設(shè)備上的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(6):1428-1431.
[7] 茅炎菲,黃忠東.基于RTSP協(xié)議網(wǎng)絡(luò)監(jiān)控系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32(7):2523-2526.
[8] 羅大暉,陳娟.基于HTML5的Web離線應(yīng)用研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2012,29(12):262-264.
[9] 李校林,劉海波,張杰,等.RTP/RTCP,RTSP在無(wú)線視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2011,35(19):89-92.
[10] 韋崇嶺,裴海龍.基于無(wú)人機(jī)平臺(tái)H264視頻傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,2012,20(1):209-211.
[11] 劉麗霞,邊金松,張琍,等.基于FFMPEG解碼的音視頻同步實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013,34(6):2087-2092.
[12] 李興華,楊天奇.MP4共享FLV數(shù)據(jù)研究與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2014(3):31-34.
[13] ZHU G,ZHANG F,ZHU W,et al.HTML5 based media player for real-time video surveillance[C].Image and Signal Processing(CISP),2012 5th International Congress on.IEEE,2012:245-248.