張 喆,陳 以,齊彥甫
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
?
基于ARM無線視頻監控系統及其數據傳輸研究
張 喆,陳 以,齊彥甫
(桂林電子科技大學 電子工程與自動化學院,廣西 桂林 541004)
為了解決視頻數據太大而無法進行傳輸和傳輸過程中存在丟幀或失真問題,通過研究視頻編解碼將H.264編碼與FFmpeg解碼相結合來搭建監控系統,并采用移動目標檢測法將移動的目標進行圖片和視頻保存。服務器端采用ARM9為硬件平臺,USB攝像頭采集圖像數據,經H.264編碼后傳輸給客戶端。客戶端接收數據后通過FFmpeg進行解碼,OpenCV函數進行顯示監控畫面,并通過網頁瀏覽保存好的圖片和視頻。系統測試表明:視頻數據的格式轉換不失真及丟幀率較低,使用x264庫對視頻進行壓縮編碼、FFmpeg對視頻解碼,達到了監控系統預期理想的效果。
H.264;FFmpeg;編解碼;移動目標檢測
嵌入式系統以及對視頻數據處理技術的不斷成熟,使得市場上涌現出以嵌入式設備為核心的監控系統[1]。嵌入式監控設備具有操作簡單、占用空間小、價格低等優點。其次嵌入式設備上運行著可裁剪的Linux操作系統[2]。攝像頭獲取的圖像數據通過軟件庫進行壓縮,通過網絡進行傳輸。嵌入式服務器具有數據通信、操作系統、處理視頻圖像數據等功能,使視頻監控更加靈活、方便、范圍變廣[3]。
視頻監控系統經歷3個階段:模擬化視頻監控、數字化視頻監控、智能化視頻監控。在本系統中,圖像數據通過USB攝像頭獲取,并將圖像數據壓縮編碼成H.264格式,然后將每個視頻幀打包到UDP包中進行傳輸,在接收端中采用FFmpeg進行解碼及OpenCV函數進行顯示視頻數據[4],并且通過移動目標檢測法將圖片和視頻保存,使用網頁進行瀏覽。
無線視頻監控系統由ARM服務器、PC以及無線路由器3部分組成,其系統結構如圖1所示。系統采用Mini2440硬件平臺,添加設備谷客HD10攝像頭、無線網卡。系統使用USB攝像頭獲取實時視頻圖像數據,并將原始數據轉換為YUV420P格式,用H.264標準對數據進行壓縮編碼,再通過網絡進行數據傳輸,客戶端接收數據后采用FFmpeg進行解碼,最后采用OpenCV函數顯示視頻圖像。采用移動目標檢測法將移動目標的圖片和視頻保存下來,并通過網頁進行瀏覽[5]。

圖1 系統總體結構
服務器端主要包括嵌入式平臺、攝像頭以及無線網卡。此外,設備驅動程序也是需要Linux平臺搭建交叉編譯環境后才能運行。平臺采用Mini2440為硬件開發平臺,適用于成本低以及功率小的嵌入式系統場合。采用谷客HD10攝像頭,使用CMOS傳感器,在接口上也能保持與Mini2440的一致性。
2.1 搭建嵌入式Linux平臺
任何一個嵌入式系統都需要啟動加載程序、Linux內核、根文件系統等3部分。在本系統中,首先在虛擬機中搭建交叉編譯環境,然后對uboot進行編譯移植到開發板上,再對內核Linux-2.6.32進行裁剪和配置。最后制作最小根文件系統,并移植到平臺上。至此嵌入式Linux平臺搭建完成[6]。
2.2 采集端
攝像頭驅動程序采用的是V4L2接口協議,再將其程序加載到Linux內核中。其工作流程為:打開設備、檢查和設置設備屬性、設置幀格式、設置一種輸入輸出方式、循環獲取數據、關閉設備。
加載完驅動程序后即可操作攝像頭設備。如定義id,通過id=open(“/dev/video0”,O_RDWR)來打開攝像頭,再通過close(id)來關閉攝像頭[7]。在整個采集端中,ioctl函數十分重要。使用ioctl函數來管理設備驅動程序中對設備的I/O通道,如使用ioctl(id,VIDIOC_QUERYCAP,&caps)來判斷當前設備和driver是否支持V4L2規范。使用ioctl函數來檢查是否支持MMAP或者是USERPTR。通過ioctl(id,VIDOC_QUERYBUF,&buf)查詢申請到的內存并獲取分配的buf,且mmap到進程空間中。然后再枚舉設備所支持的圖像格式,獲取USB攝像頭所采取視頻數據格式為YUV422,然而H.264編碼所需圖像格式為YUV420P,則采用FFmpeg中函數sws_scale()進行圖像轉換。最后將轉換后的圖像數據再重新入列到BUF中,并循環獲取視頻數據。
2.3 H.264編碼
視頻壓縮標準H.264是1995年發布的。它是由ITU-T和ISO/IEC聯合共同開發。因此,H.264被普遍認為是最有影響力的行業標準。H.264具有低碼流、圖像清晰度高、容錯能力強、網絡適應性強等優點[8]。
系統采用了開源軟件x264對視頻數據進行編碼。將x264軟件進行部分的修改和優化,再通過交叉編譯后移植到平臺上。先通過x264_param_default_preset(&ctx->param,“fast”,“zerolatency”)函數設置編碼屬性,再填充ctx->param結構體。然后通過x264_encoder_open(&ctx->param)函數來打開編碼器。再通過函數x264_picture_init(&ctx->picture)初始化圖像結構體并填充圖像結構體&ctx->picture。接下來,就是十分重要的編碼了,通過函數x264_encoder_encode(c->x264,&nals,&nal_cnt,pic,&pic_out)來編碼一幀圖像并使用do-wile語句不斷循環進行編碼。將編碼后的數據放入到內存中,等待網絡發送。其編碼流程如圖2所示。

圖2 編碼流程
2.4 視頻數據傳輸
通過攝像頭采集數據,并對數據進行編碼,最后對數據進行傳輸。系統采用UDP協議進行傳輸,通過socket(AF_INET,SOCK_DGRAM,0)函數確定采用IPv4地址以及UDP協議,再經sendto()函數傳輸數據。整個過程就是不斷進行獲取視頻數據、壓縮視頻數據、傳輸視頻數據、等待等一系列過程。
2.5 移動目標檢測法
移動目標檢測法在一定程度上模擬大腦的能力,實現智能監控。目前,人工智能水平還比較低級,智能監控程度也比較有限。現階段監控也只能針對特定情況下的運用,如人臉識別、車牌掃描、移動目標檢測等。
系統采用開源軟件motion作為移動目標檢測法,通過編譯motion軟件,將motion命令和配置文件拷入ARM中,就可以對圖像數據進行處理和分析,并將圖片和視頻保存。分析motion源碼,程序通過采集圖像數據,將前一幀圖像數據與后一幀圖像數據進行比較,當達到一定數目像素,就會判斷有無移動目標,并通過方框標注移動目標,且將會保存圖片和視頻。motion主函數main產生兩個重要的線程,一個線程是在函數start_motion_thread()中調用static void *motion_loop()函數,進入線程motion_loop()函數,該函數實現motion的主要功能,如讀取配置文件、采集圖像、檢測運動等。另一個線程通過函數pthread_create()進入Web網頁瀏覽視頻控制函數void *motion_web_control(),用以遠程控制motion。
3.1 FFmepg簡介
FFmpeg是音視頻多種格式的集錄影、轉換、編解碼等功能為一體,采用了LGPL或GPL許可證。FFmpeg庫需要在平臺上進行交叉編譯后才能運行。FFmpeg包含了音視頻編解碼庫libavcodec以及音視頻格式轉換函數庫libavformat。FFmpeg支持H.264、MPEG4、DV、FLV等40 多種編碼,同時支持H.264、MPEG、ASF、AVI等90多種解碼[9]。
3.2 解碼
FFmpeg解碼的核心函數為avcodec_decode_video()。客戶端接收到視頻幀數據后,將其存儲到AVPacket格式的內存空間,采用avcodec_decode_video()函數解碼。其解碼流程如圖3所示。

圖3 解碼流程圖
以下對過程中各個函數的作用進行說明:
(1) avcodec_register_all():注冊庫中所有文件格式和編解碼器;(2) avcodec_find_decoder():查找解碼器,對解碼器參數codec進行初始化。如codec=avcodec_find_decoder(CODEC_ID_H264),尋找H.264格式解碼器;(3) avcodec_alloc_context():為AVCodecContext分配內存;(4) avcodec_open():打開解碼器;(5) avcodec_alloc_frame():為解碼幀分配內存,frame=avcodec_alloc_frame(),其中frame為AVFrame格式;(6) AVPacket pkt:使用AVPacket結構建立緩沖區裝載數據;(7) avcodec_decode_video():進行解碼一幀數據;(8) sws_cale():轉換視頻數據格式以待顯示;(9) avcodec_close():關閉解碼器。
3.3 視頻顯示
在經過FFmpeg解碼后,視頻數據格式為YUV420P。但是OpenCV顯示函數中需要視頻數據格式為RGB。則必須通過FFmpeg中的sws_scale()函數將數據進行格式轉換。在OpenCV的顯示函數中,其核心函數為cvShowImage(char *name, Ipllmage *dst)。通過FFmpeg轉換過來的RGB格式轉換為OpenCV格式的Ipllmage數據,然后通過函數cvNamedWindow("Test Window", CV_WINDOW_AUTOSIZE)建立窗口,最后通過核心函數顯示。
3.4 網頁設計
系統采用Boa服務器作為嵌入式Web服務器。Boa服務器具有體積小、功能全、內存使用較少且支持CGI交互程序等特點。CGI是外部擴展應用程序與WWW服務器交互的一個標準接口。通過CGI應用程序可以處理瀏覽輸入的數據,從而完成客戶端與服務器的交互操作。
移植Boa服務器,進行交叉編譯。修改配置文件boa.conf,并在根文件系統中的etc目錄下新建boa文件,將boa配置文件放到該目錄下,將boa命令放在sbin目錄下,最后在終端運行boa。移植cgic庫,使用的是cgic205版,進行交叉編譯。在根文件下新建目錄/web,/web/cam。在主網頁設計中,對圖片和視頻顯示代碼為,。
而代碼中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系統中編譯服務器程序以及客戶端程序,并將服務器程序通過串口下載到ARM開發板上,設置開發板ip地址為192.168.1.4。在SecureCRT界面中輸入命令,運行服務器端程序和motion程序,注意到ARM開發板通過USB攝像頭獲取圖像信息。最后在Fedore14系統中運行客戶端程序,跳出窗口,顯示監控畫面,如圖4所示。并登錄網頁輸入開發板的ip地址,瀏覽圖片以及視頻,如圖5所示為圖片瀏覽,圖6所示為觀看視頻。

圖4 監控畫面

圖5 瀏覽圖片

圖6 觀看視頻
在系統測試過程,分別在客戶端和服務器端打印信息。根據所打印的信息,可以看出視頻數據在壓縮、傳輸、解碼的過程中,受損較小,這使得畫面得以清晰。
為了計算客戶端解碼幀率[10],通過服務器端采集2 000幀視頻圖像,統計客戶端解碼后所顯示幀數以及計算FPS(每秒顯示的圖像數)。測試結果如表1所示。通過以下數據,表明對于320×240的視頻圖像,客戶端顯示能達到10幀/s,顯示較為流暢,偶爾會丟幀,結果達到預期目標。而對于640×480視頻圖像情況,由于數據量變大其客戶端顯示只能達到2幀/s左右,顯示效果不太流暢,丟幀現象嚴重,需要優化或修改方案。

表1 測試結果表
視頻數據格式越來越繁復多樣,視頻數據的格式轉換要求不失真或丟幀率較低,所以編解碼技術及其選擇將顯得尤其重要。本文使用開源軟件x264庫對視頻進行編碼,使用FFmpeg對視頻進行解碼,系統監控達到預期理想的效果,實現跨平臺清晰的無線視頻監控過程。實驗測試表明,本系統為視頻編解碼傳輸提供了一種可行方法。
[1] 辛長春,婁小平,呂乃光.基于FFmpeg的遠程視頻監控系統編解碼[J].電子技術,2013(1): 3-5.
[2] 馬毅. 基于Linux的遠程視頻監控嵌入式系統的設計與實現[D].上海:上海交通大學,2001.
[3] 王必安.基于H.264的嵌入式遠程視頻監控系統的設計與實現[D].武漢:武漢科技大學,2012.
[4] 汪洋.李垚.黃魯.基于Qt和OpenCV的無線視頻監控系統[J].微型機與應用,2015,34(10):68-69.
[5] 陳娟,李元,李萬國.基于B/S模式的嵌入式系統測試方法與實現[J].電子技術應用,2016,42(2): 52-56.
[6] 賴于樹.ARM微處理器與應用開發[M].北京:電子工業出版社,2007.
[7] Joratban Corbet.Linux設備驅動程序(第三版)[M].北京:中國電力出版社,2005.
[8] 畢厚杰.新一代視頻壓縮編碼標準—H.264/AVC[M].北京:人民郵電出版社,2004.
[9] 蔣志峰.FFMPEG的快速音視頻開發方法[J].單片機與嵌入式系統應用,2008(1):69-71.
[10] 李保國.基于嵌入式ARM的遠程視頻監控系統研究[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無線視頻監控系統及其數據傳輸研究[J].微型機與應用,2017,36(13):52-54,58.
2017-02-09)
張喆(1991-),通信作者,男,在讀碩士研究生,主要研究方向:精密測量與智能控制。E-mail: 624097565@qq.com。
陳以(1963-),男,碩士,教授,主要研究方向:精密測量與智能控制。
齊彥甫(1989-),男,碩士研究生,主要研究方向:精密測量與智能控制。