馮 浩,管 鮑
(1.武漢郵電科學(xué)研究院,湖北 武漢 430074;2.武漢虹信通信技術(shù)有限責(zé)任公司,湖北 武漢 430074)
衡量無線視頻質(zhì)量的重要指標(biāo)是流暢性和實(shí)時(shí)性。無線網(wǎng)絡(luò)傳輸?shù)纳闲袔捰邢?,傳輸?shù)囊曨l圖像往往容易出現(xiàn)馬賽克和延遲等現(xiàn)象。傳統(tǒng)的無線視頻通信系統(tǒng)主要是單卡的模式,通過一張卡傳輸。這樣利用的網(wǎng)絡(luò)帶寬資源大概在300 kbit/s左右,如果網(wǎng)絡(luò)狀況好可以達(dá)到400 kbit/s左右,這樣得到的視頻圖像也容易出現(xiàn)馬賽克等現(xiàn)象,不能很好地解決無線網(wǎng)絡(luò)帶寬不足的問題。本文針在雙模無線視頻通信的基礎(chǔ)上,通過高性能的ARM9芯片控制MC8630無線模塊,這樣將無線網(wǎng)絡(luò)資源提高到600 kbit/s,如果網(wǎng)絡(luò)狀況好可以達(dá)到800 kbit/s左右,很大程度上能避免無線視頻傳輸過程中出現(xiàn)的馬賽克和視頻畫面延時(shí),基本保證了視頻的流暢性和實(shí)時(shí)性。
SIP是一個(gè)應(yīng)用層的控制協(xié)議,可以用來建立、修改、和終止多媒體會(huì)話的協(xié)議。在多媒體通信中完成信令的交互,SIP協(xié)議棧主要由eXosip模塊、osip2模塊、osipparser2模塊組成。其中osipparser2主要完成SIP和SDP消息的文本解析器和文本生成器。osip2模塊主要實(shí)現(xiàn)事務(wù)狀態(tài)機(jī)的維護(hù)和運(yùn)行,eXosip模塊實(shí)現(xiàn)底層socket傳送/接收以及上層的數(shù)據(jù)處理。SIP協(xié)議完成會(huì)話還需要和SDP協(xié)議配合使用,SDP協(xié)議是會(huì)話描述協(xié)議,主要描述會(huì)話名稱和意圖,構(gòu)成會(huì)話的媒體等信息[1]。
實(shí)時(shí)傳輸協(xié)議(Realtime Transport Protocol,RTP),是針對(duì)Internet上多媒體數(shù)據(jù)流的一個(gè)傳輸協(xié)議,由IETF作為RFC1889發(fā)布,現(xiàn)在最新版為RFC3550。RTP被定義為在一對(duì)一或一對(duì)多的傳輸情況下工作,其目的是提供時(shí)間信息和實(shí)現(xiàn)流同步。RTP本身只保證實(shí)時(shí)數(shù)據(jù)的傳輸,并不能為按順序傳送數(shù)據(jù)包提供可靠的傳送機(jī)制,也不提供流量控制或擁塞控制,它依靠RTCP提供這些服務(wù)。RTCP協(xié)議負(fù)責(zé)管理傳輸質(zhì)量,在當(dāng)前應(yīng)用進(jìn)程之間交換控制信息,提供流量控制和擁塞控制服務(wù)。
本方案主芯片采用TMS320DM368處理器,主頻432 MHz,芯片內(nèi)部集成有DSP處理器,TI開放其DSP接口,可以支持H.264/MPEG-4的高清編解碼。CY7C65640A的驅(qū)動(dòng)可以直接參考LinuxUSB的驅(qū)動(dòng),選擇CY7C65640A芯片擴(kuò)展DM365的USB接口,連接兩個(gè)MC8630。本系統(tǒng)采用中興通訊的MC8630芯片,如圖1所示。該芯片是1個(gè)CMDA20001x/EVDO Rev.A的3G無線模塊,上行通信速度理論值為1.8 Mbit/s。由于其資料廣泛可以參考該芯片Linux的驅(qū)動(dòng)程序,從而可大大減小軟件開發(fā)周期,滿足應(yīng)用需求。本文重點(diǎn)闡述軟件設(shè)計(jì)部分[2]。
圖1 系統(tǒng)結(jié)構(gòu)示意圖
軟件設(shè)計(jì)包括嵌入式軟件設(shè)計(jì)和客戶端軟件設(shè)計(jì)。其中嵌入式軟件設(shè)計(jì)包括對(duì)MC8630芯片驅(qū)動(dòng)設(shè)計(jì)和信令交互數(shù)據(jù)發(fā)送軟件設(shè)計(jì)部分。客戶端軟件設(shè)計(jì)部分包含解包部分和解碼部分。組幀協(xié)議如圖2所示。嵌入式軟件設(shè)計(jì)按照此協(xié)議采集視頻數(shù)據(jù)并按照H.264組幀,通過USB接口將視頻數(shù)據(jù)發(fā)送給客戶端??蛻舳私邮针p模發(fā)送過來的數(shù)據(jù),并將該數(shù)據(jù)通過FFmpeg解碼庫顯示播放出來。
圖2 組幀協(xié)議示意圖
其中B代表byte,幀開頭以B1C1B2C2來區(qū)分。Playload定義8為音頻,77為視頻。碼流類型為:0x01代表H.264壓縮,0x02代表MPEG-4壓縮,0x81代表G.711壓縮,0x82代表G.729壓縮,0x83代表MP3壓縮。
雙卡定義的視頻發(fā)送策略如圖3所示。雙網(wǎng)卡分別傳送I幀和P幀數(shù)據(jù)[3]。
圖3 視頻發(fā)包示意圖
MC8630作為塊設(shè)備,該芯片提供Linux內(nèi)核源碼驅(qū)動(dòng)程序,通過移植工作,將該驅(qū)動(dòng)加載到內(nèi)核當(dāng)中。經(jīng)過AT指令配置之后即可使用,當(dāng)模塊狀態(tài)為可用時(shí),通過Linux塊設(shè)備操作流程向發(fā)送端發(fā)送數(shù)據(jù)。
CY7C65640的驅(qū)動(dòng)設(shè)計(jì)可以參考通用USB驅(qū)動(dòng)程序設(shè)計(jì),大部分配置任務(wù)都在驅(qū)動(dòng)程序中完成。驅(qū)動(dòng)程序加載到內(nèi)核當(dāng)中,系統(tǒng)上電即可使用[4]。
DM368芯片是ARM+DSP雙核結(jié)構(gòu),利用DSP強(qiáng)大的運(yùn)算功能,實(shí)現(xiàn)對(duì)視頻信號(hào)的編碼,編碼之后的視頻從DSP傳送到ARM中,經(jīng)過組幀協(xié)議之后等待客戶端的鏈接,一旦接收到視頻請(qǐng)求就將視頻發(fā)送出去。無線視頻服務(wù)器還需接收客戶端發(fā)送過來的云臺(tái)控制,OSD參數(shù)查詢和視頻分辨力、碼率修改等信令。這些信令控制著終端運(yùn)行的參數(shù)。信令的交互采用的是SIP協(xié)議,消息體格式采用的是SDP方式或XML方式,通過SDP協(xié)議傳遞RTP視頻流信息;通過XML消息體傳遞云臺(tái)控制等信息。
當(dāng)視頻服務(wù)器接收到客戶端發(fā)送視頻請(qǐng)求SIP信令時(shí),解析SDP消息體,從m參數(shù)中獲取RTP端口,Playload值等信息,然后調(diào)用RTP協(xié)議根據(jù)指定端口將數(shù)據(jù)發(fā)送到客戶端。同時(shí),當(dāng)視頻服務(wù)器接收到客戶端發(fā)送的云臺(tái)控制等信令時(shí),解析XML消息體,完成對(duì)相應(yīng)結(jié)構(gòu)體的賦值,從而控制著終端運(yùn)行的參數(shù)。
由服務(wù)器處理流程得知,應(yīng)用程序設(shè)計(jì)包含視頻緩沖區(qū)設(shè)計(jì)部分和信令交互部分。視頻緩沖區(qū)完成采集的數(shù)據(jù)緩存和視頻數(shù)據(jù)的發(fā)送。信令交互部分完成SIP信令交互和RTP信令交互。
4.2.1 視頻緩沖區(qū)設(shè)計(jì)
DM368芯片上運(yùn)行的是Linux實(shí)時(shí)操作系統(tǒng),利用Linux線程間通信的同步與互斥機(jī)制和Linux信號(hào)量機(jī)制來實(shí)現(xiàn)視頻緩沖隊(duì)列。視頻緩沖隊(duì)列定義結(jié)構(gòu)體如下:
隊(duì)列相關(guān)函數(shù)說明包含在sendqueue.c文件當(dāng)中,QueueInit()函數(shù)主要完成緩沖隊(duì)列的初始化,客戶端關(guān)掉視頻時(shí)調(diào)用QueueEmpty()函數(shù)清空接收隊(duì)列,客戶端申請(qǐng)視頻時(shí)調(diào)用QueueOutput()函數(shù)取出隊(duì)列數(shù)據(jù)進(jìn)行發(fā)送,接受客戶端RTCP統(tǒng)計(jì)的丟包率如果丟包率大時(shí)調(diào)用drop_packet()函數(shù)丟包,丟棄P幀和緊隨P幀之后的I幀,以降低發(fā)送碼流。
4.2.2 信令交互部分設(shè)計(jì)
主程序在完成初始化之后,主動(dòng)向客戶端發(fā)送1個(gè)SIP注冊(cè)消息,并開通心跳包線程,每隔2 min發(fā)送1次心跳包,心跳包只包含時(shí)間信息,客戶端接收到心跳包會(huì)返回1個(gè)心跳包回應(yīng),當(dāng)心跳包線程超過2 min未收到心跳包,則重新注冊(cè)。與此同時(shí)在主程序中開啟SIP線程接收客戶端發(fā)送過來的SIP信令,定義eXosip_event_t*stEvent接收事件,如果該事件類型為EXOSIP_CALL_INVITE,表示客戶端視頻請(qǐng)求消息,此時(shí)調(diào)用osipparser2庫函數(shù)解析SDP的內(nèi)容,獲取RTP發(fā)送端口,向客戶端的該端口發(fā)送RTP數(shù)據(jù)流。由于RTP庫支持1500的包長(zhǎng)度,此處傳輸?shù)拈L(zhǎng)度為1362。同時(shí)開啟RTP監(jiān)聽線程,監(jiān)聽客戶端發(fā)送過來的RTCP包,根據(jù)收到的包信息,動(dòng)態(tài)調(diào)整發(fā)送的碼流大小,當(dāng)碼流過大時(shí)候,此時(shí)采取丟包策略調(diào)用drop_packet()函數(shù),丟掉P幀和緊隨其后的I幀數(shù)據(jù)。
嵌入式軟件設(shè)計(jì)部分主要處理客戶端發(fā)送過來的SIP消息、包括云臺(tái)控制消息、視頻請(qǐng)求消息,消息的處理如下:
初始化RTP會(huì)話,建立RTP連接,開始發(fā)送數(shù)據(jù)。發(fā)送SIP回應(yīng)消息。
客戶端軟件設(shè)計(jì)部分包括解碼部分和信令交互部分。
信令交互部分采用的SIP信令控制協(xié)議由點(diǎn)擊客戶端界面按鈕來觸發(fā),此處用到的SIP格式有MESSAGE消息和INVITE請(qǐng)求。MESSAGE消息用來處理控制消息和視頻服務(wù)器參數(shù)獲取、設(shè)置消息。INVITE請(qǐng)求用于RTP請(qǐng)求等。消息的組包流程為:1)初始化消息頭、設(shè)置消息頭域的值;2)判斷是否帶有消息體,帶有消息體判斷是SDP消息體還是其他消息體,否則進(jìn)行步驟4);3)初始化SDP消息體,非SDP消息體的時(shí)候初始化XML消息體;4)完成SIP字符串的生成,完成SIP協(xié)議的發(fā)送。其中Content-Type的值是XML的時(shí)候設(shè)置為application/global_eye_v10+xml。是SDP的時(shí)候設(shè)置為application/sdp。
舉例RTP請(qǐng)求SIP協(xié)議發(fā)送的例子[5]。
在客戶端也要開啟SIP監(jiān)聽消息進(jìn)程,監(jiān)聽線程主要監(jiān)聽CALL消息的回應(yīng)消息、注冊(cè)消息和SIP回應(yīng)消息。客戶端獲取相應(yīng)的參數(shù)之后,完成界面的更新操作。
客戶端采用VC++6.0開發(fā),客戶端發(fā)送CALL消息申請(qǐng)視頻之后,收到SIP的EXOSIP_CALL_ANSWERED回應(yīng)消息,然后發(fā)送ACK,服務(wù)器在接收到ACK之后,開始調(diào)用RTP協(xié)議發(fā)送視頻流??蛻舳吮O(jiān)聽RTP端口接收數(shù)據(jù)流設(shè)置。定義rtp_event*e接收事件,當(dāng)e->type=RX_RTP時(shí),將雙模接收到的數(shù)據(jù)送入inputdata()函數(shù)進(jìn)行組包解碼顯示。由于接收的數(shù)據(jù)是雙模發(fā)送過來的,則需要對(duì)接收的數(shù)據(jù)進(jìn)行組包、排序處理。根據(jù)RTP包的特性,同一幀的數(shù)據(jù)時(shí)間戳TS相等,RTP小包序列號(hào)(seq)是連續(xù)的。
1)主任務(wù)入口函數(shù)
當(dāng)前鏈表指向下一個(gè)節(jié)點(diǎn);
本文基于TI公司的DM368芯片,采用雙卡傳輸,采用多鏈路捆綁技術(shù)實(shí)現(xiàn)視頻數(shù)據(jù)的安全可靠傳輸,顯著提高了無線網(wǎng)絡(luò)傳輸帶寬[4]。文中信令協(xié)議采用SIP協(xié)議,視頻流的傳輸采用RTP/RTCP協(xié)議,該程序框架具有很好的兼容性,只需要簡(jiǎn)單的改動(dòng)就能夠組建大的視頻監(jiān)控網(wǎng)絡(luò),具有很強(qiáng)的可擴(kuò)展性,目前該系統(tǒng)已投入使用。
[1]胡棟,劉峰,朱秀昌.實(shí)時(shí)多模式無線視頻傳輸原型系統(tǒng)的實(shí)現(xiàn)[J].通信學(xué)報(bào),2006,27(10):110-116.
[2]孫天澤,袁文菊,張海峰.嵌入式設(shè)計(jì)及 Linux驅(qū)動(dòng)開發(fā)指南:基于ARM9處理器[M].北京:電子工業(yè)出版社,2005.
[3]尤盈盈.基于嵌入式系統(tǒng)的無線多媒體傳輸系統(tǒng)終端的研究[D].杭州:浙江工業(yè)大學(xué),2005:30-34.
[4]吳長(zhǎng)樹.一種基于公共移動(dòng)通信的視頻包多鏈路接收和播放方法:中國(guó),200910241583.6[P].2010-05-12.
[5]翁睿.基于GPRS網(wǎng)絡(luò)的自適應(yīng)碼率視頻傳輸[D].上海:復(fù)旦大學(xué),2008.