陳滄毅,路林吉
目前視頻監(jiān)控和錄制主要采用攝像頭、硬盤錄像機、錄像等組成視頻監(jiān)控網(wǎng),該類視頻監(jiān)控網(wǎng)絡(luò)具有工作穩(wěn)定可靠的優(yōu)點。但是在某些特殊工作現(xiàn)場,如無人值守的倉庫、大規(guī)模的森林,以及高速的交通工具等,當(dāng)發(fā)生事故或災(zāi)情后,往往由于現(xiàn)場的破壞和時效性,而難以分清責(zé)任和分析事故原因。因此,對事故易發(fā)點的連續(xù)視頻監(jiān)控就尤為重要。
比如在高速行駛的機動車上發(fā)生車禍,絕大多數(shù)情況需要掌握的事故原因集中在事故之前很短的一段時間。因此,分清事故責(zé)任和分析事故原因,所需要的視頻信息大部分在事故時間點之前的幾十分鐘之內(nèi)。換句話說,除了這幾十分鐘的信息,其它幾天、幾個月,甚至幾年的視頻監(jiān)控信息都屬于冗余信息。
有鑒于此,本文提出了利用嵌入式系統(tǒng),實現(xiàn)視頻信息的循環(huán)錄制,只保留最后時刻視頻信息的便攜式連續(xù)視頻監(jiān)控系統(tǒng),并在Linux系統(tǒng)的基礎(chǔ)上得以實現(xiàn)[1]。
在本系統(tǒng)研究中,采用了目前比較常見的MINI2440開發(fā)板,是目前國內(nèi)性價比較高的一款學(xué)習(xí)板;它采用Samsung S3C2440為微處理器,并采用專業(yè)穩(wěn)定的CPU 內(nèi)核電源芯片和復(fù)位芯片來保證系統(tǒng)運行時的穩(wěn)定性。在處理器豐富資源的基礎(chǔ)上,對系統(tǒng)硬件進行了相關(guān)的配置和擴展,平臺配置了64MB的Flash和64MB的SDRAM,通過USB接口外接USB攝像頭和U盤,實現(xiàn)了整個硬件平臺的搭建[2]。
Video4Linux是Linux系統(tǒng)視頻采集軟件的總接口。各種網(wǎng)絡(luò)攝像頭,視頻采集卡,電視卡以及類似的設(shè)備均歸類于視頻采集領(lǐng)域,Video4Linux為此提供了一整套相應(yīng)的API接口。由于各個設(shè)備均有自己獨立的特性,Unix系統(tǒng)均在此基礎(chǔ)上進行了抽象,本著一切均是文件的設(shè)計思想,只需要進行 open()方法即可打開設(shè)備文件,read()/write()分別是對該設(shè)備進行讀寫傳輸數(shù)據(jù),ioctl()則是對設(shè)備參數(shù)配置。
除了 read()/write()讀寫的方法,Video4Linux特別提供了內(nèi)存映射接口 mmap()直接將設(shè)備內(nèi)存映射到用戶進程的地址空間中,這樣用戶可以直接在進程中讀寫內(nèi)存來控制設(shè)備,為視頻壓縮爭取了時間,有效地提高了視頻采集速度。
FFmpeg是一個集錄制、轉(zhuǎn)換、音/視頻編碼解碼功能為一體的完整的開源解決方案。FFmpeg的開發(fā)是基于 Linux操作系統(tǒng),但是可以在大多數(shù)操作系統(tǒng)中編譯和使用,包括windows系統(tǒng)等。FFmpeg支持MPEG、DivX、MPEG-4、AC3、DV、FLV等40多種編碼,AVI、MPEG、OGG、Matroska、ASF等90多種解碼。
FFmpeg庫支持多平臺運行,包括Linux、Windows和M ac OS等系統(tǒng)。本設(shè)計將FFmpeg移植到ARM9架構(gòu)的系統(tǒng)上,通過交叉編譯生成運行庫[4]。
FFmpeg主目錄下主要有 libavcodec、libavformat和libavutil等子目錄。其中 libavcodec用于存放各個encode/decode模塊,libavformat用于存放 muxer/demuxer模塊,libavutil用于存放內(nèi)存操作等常用模塊。
利用ffmpeg庫生成視頻文件,需要用到兩個貫穿始終的數(shù)據(jù)結(jié)構(gòu):struct AVFormatContext和struct AVStream。
圖1 用FFmpeg庫生成視頻文件的基本流程
struct AVFormatContext包含了一個視頻流的格式內(nèi)容,如所采用的編碼器(本文采用的是MJPEG的格式)等重要信息。而struct AVStream則包含了“流”這個概念中的一些數(shù)據(jù),比如:幀率、基本時間計量單位、首幀位置、持續(xù)時間、幀數(shù)以及幀數(shù)據(jù)本身等等。基于FFmpeg庫生成視頻文件的基本流程見圖一。
為了編譯成 ARM 上執(zhí)行的二進制程序,需要對configure文件和 Makefile文件進行手動修改,./configure–help命令可以得到有用的信息。
然后執(zhí)行make,make install。此步后,將生成所需要的二進制工具ffmpeg和ffserver。其中ffmpeg用于對媒體文件進行處理或視音頻設(shè)備進行操作,ffserver是一個http的流媒體服務(wù)器。另外生成兩個庫文件 libavcodec.so和libavformat.so。這兩個庫文件將是未來設(shè)計的重點。
這部分的工作是整個設(shè)計的核心。一般來說對視頻信息的循環(huán)錄制均采用日志處理的方法,即通過多文件實現(xiàn)循環(huán)錄制。這種方式經(jīng)常伴隨著一個明顯的缺陷是兩個文件中間存在視頻數(shù)據(jù)丟失現(xiàn)象。另外一種方案是通過對索引塊信息進行修改,使其達(dá)到隨機存取的能力,這種方式編程繁瑣,效果欠佳,尤其在FFmpeg體系下,時間軸控制起來涉及較底層代碼,這里不推薦采納。筆者認(rèn)為,采用第一種方案存在丟幀現(xiàn)象完全可以從軟件代碼設(shè)計有效避免,且通過該方案可以清楚記錄下每一段視頻的拍攝時間,極大方便了未來的查閱檢索。如果覺得多文件觀察起來較為繁瑣,該設(shè)計還提供了視頻自動按照時間順序合成的腳本。
3.3.1 檢測日志文件及讀取記錄
為了達(dá)到循環(huán)錄制的功能,需要在 U盤空間吃緊時刪除早些時間錄制的文件,因而獲取當(dāng)前刪除序號數(shù)至關(guān)重要,保證了日志文件與現(xiàn)有視頻的數(shù)據(jù)同步。
3.3.2 FFmpeg重要函數(shù)解析
表1 FFmpeg基本函數(shù)功能簡介
av_write_frame(AVFormatCo ntext *s,AVPacket *pkt)件int av_write_trailer(AVFormatCo ntext *s)寫入流結(jié)尾信息到指定輸出文件并釋放內(nèi)存數(shù)據(jù)。
表1列舉了部分FFmpeg庫重要函數(shù)的功能,具體可以參見源碼。這些函數(shù)均是基于FFmpeg編程的基礎(chǔ)。
3.3.3 采用MJPEG編碼方式
Motion JPEG(MJPEG)是一種視頻壓縮格式,其中每一幀圖象都分別使用JPEG編碼。同樣格式的MJPEG視頻壓縮不同于幀間壓縮,因為壓縮位元率比較低,所以編碼與解碼相對比較容易,并不需要過多的運算能力,符合ARM嵌入式的設(shè)計需求。此外,一些移動設(shè)備,如手機、數(shù)碼相機也常使用MJPEG來進行短片的編碼。該編碼的主要缺陷是壓縮效率不高,文件尺寸相對較大,但由于現(xiàn)在 U盤設(shè)備價格已經(jīng)十分低廉,因而在對硬件系統(tǒng)要求不高的地方應(yīng)用還是相當(dāng)廣泛的。
MPEG-4是另外一種較為成熟的編碼方式,主要針對視頻會議、可視電話的超低比特率編碼需求,一般在嵌入式系統(tǒng)中應(yīng)用需采用專用的壓縮芯片完成,成本較高,這也是本設(shè)計沒有采納的主要原因[6]。
3.3.4 實現(xiàn)循環(huán)錄制功能
文獻[1]中提到使用多文件錄制視頻會存在丟幀現(xiàn)象,可能是因為某些視頻錄像機錄制文件時,針對每一個文件均是同樣的處理流程,換句話說,就是每次錄制過程均是上一次過程的簡單重復(fù),這樣勢必導(dǎo)致在處理視頻文件結(jié)尾的時候部分幀丟失,前后文件不連續(xù)等現(xiàn)象。
本系統(tǒng)采取的方法是多線程幀控制法,即當(dāng)視頻將達(dá)到指定幀數(shù)時,開辟新線程對新的文件進行初始化;當(dāng)視頻達(dá)到指定幀數(shù)時,開辟新線程作后期處理并關(guān)閉文件。如此循環(huán)往復(fù),自然將每一幀信息均完整保存下來。
3.3.5 系統(tǒng)主體設(shè)計流程概覽
圖2 主線程運行流程圖
圖3 視頻采集線程工作流程
圖4 按鍵監(jiān)聽線程工作流程
程序編寫完成后,就可以通過宿主機使用交叉編譯器編譯連接生成可執(zhí)行文件,并向目標(biāo)機移植后運行。
軟件參數(shù)設(shè)定:
窗口大?。?40×480
幀率:15fps
單個文件幀數(shù):9000
通過長達(dá)5個多小時的視頻錄制測試,軟件工作正常,視頻質(zhì)量穩(wěn)定,從未出現(xiàn)丟幀或花屏現(xiàn)象,清晰度流暢性極佳。當(dāng)達(dá)到硬盤空間極限時,系統(tǒng)自動刪除早期文件,對視頻正常錄制過程沒有任何影響。實驗表明,在嵌入式Linux系統(tǒng)上實現(xiàn)循環(huán)錄制是完全可行的。
本文根據(jù)特殊工作現(xiàn)場對循環(huán)視頻監(jiān)控系統(tǒng)要求,在嵌入式Linux系統(tǒng)中實現(xiàn)了視頻循環(huán)錄制的功能。程序運行結(jié)果表明該設(shè)計方案運行可靠,符合實際工程需求,其主要特點如下:
1. 系統(tǒng)采用一般的USB攝像頭,價格低廉,極大節(jié)約了成本。
2. 采用基于 Linux的嵌入式視頻監(jiān)控系統(tǒng)解決方案,功能擴展性強,能支持多種硬件接口。
3. 系統(tǒng)可進行循環(huán)錄制,即自動探測U盤空間,刪除早期數(shù)據(jù),實現(xiàn)滾動更新功能。用戶可隨時選擇時間段下載數(shù)據(jù)。
4. 整個系統(tǒng)體積小巧,安裝方便,適合各種工作場合。
[1]劉少剛,王學(xué)軍.基于嵌入式Linux系統(tǒng)的單個AVI文件視頻循環(huán)錄制的研究[J].哈爾濱:林業(yè)機械與木工設(shè)備,2008.
[2]廣東友善之臂計算機科技有限公司 Mini2440用戶手冊[Z].2007.
[3]陳云鶴.基于嵌入式Linux的視頻信號實時采集系統(tǒng)的設(shè)計[D].華中科技大學(xué)2006.
[4]吳張順,張旬.基于FFmpeg的視頻編碼存儲研究與實現(xiàn)[J].杭州:杭州電子科技大學(xué)學(xué)報.2006.
[5]Epplin J,Linux as an Embedded Operating System[M],Embedded Systems Programming,1997.