Cortex-A8和H.264的無線視頻監(jiān)控系統(tǒng)設(shè)計(jì)
引言
本文引用地址:http://m.butianyuan.cn/article/201610/307931.htm隨著現(xiàn)代科學(xué)技術(shù)和居民生活水平的提高,以及人們對(duì)安全問題的日益重視,視頻監(jiān)控系統(tǒng)在緊急救援和安防系統(tǒng)中得到了廣泛應(yīng)用。無線技術(shù)的發(fā)展解決了傳統(tǒng)有線的布線復(fù)雜,網(wǎng)絡(luò)結(jié)構(gòu)不靈活等技術(shù)問題。無線技術(shù)對(duì)于特殊監(jiān)控環(huán)境有著很好的親和性,且移動(dòng)通信網(wǎng)和無線局域網(wǎng)的快速建設(shè)為視頻監(jiān)控系統(tǒng)的設(shè)計(jì)提供了技術(shù)支持,其中無線局域網(wǎng)WLAN的組建快捷、靈活性強(qiáng)、受環(huán)境限制小、方便網(wǎng)絡(luò)重組和擴(kuò)展。
國(guó)際電信聯(lián)盟對(duì)于視頻編碼壓縮制定了H.264/AVC視頻編碼壓縮標(biāo)準(zhǔn),H.264加強(qiáng)了對(duì)IP、移動(dòng)網(wǎng)絡(luò)的丟包、誤碼情況處理,保證了在不同信道中進(jìn)行傳輸?shù)囊曨l圖像質(zhì)量。隨著H.264編碼技術(shù)的提出與應(yīng)用,大大提高了視頻數(shù)據(jù)的壓縮率,減少傳輸時(shí)所用的網(wǎng)絡(luò)帶寬,并促進(jìn)了無線網(wǎng)絡(luò)的發(fā)展,同時(shí)H.264編碼的網(wǎng)絡(luò)傳輸提取層設(shè)計(jì),可以使視頻數(shù)據(jù)在不同網(wǎng)絡(luò)里進(jìn)行傳輸且適應(yīng)性良好。
嵌入式芯片功能的增強(qiáng)和開源Linux操作系統(tǒng)的成熟使得基于嵌入式系統(tǒng)的視頻監(jiān)控系統(tǒng)具有更好的穩(wěn)定性和實(shí)時(shí)性,結(jié)合無線網(wǎng)絡(luò)技術(shù)使系統(tǒng)具有成本低、組網(wǎng)便捷和實(shí)際應(yīng)用性強(qiáng)等優(yōu)點(diǎn),可以廣泛地應(yīng)用于民用與工用安防系統(tǒng)。
本文將WiFi技術(shù)、圖像壓縮技術(shù)與基于嵌入式視頻監(jiān)控系統(tǒng)相結(jié)合,采用嵌入式ARM Cortex—A8高性能處理器芯片SP5V210和Linux操作系統(tǒng),將COMS攝像頭采集的視頻流經(jīng)H.264編碼壓縮后由無線WiFi網(wǎng)絡(luò)傳輸?shù)奖O(jiān)控端,通過PC監(jiān)控端的FFMPEG模塊和SDL播放模塊完成監(jiān)控視頻數(shù)據(jù)的實(shí)時(shí)顯示。
1 視頻監(jiān)控系統(tǒng)框圖設(shè)計(jì)
系統(tǒng)采用ARM Cortex—A8內(nèi)核的SP5V210芯片作為視頻采集端的中央處理器,該處理器運(yùn)行穩(wěn)定時(shí)主頻可達(dá)1 GHz,具有MMU功能、64位內(nèi)部總線架構(gòu)、可擴(kuò)展的DRAM內(nèi)存接口、1 G的NAND Flash和DDR2、3通道I2C總線接口、4個(gè)USB接口、4路HS-MMC/SD/SDIO/接口等。同時(shí)其內(nèi)部集成MFC視頻編解碼器,支持多格式編解碼包含MPEG-4/H.264編碼,且Cortex-A8處理器應(yīng)用NEON信號(hào)處理擴(kuò)展指令集提高了H.264和MP3等媒體編碼效率。工作流程為:首先OV3640攝像頭采集圖像信息并通過I2C總線與SP5V210處理器通信,處理器通過內(nèi)部集成的MFC多格式編碼器將圖像信息進(jìn)行H.264編碼壓縮,視頻圖像再基于USB無線網(wǎng)卡構(gòu)建的WLAN網(wǎng)絡(luò)和實(shí)時(shí)傳輸協(xié)議RTP發(fā)送給視頻監(jiān)控PC客戶端,由客戶端進(jìn)行解碼和顯示。系統(tǒng)的軟件結(jié)構(gòu)包含應(yīng)用層程序、設(shè)備驅(qū)動(dòng)程序和嵌入式Linux操作系統(tǒng)。系統(tǒng)工作時(shí)會(huì)先執(zhí)行Bootloader引導(dǎo)加載程序進(jìn)行硬件設(shè)備初始化并引導(dǎo)加載Linux 2.6.35內(nèi)核,再加載設(shè)備驅(qū)動(dòng)程序(包括攝像頭驅(qū)動(dòng)、WiFi驅(qū)動(dòng)、Nand Flash驅(qū)動(dòng)等),最后為用戶區(qū)應(yīng)用層程序的執(zhí)行,其中包含視頻采集模塊、H.264編解碼模塊、WiFi無線傳輸模塊和RTP實(shí)時(shí)傳輸協(xié)議模塊。系統(tǒng)整體框圖如圖1所示。
2 視頻采集端和無線傳輸設(shè)計(jì)
2.1 視頻數(shù)據(jù)采集
在視頻采集端,原始視頻數(shù)據(jù)的采集是通過OV3640圖像傳感器模塊完成,該攝像頭支持300萬像素并支持輸出YUV420圖像數(shù)據(jù),SP5V210處理器通過I2C總線訪問與修改OV3640內(nèi)部寄存器來控制攝像頭功能。
在Linux操作系統(tǒng)中,通過應(yīng)用Video4Linux(V4L)來實(shí)現(xiàn)視頻采集設(shè)備的各種功能。在Linux內(nèi)核中定義了視頻設(shè)備的統(tǒng)一接口V4L,由統(tǒng)一的API接口庫(kù)函數(shù)控制視頻設(shè)備各種功能。其中,V4L2是V4L的升級(jí)版,具有更好的兼容性和擴(kuò)展性。V4L2采集視頻信息的流程為:通過ope nVideo()函數(shù)先打開視頻采集設(shè)備文件;初始化設(shè)備信息包括獲得視頻設(shè)備支持的功能屬性和設(shè)置其采集視頻格式;向內(nèi)核申請(qǐng)幀緩存內(nèi)存空間,并將其映射到用戶空間,開始發(fā)送采集信號(hào);讀取視頻緩存幀數(shù)據(jù),可以根據(jù)需求進(jìn)行數(shù)據(jù)的處理;發(fā)送采集停止信號(hào),釋放內(nèi)存映射,關(guān)閉視頻設(shè)備。數(shù)據(jù)采集流程如圖2所示。
2.2 H.264編碼壓縮
視頻圖像畫面用4:2:0格式存儲(chǔ),每幀的數(shù)據(jù)大小為1.2 Mb,對(duì)于25~30 fps的實(shí)時(shí)硬件編碼,其碼流將達(dá)到了30~36 Mbps,無線網(wǎng)絡(luò)帶寬和存儲(chǔ)空間難以承受,需采用H.264壓縮編碼技術(shù)將大數(shù)據(jù)量的視頻數(shù)據(jù)進(jìn)行壓縮。SP5V210內(nèi)部集成了多格式的視頻編解碼器(MFC),支持H.264的硬件編解碼且速度最高可達(dá)到30 fps,可以很好地滿足系統(tǒng)對(duì)視頻數(shù)據(jù)壓縮和處理速度的要求。采用MFC硬件編解碼模塊完成視頻數(shù)據(jù)編解碼的程序時(shí),既可以調(diào)用MFC編解碼中的API庫(kù)函數(shù),又可以采用MFC中的I/O接口函數(shù),MFC編解碼中的底層驅(qū)動(dòng)接口封裝實(shí)際上就是API庫(kù)函數(shù)。SP5V210的MFC編解碼軟件架構(gòu)如圖3所示。
通過硬件編解碼模塊MFC的API接口函數(shù)實(shí)現(xiàn)H.264視頻編碼壓縮,具體的流程為:
①建立H.264編碼器實(shí)例,設(shè)置MFC編碼器的參數(shù)并對(duì)其進(jìn)行初始化設(shè)置。
②獲取編碼器的輸入緩沖區(qū)地址,讀取視頻數(shù)據(jù),發(fā)送到編碼器的輸入緩沖空間。
③進(jìn)行H.264壓縮編碼,獲取編碼后的輸出緩沖區(qū),并對(duì)編碼數(shù)據(jù)進(jìn)行相應(yīng)處理。
④判斷編碼是否結(jié)束,結(jié)束則釋放編碼器的資源,編碼器關(guān)閉,否則進(jìn)入第2步循環(huán)運(yùn)行。
2.3 視頻數(shù)據(jù)無線傳輸
系統(tǒng)的傳輸網(wǎng)絡(luò)是通過USB無線網(wǎng)卡構(gòu)建無線局域網(wǎng)的方式完成,利用無線的信道來傳輸編碼后的視頻數(shù)據(jù),WiFi(Wireless Fidelity)通信網(wǎng)絡(luò)標(biāo)準(zhǔn)分別支持IEEE802.11g、IEEE 802.11b和IEEE 802.11a協(xié)議,具有傳輸速率高(11~54 MDps)、安裝便捷和受環(huán)境限制小等優(yōu)點(diǎn)。
USB無線網(wǎng)卡通過USB接口與SP5V210通信,需要完成USB設(shè)備、無線網(wǎng)卡設(shè)備的驅(qū)動(dòng)和移植,無線網(wǎng)卡設(shè)備驅(qū)動(dòng)為應(yīng)用層提供協(xié)議棧接口,在下層通過USB總線訪問無線網(wǎng)卡設(shè)備寄存器。無線網(wǎng)卡在Linux操作系統(tǒng)上的移植,先要下載對(duì)應(yīng)驅(qū)動(dòng)工具包并將其復(fù)制到根目錄下完成驅(qū)動(dòng),通過串口工具輸入Scan-wifi進(jìn)行搜索無線網(wǎng)絡(luò)信號(hào),再通過start-wifi命令打開無線網(wǎng)絡(luò)并建立連接。
無線網(wǎng)絡(luò)傳輸視頻數(shù)據(jù)時(shí),必須要遵循約定的網(wǎng)絡(luò)傳輸協(xié)議。一般常用的網(wǎng)絡(luò)傳輸協(xié)議有RTP/RTCP、TCP/IP和UDP,本系統(tǒng)中視頻數(shù)據(jù)的傳輸是基于RTP/RTCP實(shí)時(shí)傳輸協(xié)議的,RTP/RTCP協(xié)議實(shí)現(xiàn)的開源庫(kù)有JRTPLIB、LIBRTP、ORTP等,本文采用基于C++的開源庫(kù)JRTPLIB,支持Linux和Windows操作系統(tǒng)平臺(tái),且操作便捷,封裝性好。為了實(shí)現(xiàn)基于RTP/RTCP實(shí)時(shí)傳輸協(xié)議的視頻數(shù)據(jù)傳輸,先要完成JRTPLIB的交叉編譯和到Linux系統(tǒng)平臺(tái)移植等工作。
采用JRTPLIB開源庫(kù)中的接口函數(shù)完成無線視頻數(shù)據(jù)傳輸?shù)木唧w流程如下:
①初始化并生成RTP會(huì)話。采用JRTPLIB開源庫(kù)傳輸視頻數(shù)據(jù)前,要先創(chuàng)建一個(gè)RTPSession實(shí)例用來代表RPT會(huì)話,并利用RTPSession Par ams對(duì)象設(shè)置時(shí)間戳的單位,再調(diào)用RTPSession實(shí)例中的成員函數(shù)Create()生成RPT會(huì)話并同時(shí)初始化。
②設(shè)置接收端目標(biāo)地址。在生成RTP會(huì)話后傳輸視頻數(shù)據(jù)前,首先調(diào)用RTPSession實(shí)例中的成員函數(shù)AddDestination()來設(shè)置數(shù)據(jù)發(fā)送時(shí)的目標(biāo)地址(接收端地址)。在RTP協(xié)議中可以根據(jù)需要設(shè)置指定多個(gè)目標(biāo)地址于同一會(huì)話中,其中函數(shù)SetDefaultPayloadType(96)用于設(shè)定RPT負(fù)載H.264編碼數(shù)據(jù);voidClearDestinations()用于清除所有的地址;函數(shù)DeleteDestination()為刪除指定地址。
③發(fā)送視頻數(shù)據(jù)到目標(biāo)地址。設(shè)置好數(shù)據(jù)發(fā)送目標(biāo)地址之后,使用RTPSession實(shí)例中成員函數(shù)SendPacket(),將編碼好的H.264數(shù)據(jù)包發(fā)送到一個(gè)或多個(gè)目標(biāo)地址。由于每一幀視頻的數(shù)據(jù)量較大,RTP數(shù)據(jù)包以分片傳輸方式傳輸以保證視頻數(shù)據(jù)的可靠性。SendPacket()函數(shù)中,mark為1代表該RTP包為完整包,為0代表分割包。
④RTP會(huì)話結(jié)束。調(diào)用BYEDestroy()函數(shù)結(jié)束此次RTP會(huì)話。
3 視頻監(jiān)控PC客戶端設(shè)計(jì)
接收端將分片數(shù)據(jù)包重新組裝成為幀,得到H.264格式的壓縮編碼視頻,交付給視頻監(jiān)控PC客戶端處理,這里視頻監(jiān)控PC客戶端的主要功能為視頻數(shù)據(jù)的重新解壓、播放顯示和處理等。系統(tǒng)采用FFMPEG方案和SDL技術(shù)來實(shí)現(xiàn)監(jiān)控視頻數(shù)據(jù)的解壓和顯示。
3.1 視頻數(shù)據(jù)解壓
FFMPEG是一套開源的音頻流和視頻流方案,支持音視頻編解碼等功能,為免費(fèi)軟件。FFMPEG方案的開發(fā)與使用是在Linux系統(tǒng)平臺(tái)下的,但隨著發(fā)展現(xiàn)已支持Windows等多種操作系統(tǒng)。FFMPEG方案支持H.264、MPEG4、3GP等多種常見格式的視頻編解碼,功能全面且性能強(qiáng)大。系統(tǒng)采用FFMPEG方案主要完成客戶端對(duì)已編碼視頻數(shù)據(jù)的接收和視頻解碼工作。
在Windows下安裝好FFMPEG開源庫(kù)開發(fā)環(huán)境,再進(jìn)行視頻數(shù)據(jù)的解碼工作,其中FFMPEG庫(kù)中的主要功能函數(shù)和數(shù)據(jù)結(jié)構(gòu)有:
①AVCodecContext()結(jié)構(gòu)體,用于編碼器參數(shù)信息描述,如視頻的采樣率、視頻的寬和高等信息;
②AVPacket()結(jié)構(gòu)體,緩沖解碼前視頻數(shù)據(jù);
③AVFrame()結(jié)構(gòu)體,存儲(chǔ)視頻數(shù)據(jù)解碼后的數(shù)據(jù)幀;
④av_resister_all()功能函數(shù),用來注冊(cè)全部解碼器;
⑤avcodec_find_decoder(),搜索解碼器,如H.264格式解碼器;
⑥avcodec_decode_video(),解碼接收到的視頻幀;
⑦avcodec_alloc_frame(),新建AVFrame結(jié)構(gòu)體。
3.2 視頻播放顯示
SDL是一個(gè)跨平臺(tái)的多媒體開源開發(fā)庫(kù),支持多媒體播放器、游戲開發(fā)等,可以運(yùn)行在多種操作系統(tǒng)上(如Windows、Linux等),兼容性良好。SDL開源庫(kù)包含音頻、視頻和視窗管理等多個(gè)子系統(tǒng)。本文采用SDL開源庫(kù)中的視頻子系統(tǒng),其主要功能是將FFMPEG解碼后的視頻數(shù)據(jù)進(jìn)行顯示與播放。
SDL開源庫(kù)將解碼后的視頻數(shù)據(jù)轉(zhuǎn)化成對(duì)應(yīng)的YUV格式,在屏幕上顯示其各個(gè)分量,完成視頻的輸出。SDL開源庫(kù)中的主要的數(shù)據(jù)結(jié)構(gòu)體和功能函數(shù)為:SDL_Overlay()結(jié)構(gòu)體,為YUV格式圖像信息的覆蓋結(jié)構(gòu);SDL_Surface()結(jié)構(gòu)體,為SDL中圖像信息顯示的基本區(qū)域;SDL_Init()功能函數(shù),作用是初始化SDL中圖像特性;SDL_CreateYUVOverlay()功能函數(shù),創(chuàng)建SDL_Overlay()結(jié)構(gòu),設(shè)置尺寸參數(shù)等;SDL_Display YUVOverlay()函數(shù),用來播放監(jiān)控視頻圖像,即SDL_Overlay()結(jié)構(gòu)體中存儲(chǔ)的圖像信息。
通過FFMPEG和SDL技術(shù)中的主要結(jié)構(gòu)體以及功能函數(shù)完成接收端的視頻解碼和播放任務(wù),主要的工作流程如圖4所示。
結(jié)語
本文設(shè)計(jì)了一種基于Cortex-A8的無線視頻監(jiān)控系統(tǒng),采用高性能的ARM Cortex—A8芯片SP5V210、300萬像素的COMS攝像頭、USB無線網(wǎng)卡以及PC機(jī)完成了系統(tǒng)的硬件搭建,利用低碼流和容錯(cuò)能力強(qiáng)的H.264壓縮編碼技術(shù)進(jìn)行視頻數(shù)據(jù)編碼,滿足了無線傳輸要求,且基于RTP /RTCP網(wǎng)絡(luò)傳輸協(xié)議提高了視頻傳輸?shù)膶?shí)時(shí)性。在視頻監(jiān)控PC客戶端應(yīng)用開源的FFMPEG和SDL技術(shù)實(shí)現(xiàn)了監(jiān)控視頻圖像的解碼和播放。
本系統(tǒng)具有良好的擴(kuò)展性,根據(jù)需求可擴(kuò)展為多路無線視頻監(jiān)控,用于人體識(shí)別、智能報(bào)警等。該系統(tǒng)可以高效穩(wěn)定運(yùn)行,布防便捷,攜帶方便,靈活行強(qiáng),成本低,提高了視頻監(jiān)控系統(tǒng)的實(shí)時(shí)性,在緊急救援和民工業(yè)安防系統(tǒng)上具有良好的應(yīng)用前景。
評(píng)論