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