文獻(xiàn)標(biāo)識(shí)碼: A
DOI:10.16157/j.issn.0258-7998.2015.08.035
中文引用格式: 張彤,蘆愛余,,莫建文. 基于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ì)議的方案越來越多,。無論哪種方案,基本都是由移動(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)的用戶通過系統(tǒng)內(nèi)置的攝像頭和麥克風(fēng)采集視頻圖像和語音信號(hào),通過谷歌瀏覽器接入Internet建立連接,,在網(wǎng)絡(luò)傳輸層利用RTP/RTCP協(xié)議實(shí)時(shí)傳輸語音和視頻數(shù)據(jù)給其他客戶端,。這種架構(gòu)的優(yōu)點(diǎn)是無需安裝插件即可在瀏覽器上打開視頻會(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)采用開源的Darwin流媒體服務(wù)器對(duì)實(shí)時(shí)視頻流進(jìn)行處理,,結(jié)合開源庫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播放客戶端采用開源RTSP架構(gòu)live555[7]結(jié)合開源編解碼庫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ī),,通過調(diào)用手機(jī)設(shè)備上的攝像頭和麥克風(fēng),進(jìn)行音視頻采集,。由于在3G網(wǎng)絡(luò)下服務(wù)器訪問手機(jī)移動(dòng)IP地址需要“打洞”,,故采用手機(jī)主動(dòng)推送的方式進(jìn)行視頻傳輸。服務(wù)器端采用支持RTSP協(xié)議的Darwin Stream Server開源服務(wù)器,,負(fù)責(zé)RTSP流的轉(zhuǎn)發(fā),,因不支持視頻存儲(chǔ)功能,,所以結(jié)合開源庫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è)置音視頻采集源,,再通過該類的setAudioEncoder()和setVideoEncoder()設(shè)置音視頻的編碼方式,。以h.264視頻編碼為例,調(diào)用該類中的SetoutputFile函數(shù)綁定LocalSocket實(shí)現(xiàn),。在編碼過程中可以使用硬編碼的方式,,硬編碼是在預(yù)覽過程提前確定視頻的sps、pps,、head(一般為0x00000001),。
(2)RTP/RTCP數(shù)據(jù)壓縮及控制模塊
RTP包傳送可以基于UDP或者TCP,,采用TCP作為傳輸層協(xié)議注重可靠性而不是及時(shí)性,在RTP傳輸過程中應(yīng)用很少,,大部分RTP包發(fā)送都是采用UDP方式,。在RTP會(huì)話過程前,發(fā)送方需要確定接收方的目標(biāo)IP及接收端口,。
(3)RTSP傳輸控制模塊
RTSP協(xié)議作為應(yīng)用層協(xié)議,,RTSP命令的傳輸是基于TCP協(xié)議,RTSP本身不作為數(shù)據(jù)傳輸?shù)膮f(xié)議,,而是作為一種流媒體傳輸過程的控制協(xié)議,。
通過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ù)器)來看,,只要做好標(biāo)準(zhǔn)接口即可,,無需關(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ù)器通過Modules發(fā)送數(shù)據(jù)包來回復(fù)客戶,,處理相應(yīng)的RTSP請(qǐng)求。Darwin服務(wù)器作為流媒體客戶端的中繼代理,,移動(dòng)設(shè)備在RTSP協(xié)議中的ANNOUNCE命令攜帶.sdp文件到Darwin服務(wù)器接收sdp的目錄文件中,。此后視頻播放客戶端就可以通過rtsp://<DSS IP>/***.sdp請(qǐng)求.sdp文件獲取到手機(jī)客戶端對(duì)應(yīng)地址和端口的流。由于Darwin服務(wù)器本身不支持視頻錄制,,故加入開源庫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ī),。通過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類中,通過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ì)話,,通過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ù)包,然后將編碼過后的H264視頻和AAC音頻數(shù)據(jù)從RTP包中按續(xù)提取出來,,并以MP4文件格式封裝,,最后存成文件。在Darwin服務(wù)器中的ProcessRTPData()函數(shù)內(nèi)部處理處理接收到的RTP包,,提取char* packetData數(shù)據(jù)傳遞到MP4文件生成函數(shù)中,。具體通過創(chuàng)建MP4文件句柄、設(shè)置時(shí)間標(biāo)度,、添加h264視頻軌道及aac音頻軌道[10],、添加序列參數(shù)集和圖像參數(shù)集,,最后再寫入文件的方式生成MP4文件。具體視頻存儲(chǔ)步驟如下:
(1)通過MP4Create創(chuàng)建MP4文件句柄,。
(2)通過MP4SetTimeScale設(shè)置時(shí)間標(biāo)度,,即每秒的時(shí)鐘ticks數(shù)。
(3)通過MP4AddH264VideoTrack添加h264視頻track,,MP4AddAudioTrack添加aac音頻track,。
(4)通過MP4AddH264SequenceParameterSet和MP4AddH264PictureParameterSet添加序列參數(shù)集和圖像參數(shù)集。
(5)通過MP4WriteSample寫一幀視頻數(shù)據(jù)或?qū)懸欢我纛l數(shù)據(jù),。
其中duration這個(gè)參數(shù)是用來實(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)前幀保存下來在下次調(diào)用MP4WriteSample時(shí)用,,寫音頻數(shù)據(jù)一樣。
(6)通過MP4Close關(guān)閉打開的MP4文件,。
4 B/S架構(gòu)及C/S架構(gòu)客戶端設(shè)計(jì)
4.1 C/S架構(gòu)客戶端原理
C/S架構(gòu)的播放客戶端通過支持RTSP的開源live555構(gòu)建與手機(jī)移動(dòng)客戶端的RTSP通信,,通過開源編解碼框架ffmpeg的解碼功能進(jìn)行解碼。
通過live555構(gòu)建RTSP的過程為:首先創(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中接收來自網(wǎng)絡(luò)的視音頻數(shù)據(jù)。
獲取到音視頻數(shù)據(jù)后,,通過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ù),,然后通過包隊(duì)列交給RTP解析函數(shù)rtp_parse_packet進(jìn)行第一次解析,。第一次解析的目的是對(duì)包進(jìn)行重新排序,解決因?yàn)榫W(wǎng)絡(luò)抖動(dòng)導(dǎo)致接收到的包序列號(hào)不連續(xù)的問題,。具體是根據(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客戶端通過訪問Darwin服務(wù)器下錄制視頻存放的文件夾,獲取mp4后綴的文件名,,輸出到Web客戶端播放列表中,。Web客戶端實(shí)現(xiàn)圖片保存及視頻大小控制等功能。注冊(cè)VLC的ActiveX[13]嵌入到網(wǎng)頁中,,實(shí)現(xiàn)直播功能,。B/S架構(gòu)播放客戶端如圖4所示。
5 測(cè)試及分析
根據(jù)上述設(shè)計(jì),,客戶端采用B/S架構(gòu)的Web客戶端及C/S架構(gòu)的PC客戶端均可正常觀看直播視頻,,通過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ò)及無線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),。
播放客戶端通過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ò)及無線WiFi網(wǎng)絡(luò)下分別統(tǒng)計(jì)手機(jī)移動(dòng)客戶端的視頻播放延遲時(shí)間,。
通過60個(gè)客戶端同時(shí)請(qǐng)求服務(wù)器連接,表明服務(wù)器在帶寬為100M光纖網(wǎng)絡(luò)的條件下,,可以同時(shí)滿足60個(gè)用戶同時(shí)請(qǐng)求連接,。客戶端同時(shí)請(qǐng)求的數(shù)量由服務(wù)器網(wǎng)絡(luò)帶寬決定,。通過分別在中國(guó)聯(lián)通3G網(wǎng)絡(luò),、中國(guó)電信3G網(wǎng)絡(luò)及無線WiFi網(wǎng)絡(luò)下推送視頻的播放延遲區(qū)別表明,系統(tǒng)整體滿足不同網(wǎng)絡(luò)條件下的需求,,具有較好的實(shí)時(shí)性,。
6 結(jié)束語
本文通過移動(dòng)設(shè)備客戶端、服務(wù)器端,、視頻播放客戶端組成的系統(tǒng)架構(gòu)闡述了一個(gè)新的視頻直播,、錄制及多平臺(tái)播放的解決方案。詳細(xì)討論了移動(dòng)設(shè)備客戶端音視頻采集及傳輸方案,、服務(wù)器端的轉(zhuǎn)發(fā)及存儲(chǔ)方案,,以及視頻播放客戶端的兩種架構(gòu),分析了基于live555的RTSP通信過程及基于mp4v2的視頻存儲(chǔ)過程,,開發(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] 李新樂,,蘇鴻根.流媒體搜索和發(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在無線視頻監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),,2011,35(19):89-92.
[10] 韋崇嶺,,裴海龍.基于無人機(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.