摘 要: 設(shè)計(jì)并實(shí)現(xiàn)了基于嵌入式Linux和TSM320DM365處理器平臺(tái)的實(shí)時(shí)視頻監(jiān)控系統(tǒng)終端,。首先介紹了視頻監(jiān)控系統(tǒng)的總體框架,,從可擴(kuò)展性以及實(shí)用性上設(shè)計(jì)了嵌入式終端軟件的總體框架;接著闡述了終端軟件上音視頻采集發(fā)送模塊的設(shè)計(jì)與實(shí)現(xiàn)方案,;最后對(duì)該嵌入式終端進(jìn)行測試,,驗(yàn)證其實(shí)際效果。
關(guān)鍵詞: 嵌入式,;H.264;G711,;DM365,;RTP
0 引言
隨著嵌入式技術(shù),、圖像處理技術(shù)、網(wǎng)絡(luò)通信技術(shù)的不斷發(fā)展以及人們的安防意識(shí)日益提高,,通過實(shí)時(shí)視頻傳輸系統(tǒng)對(duì)現(xiàn)場監(jiān)控的應(yīng)用越來越廣泛,。基于ARM的視頻監(jiān)控系統(tǒng)因其體積小,、功能強(qiáng),、功耗低、性價(jià)比高等特點(diǎn),,被廣泛地應(yīng)用在交通道路,、學(xué)校、小區(qū),、機(jī)場等場所,。因此,對(duì)基于嵌入式的網(wǎng)絡(luò)監(jiān)控系統(tǒng)終端的研究具有很重要的社會(huì)和實(shí)際應(yīng)用價(jià)值[1],。本文根據(jù)實(shí)際需求,,設(shè)計(jì)并實(shí)現(xiàn)了基于DM365的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)終端,它是網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)中的音視頻獲取源,,集成了音視頻采集編碼,、語音解碼播放、實(shí)時(shí)傳輸和信令控制等功能,。本文主要闡述了終端系統(tǒng)軟件框架的設(shè)計(jì)與主要功能模塊的實(shí)現(xiàn),。
1 系統(tǒng)結(jié)構(gòu)介紹
整個(gè)視頻監(jiān)控系統(tǒng)[2]由三部分組成:嵌入式終端、服務(wù)器平臺(tái)和客戶端,。系統(tǒng)結(jié)構(gòu)框架如圖1所示,。
嵌入式終端負(fù)責(zé)采集音視頻數(shù)據(jù),對(duì)音視頻數(shù)據(jù)進(jìn)行壓縮編碼,,并將編碼壓縮數(shù)據(jù)通過3G/WLAN網(wǎng)發(fā)送至流媒體服務(wù)器,。服務(wù)器平臺(tái)由流媒體服務(wù)器、SIP信令服務(wù)器和FTP服務(wù)器三部分組成,。流媒體服務(wù)器負(fù)責(zé)轉(zhuǎn)發(fā)音視頻流,,SIP信令服務(wù)器負(fù)責(zé)終端與平臺(tái)、終端與客戶端之間的信息交互,,F(xiàn)TP服務(wù)器負(fù)責(zé)圖像文件信息的存儲(chǔ)備份,。客戶端主要實(shí)現(xiàn)實(shí)時(shí)監(jiān)控和終端控制功能,,通過客戶端可對(duì)終端設(shè)備進(jìn)行實(shí)時(shí)的視頻碼率幀率控制,。整個(gè)系統(tǒng)為嵌入式視頻監(jiān)控提供了良好的解決方案,能夠廣泛地應(yīng)用在視頻監(jiān)控領(lǐng)域中,。
2 嵌入式終端軟件框架設(shè)計(jì)
嵌入式終端軟件開發(fā)基于MontaVista Linux嵌入式操作系統(tǒng),,它基于Linux內(nèi)核,,具有高效、實(shí)時(shí),、穩(wěn)定,、內(nèi)核可裁剪等特點(diǎn)[3]。同時(shí)利用Linux系統(tǒng)提供的進(jìn)程間通信機(jī)制可方便地實(shí)現(xiàn)各功能模塊之間的數(shù)據(jù)通信,。嵌入式終端軟件平臺(tái)包括視頻采集編碼模塊,、音頻采集編碼解碼模塊、RTP模塊,、信令控制模塊以及其他的功能模塊等,。終端軟件總體框架如圖2所示。
SIP信令模塊負(fù)責(zé)與服務(wù)器平臺(tái)的信令交互,。信令模塊將應(yīng)用管理模塊的信息進(jìn)行SIP信令封裝并發(fā)送至SIP服務(wù)器,;同時(shí)解析接收的SIP信令,將控制信息通過本地socket發(fā)送至應(yīng)用管理模塊進(jìn)行調(diào)度,。
應(yīng)用管理模塊負(fù)責(zé)調(diào)度各個(gè)功能模塊,。管理模塊收集各個(gè)功能模塊的交互信息,將交互信息進(jìn)行封裝,,發(fā)送至SIP信令控制模塊,,從而實(shí)現(xiàn)與服務(wù)器平臺(tái)的信令交互;與此同時(shí),,管理模塊還將接收到的控制信息進(jìn)行解析,,根據(jù)控制信息調(diào)度相應(yīng)的功能模塊。在各功能模塊中,,RTP模塊為主要模塊,,負(fù)責(zé)音視頻數(shù)據(jù)的RTP封包、發(fā)送,。
音視頻采集模塊負(fù)責(zé)實(shí)時(shí)的音視頻數(shù)據(jù)采集,。該模塊采集音視頻數(shù)據(jù),并對(duì)其進(jìn)行編碼,,通過Linux共享內(nèi)存機(jī)制實(shí)現(xiàn)與RTP模塊的數(shù)據(jù)交互,。
該軟件框架中各功能模塊單獨(dú)實(shí)現(xiàn),互不影響,,可根據(jù)具體需求方便地添加和刪除功能模塊,,同時(shí)各個(gè)模塊均由應(yīng)用管理模塊進(jìn)行調(diào)度統(tǒng)籌,便于管理,。
3 音視頻功能模塊的設(shè)計(jì)與實(shí)現(xiàn)
嵌入式設(shè)備作為視頻監(jiān)控系統(tǒng)的終端,,需要完成語音與視頻的數(shù)據(jù)采集和發(fā)送,一次成功的視頻監(jiān)控請(qǐng)求應(yīng)當(dāng)包含控制信息接收解析、數(shù)據(jù)流的發(fā)送和接收等,。嵌入式終端音視頻功能模塊主要包括音視頻采集編碼模塊,、RTP模塊,模塊間通過Linux進(jìn)程間通信機(jī)制實(shí)現(xiàn)數(shù)據(jù)與控制信息的交互,。
圖3所示為一次音視頻請(qǐng)求后音視頻相關(guān)模塊的處理流程??蛻舳税l(fā)起視頻請(qǐng)求后,,SIP信令模塊將接收到服務(wù)器轉(zhuǎn)發(fā)的視頻請(qǐng)求信令,SIP信令在經(jīng)過信令模塊的解析之后,,其攜帶的控制消息將到達(dá)應(yīng)用管理模塊,;管理模塊解析音視頻請(qǐng)求控制消息,通知RTP模塊,;RTP模塊開啟兩個(gè)線程用于處理音視頻數(shù)據(jù),,發(fā)送線程負(fù)責(zé)從共享內(nèi)存讀取音視頻數(shù)據(jù)并進(jìn)行RTP打包發(fā)送,接收線程接收流媒體服務(wù)器轉(zhuǎn)發(fā)的語音數(shù)據(jù)包并進(jìn)行解碼播放,。
本文選用TI公司采用達(dá)芬奇技術(shù)的數(shù)字媒體處理器TMS320DM365作為主芯片,。為了方便音視頻采集編碼的應(yīng)用程序開發(fā),TI針對(duì)達(dá)芬奇平臺(tái)提供了達(dá)芬奇多媒體應(yīng)用程序接口(Davinci Multimedia Application Interface,,DMAI),,DMAI封裝了底層的驅(qū)動(dòng),并且提供了易于程序開發(fā)的編程接口[4],。這使得應(yīng)用程序不再關(guān)心底層硬件對(duì)于某個(gè)操作的具體實(shí)現(xiàn),,大大簡化了應(yīng)用程序的開發(fā)。本文音視頻采集編碼模塊的大部分就是調(diào)用DMAI接口實(shí)現(xiàn)的,。
3.1 視頻采集編碼模塊實(shí)現(xiàn)
嵌入式終端接收到視頻請(qǐng)求信令之后,,視頻采集編碼模塊進(jìn)行視頻數(shù)據(jù)的采集,將采集的視頻數(shù)據(jù)進(jìn)行H.264編碼,,寫入共享內(nèi)存,,供RTP模塊讀取。視頻采集模塊采用多線程工作機(jī)制[5],,主線程負(fù)責(zé)整個(gè)流程控制,,視頻采集編碼的具體實(shí)現(xiàn)在Capture線程、Video線程和Write線程中完成,,三個(gè)線程通過管道進(jìn)行線程間通信,。
Capture線程負(fù)責(zé)采集原始視頻數(shù)據(jù),關(guān)鍵代碼如下:
hCapture=Capture_create(hBufTab,,&cAttrs)
//創(chuàng)建一個(gè)視頻采集設(shè)備實(shí)例
Capture_get(hCapture,,&hCapBuf)
//從視頻采集設(shè)備獲取采集到的一幀原始數(shù)據(jù)
Fifo_put(envp->hOutFifo,hBuf)//將存有原始數(shù)據(jù)的
//緩沖指針寫入hOutFifo管道中,供video線程讀取
Fifo_get(envp->hInFifo,,&hDstBuf)
//從hInFifo管道讀取由Video線程寫回的緩存指針
Capture(hCapture,,hCapBuf)//告知hCapture,Capture
//線程已經(jīng)完成一次操作,,等待hCapture句柄再次捕獲
//一幀原始數(shù)據(jù)
Video線程負(fù)責(zé)對(duì)采集的原始視頻數(shù)據(jù)進(jìn)行H.264編碼,,關(guān)鍵代碼如下:
hVe1=Venc1_create(hEngine,envp->videoEncoder,,params,,dynParams)//創(chuàng)建H.264視頻編碼器
Fifo_get(envp->hCaptureOutFifo,&hCapBuf)
//從管道讀取存有原始數(shù)據(jù)的緩沖指針
Fifo_get(envp->hWriterOutFifo,,&hDstBuf)
//從管道讀取Write線程寫入的緩沖指針
Venc1_process(hVe1,,hCapture,hDstBuf)
//將一幀原始視頻數(shù)據(jù)進(jìn)行H.264編碼
Fifo_put(envp->hWriterInFifo,,hDstBuf)
//將編碼數(shù)據(jù)緩沖指針寫入管道,,供write線程讀取
Fifo_put(envp->hCaptureInFifo,hCapBuf)
//將緩沖指針寫回管道,,供capture線程使用
Write線程負(fù)責(zé)將編碼的視頻數(shù)據(jù)寫入共享內(nèi)存,,由RTP模塊讀取打包發(fā)送。關(guān)鍵代碼如下:
shm_pn=createShm(SHM_DIR,,SHARE_SIZE)
//創(chuàng)建共享內(nèi)存
Fifo_get(envp->hInFifo,,&hOutBuf)
//從管道讀取一幀編碼的視頻數(shù)據(jù)
wirteShm(shm_pn,Buffer_getUserPtr(hOutBuf),,Buffer_getNumBytesUsed(hOutBuf))//將編碼數(shù)據(jù)寫入共享內(nèi)存
Fifo_put(envp->hOutBuf,,hOutBuf)//將緩沖指針寫回管道
3.2 音頻采集解碼編碼模塊實(shí)現(xiàn)
音頻處理模塊由采集編碼和解碼播放兩部分組成,通過與上層RTP模塊的交互實(shí)現(xiàn)雙向語音功能,。在接收到視頻請(qǐng)求信令之后,,音頻處理模塊創(chuàng)建兩個(gè)線程用于處理語音數(shù)據(jù),Speech線程負(fù)責(zé)語音數(shù)據(jù)的采集,、G711編碼,,SpeechDec線程負(fù)責(zé)對(duì)G711數(shù)據(jù)進(jìn)行解碼、播放,。兩功能模塊獨(dú)立工作,,互不影響。
Speech線程主要代碼如下:
Shm_audio=createShm(AUDIO_SHM_DIR,,AUDIO_SHARE _SIZE)//創(chuàng)建共享內(nèi)存
hSe1=Senc1_create(hEngine,,envp->speechEncoder,params,,dynParams)//創(chuàng)建g711編碼器
hSound=Sound_create(&sAttrs)
//創(chuàng)建一個(gè)音頻捕捉設(shè)備實(shí)例
Sound_read(hSound,,hInbuf)//讀取音頻數(shù)據(jù)到緩沖區(qū)
Senc1_process(hInbuf,hOutBuf)
//將PCM音頻數(shù)據(jù)進(jìn)行G711編碼
writeShm(shm_audio,Buffer_getUserPtr(hOutBuf),,Buffer_
getNumBytesUsed(hOutBuf)//將音頻數(shù)據(jù)寫入共享內(nèi)存
SpeechDec線程實(shí)現(xiàn)過程與Speech線程類似,,這里不再贅述。
3.3 RTP模塊設(shè)計(jì)與實(shí)現(xiàn)
RTP模塊實(shí)現(xiàn)RTP數(shù)據(jù)包的發(fā)送和接收功能,,通過與信令控制模塊的信息交互來完成發(fā)送,、接收線程的創(chuàng)建與結(jié)束。發(fā)送線程從共享內(nèi)存讀取H.264數(shù)據(jù)和G711數(shù)據(jù),,并將編碼音視頻數(shù)據(jù)進(jìn)行RTP打包發(fā)送,。
音頻接收線程在接收到RTP數(shù)據(jù)后,由于網(wǎng)絡(luò)傳輸導(dǎo)致數(shù)據(jù)包到達(dá)的順序具有不確定性,,因此需要對(duì)語音數(shù)據(jù)進(jìn)行緩存排序。首先將G711語音數(shù)據(jù)包放入緩沖隊(duì)列中,,通過RTP包的序號(hào)進(jìn)行優(yōu)先級(jí)排序,。然后取緩沖隊(duì)列音頻數(shù)據(jù),寫入共享內(nèi)存,,供音頻解碼播放模塊讀取播放,。合適的緩沖區(qū)大小設(shè)置尤為重要,緩沖隊(duì)列設(shè)置過小會(huì)導(dǎo)致語音包亂序,,語音質(zhì)量較差,;緩沖隊(duì)列設(shè)置過大,語音延時(shí)較大,,用戶體驗(yàn)差,。需要根據(jù)實(shí)際網(wǎng)絡(luò)狀況和用戶需求設(shè)置緩沖隊(duì)列大小。
4 視頻監(jiān)控測試
嵌入式設(shè)備,、PC客戶端通過3G/WLAN網(wǎng)向服務(wù)器平臺(tái)注冊(cè)登錄,,進(jìn)行視頻監(jiān)控功能測試??蛻舳税l(fā)起視頻請(qǐng)求并成功之后,,可以觀看終端設(shè)備采集的視頻,并在開啟音頻請(qǐng)求之后實(shí)現(xiàn)與采集設(shè)備終端的雙向語音通信,。測試結(jié)果表明,,視頻畫面清晰流暢,可進(jìn)行雙向語音通信,,語音質(zhì)量較好,。視頻監(jiān)控效果如圖4所示。
5 結(jié)論
本文介紹了一種嵌入式視頻監(jiān)控系統(tǒng)終端軟件的設(shè)計(jì)與實(shí)現(xiàn)方案,,并且通過實(shí)際的傳輸測試實(shí)現(xiàn)了音視頻數(shù)據(jù)的流暢傳輸和播放,。整個(gè)終端系統(tǒng)具有通用、安裝方便、穩(wěn)定,、可靠和成本低等優(yōu)點(diǎn),,適用于視頻監(jiān)控系統(tǒng)領(lǐng)域,具有很好的應(yīng)用前景,。
參考文獻(xiàn)
[1] 張?jiān)疲曨l監(jiān)控系統(tǒng)的發(fā)展趨勢[J].中國科技博覽,,2011(11):32-35.
[2] 劉繼超.基于DM355的嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)設(shè)計(jì)[D].青島:青島科技大學(xué),2009.
[3] 宋經(jīng)瑋.嵌入式網(wǎng)絡(luò)視頻監(jiān)控設(shè)備的驅(qū)動(dòng)設(shè)計(jì)與開發(fā)[D].杭州:浙江工業(yè)大學(xué),,2013.
[4] 宋建勛,,劉峰.基于TMS320DM365多平臺(tái)實(shí)時(shí)視頻傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電視技術(shù),2011,,35(7):32-35,,40.
[5] 馮國進(jìn).嵌入式Linux驅(qū)動(dòng)程序設(shè)計(jì)從入門到精通[M].北京:清華大學(xué)出版社,2008.