張 喆,陳 以,齊彥甫
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
?
基于ARM無線視頻監(jiān)控系統(tǒng)及其數(shù)據(jù)傳輸研究
張 喆,陳 以,齊彥甫
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
為了解決視頻數(shù)據(jù)太大而無法進行傳輸和傳輸過程中存在丟幀或失真問題,通過研究視頻編解碼將H.264編碼與FFmpeg解碼相結(jié)合來搭建監(jiān)控系統(tǒng),并采用移動目標檢測法將移動的目標進行圖片和視頻保存。服務(wù)器端采用ARM9為硬件平臺,USB攝像頭采集圖像數(shù)據(jù),經(jīng)H.264編碼后傳輸給客戶端??蛻舳私邮諗?shù)據(jù)后通過FFmpeg進行解碼,OpenCV函數(shù)進行顯示監(jiān)控畫面,并通過網(wǎng)頁瀏覽保存好的圖片和視頻。系統(tǒng)測試表明:視頻數(shù)據(jù)的格式轉(zhuǎn)換不失真及丟幀率較低,使用x264庫對視頻進行壓縮編碼、FFmpeg對視頻解碼,達到了監(jiān)控系統(tǒng)預(yù)期理想的效果。
H.264;FFmpeg;編解碼;移動目標檢測
嵌入式系統(tǒng)以及對視頻數(shù)據(jù)處理技術(shù)的不斷成熟,使得市場上涌現(xiàn)出以嵌入式設(shè)備為核心的監(jiān)控系統(tǒng)[1]。嵌入式監(jiān)控設(shè)備具有操作簡單、占用空間小、價格低等優(yōu)點。其次嵌入式設(shè)備上運行著可裁剪的Linux操作系統(tǒng)[2]。攝像頭獲取的圖像數(shù)據(jù)通過軟件庫進行壓縮,通過網(wǎng)絡(luò)進行傳輸。嵌入式服務(wù)器具有數(shù)據(jù)通信、操作系統(tǒng)、處理視頻圖像數(shù)據(jù)等功能,使視頻監(jiān)控更加靈活、方便、范圍變廣[3]。
視頻監(jiān)控系統(tǒng)經(jīng)歷3個階段:模擬化視頻監(jiān)控、數(shù)字化視頻監(jiān)控、智能化視頻監(jiān)控。在本系統(tǒng)中,圖像數(shù)據(jù)通過USB攝像頭獲取,并將圖像數(shù)據(jù)壓縮編碼成H.264格式,然后將每個視頻幀打包到UDP包中進行傳輸,在接收端中采用FFmpeg進行解碼及OpenCV函數(shù)進行顯示視頻數(shù)據(jù)[4],并且通過移動目標檢測法將圖片和視頻保存,使用網(wǎng)頁進行瀏覽。
無線視頻監(jiān)控系統(tǒng)由ARM服務(wù)器、PC以及無線路由器3部分組成,其系統(tǒng)結(jié)構(gòu)如圖1所示。系統(tǒng)采用Mini2440硬件平臺,添加設(shè)備谷客HD10攝像頭、無線網(wǎng)卡。系統(tǒng)使用USB攝像頭獲取實時視頻圖像數(shù)據(jù),并將原始數(shù)據(jù)轉(zhuǎn)換為YUV420P格式,用H.264標準對數(shù)據(jù)進行壓縮編碼,再通過網(wǎng)絡(luò)進行數(shù)據(jù)傳輸,客戶端接收數(shù)據(jù)后采用FFmpeg進行解碼,最后采用OpenCV函數(shù)顯示視頻圖像。采用移動目標檢測法將移動目標的圖片和視頻保存下來,并通過網(wǎng)頁進行瀏覽[5]。
圖1 系統(tǒng)總體結(jié)構(gòu)
服務(wù)器端主要包括嵌入式平臺、攝像頭以及無線網(wǎng)卡。此外,設(shè)備驅(qū)動程序也是需要Linux平臺搭建交叉編譯環(huán)境后才能運行。平臺采用Mini2440為硬件開發(fā)平臺,適用于成本低以及功率小的嵌入式系統(tǒng)場合。采用谷客HD10攝像頭,使用CMOS傳感器,在接口上也能保持與Mini2440的一致性。
2.1 搭建嵌入式Linux平臺
任何一個嵌入式系統(tǒng)都需要啟動加載程序、Linux內(nèi)核、根文件系統(tǒng)等3部分。在本系統(tǒng)中,首先在虛擬機中搭建交叉編譯環(huán)境,然后對uboot進行編譯移植到開發(fā)板上,再對內(nèi)核Linux-2.6.32進行裁剪和配置。最后制作最小根文件系統(tǒng),并移植到平臺上。至此嵌入式Linux平臺搭建完成[6]。
2.2 采集端
攝像頭驅(qū)動程序采用的是V4L2接口協(xié)議,再將其程序加載到Linux內(nèi)核中。其工作流程為:打開設(shè)備、檢查和設(shè)置設(shè)備屬性、設(shè)置幀格式、設(shè)置一種輸入輸出方式、循環(huán)獲取數(shù)據(jù)、關(guān)閉設(shè)備。
加載完驅(qū)動程序后即可操作攝像頭設(shè)備。如定義id,通過id=open(“/dev/video0”,O_RDWR)來打開攝像頭,再通過close(id)來關(guān)閉攝像頭[7]。在整個采集端中,ioctl函數(shù)十分重要。使用ioctl函數(shù)來管理設(shè)備驅(qū)動程序中對設(shè)備的I/O通道,如使用ioctl(id,VIDIOC_QUERYCAP,&caps)來判斷當前設(shè)備和driver是否支持V4L2規(guī)范。使用ioctl函數(shù)來檢查是否支持MMAP或者是USERPTR。通過ioctl(id,VIDOC_QUERYBUF,&buf)查詢申請到的內(nèi)存并獲取分配的buf,且mmap到進程空間中。然后再枚舉設(shè)備所支持的圖像格式,獲取USB攝像頭所采取視頻數(shù)據(jù)格式為YUV422,然而H.264編碼所需圖像格式為YUV420P,則采用FFmpeg中函數(shù)sws_scale()進行圖像轉(zhuǎn)換。最后將轉(zhuǎn)換后的圖像數(shù)據(jù)再重新入列到BUF中,并循環(huán)獲取視頻數(shù)據(jù)。
2.3 H.264編碼
視頻壓縮標準H.264是1995年發(fā)布的。它是由ITU-T和ISO/IEC聯(lián)合共同開發(fā)。因此,H.264被普遍認為是最有影響力的行業(yè)標準。H.264具有低碼流、圖像清晰度高、容錯能力強、網(wǎng)絡(luò)適應(yīng)性強等優(yōu)點[8]。
系統(tǒng)采用了開源軟件x264對視頻數(shù)據(jù)進行編碼。將x264軟件進行部分的修改和優(yōu)化,再通過交叉編譯后移植到平臺上。先通過x264_param_default_preset(&ctx->param,“fast”,“zerolatency”)函數(shù)設(shè)置編碼屬性,再填充ctx->param結(jié)構(gòu)體。然后通過x264_encoder_open(&ctx->param)函數(shù)來打開編碼器。再通過函數(shù)x264_picture_init(&ctx->picture)初始化圖像結(jié)構(gòu)體并填充圖像結(jié)構(gòu)體&ctx->picture。接下來,就是十分重要的編碼了,通過函數(shù)x264_encoder_encode(c->x264,&nals,&nal_cnt,pic,&pic_out)來編碼一幀圖像并使用do-wile語句不斷循環(huán)進行編碼。將編碼后的數(shù)據(jù)放入到內(nèi)存中,等待網(wǎng)絡(luò)發(fā)送。其編碼流程如圖2所示。
圖2 編碼流程
2.4 視頻數(shù)據(jù)傳輸
通過攝像頭采集數(shù)據(jù),并對數(shù)據(jù)進行編碼,最后對數(shù)據(jù)進行傳輸。系統(tǒng)采用UDP協(xié)議進行傳輸,通過socket(AF_INET,SOCK_DGRAM,0)函數(shù)確定采用IPv4地址以及UDP協(xié)議,再經(jīng)sendto()函數(shù)傳輸數(shù)據(jù)。整個過程就是不斷進行獲取視頻數(shù)據(jù)、壓縮視頻數(shù)據(jù)、傳輸視頻數(shù)據(jù)、等待等一系列過程。
2.5 移動目標檢測法
移動目標檢測法在一定程度上模擬大腦的能力,實現(xiàn)智能監(jiān)控。目前,人工智能水平還比較低級,智能監(jiān)控程度也比較有限?,F(xiàn)階段監(jiān)控也只能針對特定情況下的運用,如人臉識別、車牌掃描、移動目標檢測等。
系統(tǒng)采用開源軟件motion作為移動目標檢測法,通過編譯motion軟件,將motion命令和配置文件拷入ARM中,就可以對圖像數(shù)據(jù)進行處理和分析,并將圖片和視頻保存。分析motion源碼,程序通過采集圖像數(shù)據(jù),將前一幀圖像數(shù)據(jù)與后一幀圖像數(shù)據(jù)進行比較,當達到一定數(shù)目像素,就會判斷有無移動目標,并通過方框標注移動目標,且將會保存圖片和視頻。motion主函數(shù)main產(chǎn)生兩個重要的線程,一個線程是在函數(shù)start_motion_thread()中調(diào)用static void *motion_loop()函數(shù),進入線程motion_loop()函數(shù),該函數(shù)實現(xiàn)motion的主要功能,如讀取配置文件、采集圖像、檢測運動等。另一個線程通過函數(shù)pthread_create()進入Web網(wǎng)頁瀏覽視頻控制函數(shù)void *motion_web_control(),用以遠程控制motion。
3.1 FFmepg簡介
FFmpeg是音視頻多種格式的集錄影、轉(zhuǎn)換、編解碼等功能為一體,采用了LGPL或GPL許可證。FFmpeg庫需要在平臺上進行交叉編譯后才能運行。FFmpeg包含了音視頻編解碼庫libavcodec以及音視頻格式轉(zhuǎn)換函數(shù)庫libavformat。FFmpeg支持H.264、MPEG4、DV、FLV等40 多種編碼,同時支持H.264、MPEG、ASF、AVI等90多種解碼[9]。
3.2 解碼
FFmpeg解碼的核心函數(shù)為avcodec_decode_video()。客戶端接收到視頻幀數(shù)據(jù)后,將其存儲到AVPacket格式的內(nèi)存空間,采用avcodec_decode_video()函數(shù)解碼。其解碼流程如圖3所示。
圖3 解碼流程圖
以下對過程中各個函數(shù)的作用進行說明:
(1) avcodec_register_all():注冊庫中所有文件格式和編解碼器;(2) avcodec_find_decoder():查找解碼器,對解碼器參數(shù)codec進行初始化。如codec=avcodec_find_decoder(CODEC_ID_H264),尋找H.264格式解碼器;(3) avcodec_alloc_context():為AVCodecContext分配內(nèi)存;(4) avcodec_open():打開解碼器;(5) avcodec_alloc_frame():為解碼幀分配內(nèi)存,frame=avcodec_alloc_frame(),其中frame為AVFrame格式;(6) AVPacket pkt:使用AVPacket結(jié)構(gòu)建立緩沖區(qū)裝載數(shù)據(jù);(7) avcodec_decode_video():進行解碼一幀數(shù)據(jù);(8) sws_cale():轉(zhuǎn)換視頻數(shù)據(jù)格式以待顯示;(9) avcodec_close():關(guān)閉解碼器。
3.3 視頻顯示
在經(jīng)過FFmpeg解碼后,視頻數(shù)據(jù)格式為YUV420P。但是OpenCV顯示函數(shù)中需要視頻數(shù)據(jù)格式為RGB。則必須通過FFmpeg中的sws_scale()函數(shù)將數(shù)據(jù)進行格式轉(zhuǎn)換。在OpenCV的顯示函數(shù)中,其核心函數(shù)為cvShowImage(char *name, Ipllmage *dst)。通過FFmpeg轉(zhuǎn)換過來的RGB格式轉(zhuǎn)換為OpenCV格式的Ipllmage數(shù)據(jù),然后通過函數(shù)cvNamedWindow("Test Window", CV_WINDOW_AUTOSIZE)建立窗口,最后通過核心函數(shù)顯示。
3.4 網(wǎng)頁設(shè)計
系統(tǒng)采用Boa服務(wù)器作為嵌入式Web服務(wù)器。Boa服務(wù)器具有體積小、功能全、內(nèi)存使用較少且支持CGI交互程序等特點。CGI是外部擴展應(yīng)用程序與WWW服務(wù)器交互的一個標準接口。通過CGI應(yīng)用程序可以處理瀏覽輸入的數(shù)據(jù),從而完成客戶端與服務(wù)器的交互操作。
移植Boa服務(wù)器,進行交叉編譯。修改配置文件boa.conf,并在根文件系統(tǒng)中的etc目錄下新建boa文件,將boa配置文件放到該目錄下,將boa命令放在sbin目錄下,最后在終端運行boa。移植cgic庫,使用的是cgic205版,進行交叉編譯。在根文件下新建目錄/web,/web/cam。在主網(wǎng)頁設(shè)計中,對圖片和視頻顯示代碼為,。
而代碼中image.cgi需要將顯示圖片的C程序編譯成cgi程序,其中顯示圖片核心代碼fprintf(cgiOut, "",g_img[i].name),將image.c程序通過交叉編譯即arm-linux-gcc -L ./cgic205/ -lcgic -I ./cgic205/ image.c -o image.cgi,將image.cgi程序拷貝到/web/cam目錄下。同樣,將movie.cgi程序拷貝到/web/cam目錄下。在PC輸入http://192.168.1.4就可以瀏覽到圖片和視頻。
在Fedore14系統(tǒng)中編譯服務(wù)器程序以及客戶端程序,并將服務(wù)器程序通過串口下載到ARM開發(fā)板上,設(shè)置開發(fā)板ip地址為192.168.1.4。在SecureCRT界面中輸入命令,運行服務(wù)器端程序和motion程序,注意到ARM開發(fā)板通過USB攝像頭獲取圖像信息。最后在Fedore14系統(tǒng)中運行客戶端程序,跳出窗口,顯示監(jiān)控畫面,如圖4所示。并登錄網(wǎng)頁輸入開發(fā)板的ip地址,瀏覽圖片以及視頻,如圖5所示為圖片瀏覽,圖6所示為觀看視頻。
圖4 監(jiān)控畫面
圖5 瀏覽圖片
圖6 觀看視頻
在系統(tǒng)測試過程,分別在客戶端和服務(wù)器端打印信息。根據(jù)所打印的信息,可以看出視頻數(shù)據(jù)在壓縮、傳輸、解碼的過程中,受損較小,這使得畫面得以清晰。
為了計算客戶端解碼幀率[10],通過服務(wù)器端采集2 000幀視頻圖像,統(tǒng)計客戶端解碼后所顯示幀數(shù)以及計算FPS(每秒顯示的圖像數(shù))。測試結(jié)果如表1所示。通過以下數(shù)據(jù),表明對于320×240的視頻圖像,客戶端顯示能達到10幀/s,顯示較為流暢,偶爾會丟幀,結(jié)果達到預(yù)期目標。而對于640×480視頻圖像情況,由于數(shù)據(jù)量變大其客戶端顯示只能達到2幀/s左右,顯示效果不太流暢,丟幀現(xiàn)象嚴重,需要優(yōu)化或修改方案。
表1 測試結(jié)果表
視頻數(shù)據(jù)格式越來越繁復(fù)多樣,視頻數(shù)據(jù)的格式轉(zhuǎn)換要求不失真或丟幀率較低,所以編解碼技術(shù)及其選擇將顯得尤其重要。本文使用開源軟件x264庫對視頻進行編碼,使用FFmpeg對視頻進行解碼,系統(tǒng)監(jiān)控達到預(yù)期理想的效果,實現(xiàn)跨平臺清晰的無線視頻監(jiān)控過程。實驗測試表明,本系統(tǒng)為視頻編解碼傳輸提供了一種可行方法。
[1] 辛長春,婁小平,呂乃光.基于FFmpeg的遠程視頻監(jiān)控系統(tǒng)編解碼[J].電子技術(shù),2013(1): 3-5.
[2] 馬毅. 基于Linux的遠程視頻監(jiān)控嵌入式系統(tǒng)的設(shè)計與實現(xiàn)[D].上海:上海交通大學,2001.
[3] 王必安.基于H.264的嵌入式遠程視頻監(jiān)控系統(tǒng)的設(shè)計與實現(xiàn)[D].武漢:武漢科技大學,2012.
[4] 汪洋.李垚.黃魯.基于Qt和OpenCV的無線視頻監(jiān)控系統(tǒng)[J].微型機與應(yīng)用,2015,34(10):68-69.
[5] 陳娟,李元,李萬國.基于B/S模式的嵌入式系統(tǒng)測試方法與實現(xiàn)[J].電子技術(shù)應(yīng)用,2016,42(2): 52-56.
[6] 賴于樹.ARM微處理器與應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2007.
[7] Joratban Corbet.Linux設(shè)備驅(qū)動程序(第三版)[M].北京:中國電力出版社,2005.
[8] 畢厚杰.新一代視頻壓縮編碼標準—H.264/AVC[M].北京:人民郵電出版社,2004.
[9] 蔣志峰.FFMPEG的快速音視頻開發(fā)方法[J].單片機與嵌入式系統(tǒng)應(yīng)用,2008(1):69-71.
[10] 李保國.基于嵌入式ARM的遠程視頻監(jiān)控系統(tǒng)研究[D].南京:南京理工大學,2009.
Research on wireless video surveillance system and its data transmission based on ARM
Zhang Zhe, Chen Yi, Qi Yanfu
(Institute of Electrical Engineering and Automation, Guilin University of Electronic Technology, Guilin 541004,China)
For solving the problem that the video data is too large to be transmitted and lost frame or distortion in video data transmission, the video surveillance system is constructed by combining H.264 encoding with FFmpeg decoding by studying video codec,and motion detection method is used to save the moving object image and video. The server part uses ARM9 as the embedded hardware platform, and captures video data by the USB camera. Through H.264 encoding, the video data is sent to client part. The client part decodes the
data by FFmpeg, then through OpenCV function to display the monitor screen and through the web to browse pictures and videos. The system test results show that the format conversion of the video data is not distorted and the frame loss ratio is low. Using x264 library for video compression coding,FFmpeg for video decoding, can achieve the desired effect of the monitoring system expected.
H.264; FFmpeg; encoding and decoding; motion detection
TP277
A
10.19358/j.issn.1674- 7720.2017.13.016
張喆,陳以,齊彥甫.基于ARM無線視頻監(jiān)控系統(tǒng)及其數(shù)據(jù)傳輸研究[J].微型機與應(yīng)用,2017,36(13):52-54,58.
2017-02-09)
張喆(1991-),通信作者,男,在讀碩士研究生,主要研究方向:精密測量與智能控制。E-mail: 624097565@qq.com。
陳以(1963-),男,碩士,教授,主要研究方向:精密測量與智能控制。
齊彥甫(1989-),男,碩士研究生,主要研究方向:精密測量與智能控制。