基于嵌入式Linux的視頻循環(huán)錄制系統(tǒng)
摘要:本文以行車視頻錄制為背景,設計了以三星公司ARM9芯片S3C2440作為主控芯片,可移植開源的Linux系統(tǒng)。在對系統(tǒng)硬件結構、系統(tǒng)原理和環(huán)境搭建描述后,重點介紹了視頻循環(huán)錄制功能和將視頻保存成跨平臺通用的avi文件的過程。測試結果表明此方案可行。
關鍵詞:avi視頻;循環(huán)存儲;嵌入式系統(tǒng);Linux
引言
視頻采集系統(tǒng)以其直觀的視頻影像數據,對現場場景進行記錄,目前已經在各行各業(yè)得到廣泛應用。對于特定運用場合,如汽車行進過程,由于其環(huán)境的不確定性和多樣性,以及事故的突發(fā)性和偶然性,要求采集系統(tǒng)能夠穩(wěn)定、連續(xù)地實時記錄事發(fā)過程。行車過程事故發(fā)生時,需要掌握的事故原因往往在事故發(fā)生前短短的一段時間內。因此,分清事故責任和分析事故原因所需要的視頻信息,往往是在事故時間點之前的一小段時間內。
日常生活中常見的交通糾紛,往往是因為沒有直接證據造成取證困難?;诖?,結合嵌入式系統(tǒng)低功耗、低成本等優(yōu)點,本文利用嵌入式Linux系統(tǒng)實現行車視頻存儲,存儲的視頻可以為交通糾紛的調解以及交通事故認定,提供現場錄像證據。
1 系統(tǒng)概述
1.1 系統(tǒng)硬件結構
系統(tǒng)硬件結構如圖1所示。主控制芯片為三星的ARM9芯片S3C2440,它內部含有MMC/SD/SDIO控制器、NAND Flash控制器、USB主控制器、存儲器控制器、時鐘和電源管理等模塊。其中,存儲器控制器為訪問外部存儲提供必要的存儲控器控制信號;NAND Flash控制器為外掛的NAND Flash存儲器提供控制信號,而NANDFlash控制器由于其價格經濟,用于執(zhí)行引導程序;時鐘和電源管理模塊由時鐘控制、USB控制和電源控制3部分模塊組成,時鐘控制模塊用于產生必要的時鐘信號,電源管理模塊用于提供電源管理方案,保證對給定任務的最佳功耗;USB主控制器支持2個端口的USB主機接口,支持低速及全速USB設備,在本系統(tǒng)中用于連接USB攝像頭;MMC/SD/SDIO控制器為外接SD卡提供控制和數據信號,使視頻數據的存儲變得可能。
1.2 系統(tǒng)原理
NAND Flasht大小為256 MB,用于存儲文件系統(tǒng),執(zhí)行必要的引導程序。SDRAM為64 MB內存??紤]行車過程的震動環(huán)境,視頻存儲設備采用能夠牢靠固定的SD卡。除了穩(wěn)固的優(yōu)點外,SD卡還有價格便宜、方便拔插的優(yōu)點。要實現行車視頻的錄制存儲,首先需要采集視頻數據??紤]到嵌入式存儲器的資源相對有限,本設計使用中星微電子公司ZC301芯片的攝像頭,此類攝像頭的視頻數據經過攝像頭內部專用DSP芯片處理過,輸出的信號是JPEG格式的。移植Linux系統(tǒng)后,利用Linux下視頻采集和輸出驅動的內核接口V4L2對視頻進行采集,然后對采集到的視頻數據按照avi標準格式進行封裝,添加必要的幀頭信息后,將其一幀一幀存入插在SD卡座上的SD卡內,采用特定方法對視頻文件進行管理,實現視頻的循環(huán)存儲,以節(jié)約存儲空間。將采集存儲到SD卡的視頻文件拷貝到任意的帶視頻播放器的平臺上,即可查看錄制的視頻信息。
由于ZC301攝像頭輸出的每幀是JPEG格式數據,因而存儲的avi視頻文件是MJPEG壓縮,其中,每一幀圖像都分別使用JPEG編碼。MJPEG視頻壓縮僅采用幀內壓縮,不需要過多的運算能力,無需為視頻壓縮浪費大量的計算效率,適合用于嵌入式設備中。雖然其壓縮率不是很高,造成視頻文件尺寸較大,但是由于該行車視頻錄制系統(tǒng)只需保存事故發(fā)生前一段時間內的現場視頻,綜合考慮MJPEG壓縮可以滿足要求。
2 嵌入式環(huán)境搭建
要在嵌入式平臺實現系統(tǒng)功能,需要通過主機構建基本的軟件系統(tǒng),并燒寫到設備中。采用交叉開發(fā)模式以適應嵌入式設備的資源不足。首先,在主機編譯Bootloader,將編譯出的鏡像文件燒入設備;然后在主機編譯嵌入式Linux內核,通過Bootloader燒入板子;最后,在主機上編譯實現相關功能的應用程序,通過NFS運行,經過驗證成功后再燒入板子,過程如圖2所示。該部分內容不作詳細闡述,具體的搭建過程可參考相應的資料。
3 軟件設計
系統(tǒng)的軟件設計主要包括視頻圖像的采集、使用特定方法實現視頻數據的循環(huán)存儲,其中重點在于,按照avi格式將采集的數據進行封裝,并且實現視頻文件循環(huán)存儲。
3.1 avi文件格式
avi(audio video interleaved)格式即音頻視頻交錯格式,1992年由Microsoft公司推出。所謂“音頻視頻交錯”,就是可以將視頻格式和音頻格式交織在一起進行同步播放。
RIFF文件使用4字符碼FOURCC(Four—Character Code)來表示數據類型,例如“RIFF”表示這是一個RIFF文件,“AVI”表示文件的具體類型,“LIST”表示用列表的形式來組織數據。其結構如圖3所示。作為一種多媒體文件的存儲方式,不同編碼的音頻、視頻文件,都可以按照RIFF定義的存儲規(guī)則保存、記錄各自不同的數據,如數據內容、采集信息、顯示尺寸、編碼方式等。播放器播放這些文件時,會根據RIFF的規(guī)則分析文件,正確解析出音視頻信息進行播放。
avi文件是目前使用的最復雜的RIFF文件,它包含信息塊、數據塊和索引塊3個子塊,每個子塊都按照RIFF文件結構來填充各字段。其總體結構如圖4所示。
avi文件有兩種基本的數據結構CHUNK和LIST,其形式如圖5所示。
其中,信息塊是一個以“hdrl”為標識的LIST塊,定義avi文件的數據格式;數據塊是一個以“movi”為標識的LIST塊,它保存真正的音視頻數據;索引塊是一個以“idxl”為標識的LIST塊,為avi文件中的媒體數據塊進行索引,不是必需的。詳細的avi文件格式見參考文獻。
3.2 視頻采集
嵌入式Linux下視頻采集的實現使用Linux視頻驅動接口V4L2。它的操作流程如下:打開視頻設備、設置視頻設備屬性和采集方式、處理視頻數據、關閉視頻設備。把視頻設備當作普通文件來打開關閉,并進行數據的讀寫。視頻設備屬性的設置是通過ioctl函數來進行的,V4L2
驅動接口包含很多控制命令,對視頻采集進行控制。
3.3 視頻循環(huán)錄制的實現
視頻的循環(huán)存儲是很有必要的。一方面,因本系統(tǒng)特點,對于事故前很長時間的視頻信息沒有保存下來的必要,因而可以在保存必要視頻信息的前提下,當SD卡存儲滿的時候對最先錄制的視頻進行覆蓋,以充分利用存儲空間。
循環(huán)錄制可以只在單個文件中進行,參考文獻采用此方法。該方法通過修改位置指針,對存儲幀數和預定義的最大幀常量進行判斷,以實現循環(huán)存儲。該方法實現較為繁瑣,而且由于采用avi文件存儲,其單個文件最大只有2G,保存的視頻數據有限。本系統(tǒng)采用多個文件循環(huán)存儲的方法。每次錄制以開始錄制的時間作為avi的文件名,格式為“年月日-時分秒”形式,這樣便于以后查閱檢索。
3.3.1 循環(huán)存儲原理
循環(huán)存儲的原理簡單直觀,首先創(chuàng)建一個avi文件對視頻數據進行錄制,當錄制到文件預定義大小時,新建一個avi文件繼續(xù)存儲。如此一直下去,直到SD卡存儲已滿。當系統(tǒng)檢測到SD卡剩余容量小于預定義的閾值時,則查找最先錄制的avi文件并刪除,這樣便有空閑容量繼續(xù)存儲視頻,如此往復便可實現視頻的循環(huán)錄制。
3.3.2 循環(huán)存儲方法
根據上面的循環(huán)存儲原理,按照avi視頻循環(huán)存儲流程可以清楚地實現循環(huán)存儲,如圖6所示。
系統(tǒng)初始化主要是對視頻采集的初始化,設定采集視頻的相關信息,通過init_videoIn()函數將參數傳入相應的結構體,主要代碼如下;
接著創(chuàng)建一個avi文件,以當前日期加時間作為文件名,這樣便于將來對視頻文件查詢檢索。然后就進入程序大循環(huán),對SD卡剩余容量判斷,可以保證即使更換不同容量的SD卡也能充分利用存儲空間。對于SD卡剩余容量小于預定義的RESTSIZE情況,則說明SD卡剩余容量不足,這樣就需要刪除最早保存的視頻文件。為了獲取SD卡目錄里的文件信息,使用了dirent結構體,查找SD卡里最早保存的avi文件是關鍵,其核心代碼如下:
找到最早創(chuàng)建的avi文件后,刪除它即獲得足夠的容量保存新的視頻。對于SD卡剩余容量足夠的情況,直接往avi文件寫入一幀視頻,這也是本設計的一個重點,在下一節(jié)介紹。若寫入視頻數據失敗,直接跳出大循環(huán),系統(tǒng)結束工作。否則,使用stat()函數對當前視頻文件大小進行判斷,看該avi文件是否達到預定大小。若是,則要新建一個avi文件以保證SD卡的每個avi文件大小固定且存儲多個avi文件;不是,則avi文件還未達到預定大小,繼續(xù)往avi文件寫入一幀視頻數據。如此往復,即實現視頻的循環(huán)存儲功能。
3.3.3 寫一幀avi視頻數據
向SD卡中創(chuàng)建的avi文件寫入一幀視頻,就是按照3.1節(jié)介紹的avi文件的格式,把從攝像頭采集到的一幀圖像保存到相應位置,同時填寫必要的avi文件頭信息。
打開以日期時間命名的avi文件后,設置視頻相關信息,主要是視頻壓縮方式、視頻幀大小和幀率等,然后便是填充avi文件的頭信息。avi文件的頭信息是其區(qū)別于其他視頻文件一個重要標志,根據參考文獻,頭部信息主要包括2個LIST基本結構,第一個“hdrl”LIST嵌套一個“strl”LIST,其中“hdrl”是主avi信息頭數據,“strl”LIST是流的頭信息數據(strl可以有多個,對應多個流),它們用于保存視頻流的詳細信息。每個“strl”至少包含一個“strh”塊(用于說明該流的頭信息)和一個“strf”塊(說明該流是視頻流還是音頻流)。第二個LIST是“movi”列表,它用來保存真正的視頻音頻流數據,它以4字符碼“00db”(非壓縮視頻流)或“00wb”(非壓縮音頻流)等開始作為標記,接下來存儲流數據。“movi”列表后是avi文件的索引塊,這部分是可選的,主要是為avi文件每個數據塊進行索引。填寫完avi文件頭部信息后,即可將采集的視頻數據保存下來。
寫一幀視頻數據時,首先將寫指針指向avi文件頭的尾部,接著調用一個write_avi_data(avi_t*AVI,char*data,unsigned long length)函數,將length長度的由指針data指向的數據寫入到avi指向的文件。在寫真正的流媒體數據之前,先寫入4字符碼“00db”指示要寫的是視頻數據,然后是要寫入的一幀數據的長度字段,最后寫入一幀視頻數據。
一個avi文件只有一個頭部信息,即填充完avi文件頭部信息后,便不斷地向文件寫入一幀視頻數據,直到文件大小達到預定大小時,按照循環(huán)存儲規(guī)則新建avi文件。
4 系統(tǒng)功能測試
用Linux C實現了視頻采集功能、循環(huán)存儲功能,將交叉編譯成功后的應用程序下載到板子的根文件系統(tǒng)。自動掛載SD卡后執(zhí)行應用程序,功能實現正常,連續(xù)長時間運行能夠實現視頻的循環(huán)錄制。取下SD卡,把視頻復制到計算機上使用視頻播放器播放,視頻清晰流暢。
結語
本文用嵌入式Linux實現了行車視頻錄制的功能。詳細介紹了視頻循環(huán)存儲的實現和視頻文件的保存。作為獨立的功能部件,本系統(tǒng)可以方便地安裝到汽車上。經過軟硬件聯合測試,系統(tǒng)工作穩(wěn)定可靠,有一定的實用價值。
評論