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