呂 鹍,高譽(yù)菊,張 剛
(太原理工大學(xué)信息工程學(xué)院,太原山西030024)
中間件[1]是一種獨(dú)立的系統(tǒng)軟件或服務(wù)程序,一般作用于服務(wù)端與客戶端之間,起到信息管理、傳遞等作用。而針對多媒體流的流媒體中間件可以極大地降低多媒體網(wǎng)絡(luò)通信的復(fù)雜性,很好地管理和規(guī)范數(shù)據(jù)流在系統(tǒng)網(wǎng)絡(luò)中的傳輸。但是當(dāng)今市面上針對視頻流媒體的中間件卻很難見到,大多數(shù)視頻監(jiān)控系統(tǒng)都是采取編碼服務(wù)器與客戶端直接進(jìn)行點(diǎn)對點(diǎn)連接的網(wǎng)絡(luò)通信模式,作為一種大數(shù)據(jù)流媒體,對于視頻流數(shù)據(jù)在網(wǎng)絡(luò)中進(jìn)行管理、調(diào)度、傳輸都有很高的要求,傳統(tǒng)的視頻通信原理已經(jīng)漸漸無法滿足這些需求。所以必須引入流媒體中間件技術(shù)來進(jìn)行管理。為此本設(shè)計(jì)在編碼服務(wù)器與客戶端之間加入視頻流媒體中間件來作為一個(gè)第三方軟件控制、集中管理、調(diào)配解碼客戶端對視頻數(shù)據(jù)的要求,實(shí)現(xiàn)多點(diǎn)對多點(diǎn)的通信模式,并且可以減少數(shù)據(jù)通道,最大化地利用網(wǎng)絡(luò)資源。
“點(diǎn)—點(diǎn)”數(shù)據(jù)傳輸[2]:這種傳輸模式是直接對話,客戶端直接向編碼服務(wù)端呼叫,建立連接,然后編碼服務(wù)端向客戶端傳輸數(shù)據(jù)。在“一路對一路”的數(shù)據(jù)傳輸應(yīng)用中因其實(shí)現(xiàn)較為簡單、方便,所以使用較為廣泛,但隨著市場及客戶的需求,“多路對多路”的視頻數(shù)據(jù)傳輸模式在實(shí)際應(yīng)用中顯得越來越迫切,如果繼續(xù)基于“點(diǎn)—點(diǎn)”數(shù)據(jù)傳輸模式來實(shí)現(xiàn)“多路對多路”的傳輸模式(如圖1所示),有N路客戶端要與M路編碼端建立連接通信,那么就需要N×M路通道來實(shí)現(xiàn),如果M與N很大,則N×M更大,這樣網(wǎng)絡(luò)傳輸是很占用網(wǎng)絡(luò)資源并且相當(dāng)復(fù)雜,很容易產(chǎn)生網(wǎng)絡(luò)擁塞現(xiàn)象,幾乎不可能實(shí)現(xiàn)。
圖1 “點(diǎn)—點(diǎn)”數(shù)據(jù)傳輸模式
流媒體中間件[3]:流媒體中間件在兩個(gè)獨(dú)立應(yīng)用層之間起到管理、調(diào)度、交換信息、信息傳遞等作用。本設(shè)計(jì)中,流媒體中間件用來處理視頻監(jiān)控系統(tǒng)中視頻流數(shù)據(jù)在網(wǎng)絡(luò)上的傳遞和管理,如圖2所示,N路客戶端與M路編碼端連接通信,只需M+N路通道來實(shí)現(xiàn),占用網(wǎng)絡(luò)資源較少,而且規(guī)范了網(wǎng)絡(luò)傳輸?shù)臉?biāo)準(zhǔn),克服了網(wǎng)絡(luò)擁塞現(xiàn)象,使系統(tǒng)由原始的編碼端與客戶端之間的“點(diǎn)—點(diǎn)”數(shù)據(jù)傳輸升級到了“點(diǎn)—塊—點(diǎn)”傳輸,而且避免了客戶端與編碼端的直接對話,在數(shù)據(jù)通路數(shù)量比較大的時(shí)候,可以很大限度地減輕編碼端的資源占用,優(yōu)勢更加明顯。
圖2 “點(diǎn)—塊—點(diǎn)”數(shù)據(jù)傳輸模式
本設(shè)計(jì)中間件在Linux平臺(tái)中用QT4[4]設(shè)計(jì)實(shí)現(xiàn),以SIP協(xié)議[5]作為控制協(xié)議來建立會(huì)話,利用RTP協(xié)議來傳輸視頻碼流。
視頻流中間件的工作過程與數(shù)據(jù)的傳輸過程是相反的,如圖3所示,中間件在網(wǎng)絡(luò)上進(jìn)行SIP注冊以后,首先等待客戶端對中間件進(jìn)行呼叫,呼叫信息中包含了客戶端用戶名、用戶權(quán)限等級、用戶IP地址、申請的通道端口、想要呼叫哪路攝像頭的視頻信息等。中間件將這些信息進(jìn)行鑒別以后,根據(jù)客戶端不同用戶的權(quán)限,向相應(yīng)的編碼攝像頭發(fā)送呼叫,通過這些呼叫與對應(yīng)的編碼端建立SIP會(huì)話通道,然后通過RTP協(xié)議建立RTP數(shù)據(jù)傳輸通道,接收壓縮編碼的數(shù)據(jù),中間件首先將這些數(shù)據(jù)存入一定大小的緩沖區(qū),再給與對中間件發(fā)起呼叫的客戶端回應(yīng),并且與其建立會(huì)話通道,將剛收到的緩沖區(qū)內(nèi)數(shù)據(jù)傳送給客戶端進(jìn)行處理。
圖3 流媒體中間件工作原理圖
本設(shè)計(jì)的流媒體中間件是專門針對于連接編碼端與客戶端之間視頻流數(shù)據(jù)的中間件。作為視頻監(jiān)控系統(tǒng)的一部分,中間件啟動(dòng)后首先要在主線程中完成網(wǎng)上代理注冊,即向SIP注冊服務(wù)器登記自己的代理用戶名、IP地址、端口信息等。注冊完成后,可以從注冊服務(wù)器查看到中間件的一些信息,如圖4所示。
當(dāng)客戶端想要獲取某路視頻信息的時(shí)候,向中間件發(fā)送呼叫請求,中間件接收到呼叫請求后,會(huì)對請求所攜帶的信息進(jìn)行鑒別,這時(shí)候分兩種情況來做出處理。
第一種情況:若客戶端請求的這一路攝像頭編碼視頻信息之前沒有被其他的客戶端申請呼叫過,則中間件會(huì)先對這一路編碼攝像頭發(fā)出新的呼叫。當(dāng)中間件對編碼攝像頭的呼叫被編碼端響應(yīng)后,視頻流數(shù)據(jù)會(huì)沿著中間件與編碼攝像頭的會(huì)話通道傳送給中間件。中間件得到數(shù)據(jù)后,再給之前呼叫的客戶端發(fā)送響應(yīng)信息,從而再與客戶端建立會(huì)話通路,最后將視頻數(shù)據(jù)傳送給客戶端。
第二種情況:客戶端請求視頻信息的編碼攝像頭之前已經(jīng)被其他客戶端呼叫過,也就是說已經(jīng)出現(xiàn)過第一種情況。這時(shí)中間件已經(jīng)開始從相應(yīng)的這一路攝像頭編碼端接收這一路編碼后的視頻數(shù)據(jù)。中間件就不再向那一路編碼端發(fā)送請求,而是開辟一條新的線程,然后直接響應(yīng)呼叫的客戶端,在新的線程中將數(shù)據(jù)傳輸過去。
中間件處理客戶端的視頻數(shù)據(jù)請求呼叫的流程如圖5所示。在整體的工作流程實(shí)現(xiàn)之后,對中間件進(jìn)行了界面的設(shè)計(jì),管理者可以直接通過界面進(jìn)行操作實(shí)現(xiàn)相關(guān)功能。界面可以直接體現(xiàn)出當(dāng)時(shí)系統(tǒng)中訪問的客戶端的數(shù)量、IP地址、客戶端用戶名等,管理者也可以直接對其進(jìn)行操作,例如斷開某一客戶的鏈接等??蛻舳说男畔⑼ㄟ^中間件與客戶端的“交流”使中間件獲得,并且通過程序直接體現(xiàn)在界面中。
圖5 中間件處理客戶端呼叫流程
中間件的實(shí)現(xiàn)從最頂層、面向用戶的界面開始。在QT[6]中建立一個(gè)新的QT Gui應(yīng)用工程,這個(gè)工程里包含了4種不同的類別,分別是頭文件、源文件、界面文件、資源文件。其中頭文件和源文件用來存放要實(shí)現(xiàn)功能的具體程序,界面文件可以直接讓用戶通過對控件的選擇來完成對界面的基本設(shè)計(jì),然后通過對控件完成信號槽的鏈接,通過對控件的觸發(fā)運(yùn)行某些程序。資源文件是存放一些對界面進(jìn)行美化的圖、Logo等。
如圖6所示,本文設(shè)計(jì)的中間件界面有2個(gè)按鈕可供用戶進(jìn)行點(diǎn)擊。這2個(gè)按鈕分別是注冊和退出,起到的功能也是注冊功能和退出功能。當(dāng)程序運(yùn)行時(shí),單擊界面的這2個(gè)按鈕,則會(huì)直接運(yùn)行這2個(gè)函數(shù)中的程序,完成注冊和退出的功能。這就是QT中的信號槽體制,也就是通過對界面控件的觸發(fā)而運(yùn)行相應(yīng)的程序。圖6中其他控件不可以通過用戶點(diǎn)擊直接運(yùn)行,則需要信號槽的另一種用法來進(jìn)行管理。例如“攝像頭連接狀態(tài)”這一控件要實(shí)現(xiàn)的功能是可以直接體現(xiàn)當(dāng)前這一路攝像頭是否有數(shù)據(jù)傳到中間件,當(dāng)有數(shù)據(jù)的時(shí)候,顯示為成功,可是這里無法點(diǎn)擊,要完成顯示狀態(tài)的改變,本文設(shè)計(jì)了利用定時(shí)器來進(jìn)行定時(shí)刷新的方法。
圖6 管理4路攝像頭的中間件界面(截圖)
定時(shí)器的設(shè)計(jì)有許多種,包括利用系統(tǒng)自帶庫,C語言庫等。本文選用QT自帶的定時(shí)器,運(yùn)用這種定時(shí)器要在serve2send.cpp中包含頭文件QTime.h。QTime的具體用法是:
程序的含義是指每隔指定的時(shí)間運(yùn)行一次連接的函數(shù)。本文將間隔時(shí)間設(shè)定為1 s。通過定時(shí)器,每1 s運(yùn)行一次status()函數(shù)。status()函數(shù)的功能是得到客戶端的IP地址,呼叫本路攝像頭視頻信息的客戶端數(shù),以及中間件是否與攝像頭編碼端有數(shù)據(jù)傳遞。然后將這些信息在中間件的界面中顯示出來。通過每秒監(jiān)測,可以不停地刷新中間件當(dāng)前的狀態(tài),并且顯示給管理員進(jìn)行管理操作。
在之前的原理分析和設(shè)計(jì)方案中已經(jīng)確定了中間件的數(shù)據(jù)轉(zhuǎn)發(fā)機(jī)制的實(shí)現(xiàn)方案:當(dāng)某一路攝像頭編碼視頻信息在中間件中第一次被某客戶端呼叫的時(shí)候,中間件才會(huì)向該攝像頭進(jìn)行呼叫請求來獲取這一路編碼后的視頻信息,然后再傳遞給客戶端。具體的實(shí)現(xiàn)方法是利用SIP協(xié)議來進(jìn)行信令控制,然后利用RTP協(xié)議進(jìn)行傳輸數(shù)據(jù)。
流媒體中間件是介于編碼服務(wù)器和多畫面[7]客戶端之間工作的,因此中間件的測試需要加入到整個(gè)視頻系統(tǒng)中,測試采用4路攝像頭進(jìn)行實(shí)時(shí)采集,然后在4個(gè)達(dá)芬奇平臺(tái)進(jìn)行D1分辨力的實(shí)時(shí)編碼,與流媒體中間建立連接,多畫面客戶端分別呼叫該4路進(jìn)行視頻數(shù)據(jù)請求。最后結(jié)果流媒體中間件工作界面如圖7所示,表明4路通道均通過流媒體中間件與編碼端連接成功;多畫面客戶端同步實(shí)時(shí)顯示4路攝像頭采集畫面(如圖8所示),視頻畫面質(zhì)量和實(shí)時(shí)性較好。
圖7 流媒體中間件工作界面(截圖)
圖8 多畫面客戶端實(shí)時(shí)顯示(截圖)
本設(shè)計(jì)完全實(shí)現(xiàn)了流媒體中間件在視頻系統(tǒng)中的集中管理、數(shù)據(jù)調(diào)度、數(shù)據(jù)傳輸和轉(zhuǎn)發(fā)等功能,使系統(tǒng)由原始的編碼服務(wù)器端與客戶端之間的“點(diǎn)—點(diǎn)”數(shù)據(jù)傳輸升級到了“點(diǎn)—塊—點(diǎn)”傳輸,有效地降低了復(fù)雜視頻通信對網(wǎng)絡(luò)帶寬的需求,很大限度地減輕服務(wù)器的資源占用,優(yōu)勢明顯,真正滿足了用戶在任何地點(diǎn)、任何時(shí)間隨意觀看多路網(wǎng)絡(luò)視頻信息的需求,為網(wǎng)絡(luò)視頻通信的發(fā)展起到了一定推動(dòng)作用,實(shí)用價(jià)值很高。
[1]谷和啟.中間件主流技術(shù)及其未來發(fā)展精解[EB/OL].[2013-06-02].http://articles.e-works.net.cn/soa/article28721.htm.
[2]溫仁鳳,馮俊杰,陳金坤.點(diǎn)對點(diǎn)通信軟件設(shè)計(jì)[J].智能計(jì)算機(jī)與應(yīng)用,2013(1):13-16.
[3]肖丹,祝家鈺.基于CORBA的自適應(yīng)流媒體中間件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)與信息技術(shù),2007(8):8-10.
[4]劉艷青,蘇桂蓮.基于Qt4的圖形用戶界面程序的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2009,3(3):170-172.
[5]萬曉榆,張溢華,樊自甫.基于SIP的視頻會(huì)議系統(tǒng)視頻模塊的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2009,33(8):99-102.
[6]于邦偉,鄧華秋.基于Qt/Embedded的嵌入式數(shù)字監(jiān)控系統(tǒng)控制界面的實(shí)現(xiàn)[J].電視技術(shù),2011,35(24):25-28.
[7]胡健生,張倩,蔡艷軍.基于ARM11+FPGA的多路視頻監(jiān)控系統(tǒng)關(guān)鍵技術(shù)研究[J].電視技術(shù),2011,35(21):120-123.