<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux的視頻循環(huán)錄制系統

基于嵌入式Linux的視頻循環(huán)錄制系統

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:本文以行車(chē)視頻錄制為背景,設計了以三星公司ARM9芯片S3C2440作為主控芯片,可移植開(kāi)源的系統。在對系統硬件結構、系統原理和環(huán)境搭建描述后,重點(diǎn)介紹了視頻循環(huán)錄制功能和將視頻保存成跨平臺通用的avi文件的過(guò)程。測試結果表明此方案可行。
關(guān)鍵詞:;;;

引言
視頻采集系統以其直觀(guān)的視頻影像數據,對現場(chǎng)場(chǎng)景進(jìn)行記錄,目前已經(jīng)在各行各業(yè)得到廣泛應用。對于特定運用場(chǎng)合,如汽車(chē)行進(jìn)過(guò)程,由于其環(huán)境的不確定性和多樣性,以及事故的突發(fā)性和偶然性,要求采集系統能夠穩定、連續地實(shí)時(shí)記錄事發(fā)過(guò)程。行車(chē)過(guò)程事故發(fā)生時(shí),需要掌握的事故原因往往在事故發(fā)生前短短的一段時(shí)間內。因此,分清事故責任和分析事故原因所需要的視頻信息,往往是在事故時(shí)間點(diǎn)之前的一小段時(shí)間內。
日常生活中常見(jiàn)的交通糾紛,往往是因為沒(méi)有直接證據造成取證困難?;诖?,結合低功耗、低成本等優(yōu)點(diǎn),本文利用嵌入式系統實(shí)現行車(chē)視頻存儲,存儲的視頻可以為交通糾紛的調解以及交通事故認定,提供現場(chǎng)錄像證據。

1 系統概述
1.1 系統硬件結構
系統硬件結構如圖1所示。主控制芯片為三星的ARM9芯片S3C2440,它內部含有MMC/SD/SDIO控制器、NAND Flash控制器、USB主控制器、存儲器控制器、時(shí)鐘和電源管理等模塊。其中,存儲器控制器為訪(fǎng)問(wèn)外部存儲提供必要的存儲控器控制信號;NAND Flash控制器為外掛的NAND Flash存儲器提供控制信號,而NANDFlash控制器由于其價(jià)格經(jīng)濟,用于執行引導程序;時(shí)鐘和電源管理模塊由時(shí)鐘控制、USB控制和電源控制3部分模塊組成,時(shí)鐘控制模塊用于產(chǎn)生必要的時(shí)鐘信號,電源管理模塊用于提供電源管理方案,保證對給定任務(wù)的最佳功耗;USB主控制器支持2個(gè)端口的USB主機接口,支持低速及全速USB設備,在本系統中用于連接USB攝像頭;MMC/SD/SDIO控制器為外接SD卡提供控制和數據信號,使視頻數據的存儲變得可能。

本文引用地址:http://dyxdggzs.com/article/201610/305965.htm

b.JPG


1.2 系統原理
NAND Flasht大小為256 MB,用于存儲文件系統,執行必要的引導程序。SDRAM為64 MB內存??紤]行車(chē)過(guò)程的震動(dòng)環(huán)境,視頻存儲設備采用能夠牢靠固定的SD卡。除了穩固的優(yōu)點(diǎn)外,SD卡還有價(jià)格便宜、方便拔插的優(yōu)點(diǎn)。要實(shí)現行車(chē)視頻的錄制存儲,首先需要采集視頻數據??紤]到嵌入式存儲器的資源相對有限,本設計使用中星微電子公司ZC301芯片的攝像頭,此類(lèi)攝像頭的視頻數據經(jīng)過(guò)攝像頭內部專(zhuān)用DSP芯片處理過(guò),輸出的信號是JPEG格式的。移植Linux系統后,利用Linux下視頻采集和輸出驅動(dòng)的內核接口V4L2對視頻進(jìn)行采集,然后對采集到的視頻數據按照avi標準格式進(jìn)行封裝,添加必要的幀頭信息后,將其一幀一幀存入插在SD卡座上的SD卡內,采用特定方法對視頻文件進(jìn)行管理,實(shí)現視頻的,以節約存儲空間。將采集存儲到SD卡的視頻文件拷貝到任意的帶視頻播放器的平臺上,即可查看錄制的視頻信息。
由于ZC301攝像頭輸出的每幀是JPEG格式數據,因而存儲的文件是MJPEG壓縮,其中,每一幀圖像都分別使用JPEG編碼。MJPEG視頻壓縮僅采用幀內壓縮,不需要過(guò)多的運算能力,無(wú)需為視頻壓縮浪費大量的計算效率,適合用于嵌入式設備中。雖然其壓縮率不是很高,造成視頻文件尺寸較大,但是由于該行車(chē)視頻錄制系統只需保存事故發(fā)生前一段時(shí)間內的現場(chǎng)視頻,綜合考慮MJPEG壓縮可以滿(mǎn)足要求。

2 嵌入式環(huán)境搭建
要在嵌入式平臺實(shí)現系統功能,需要通過(guò)主機構建基本的軟件系統,并燒寫(xiě)到設備中。采用交叉開(kāi)發(fā)模式以適應嵌入式設備的資源不足。首先,在主機編譯Bootloader,將編譯出的鏡像文件燒入設備;然后在主機編譯嵌入式Linux內核,通過(guò)Bootloader燒入板子;最后,在主機上編譯實(shí)現相關(guān)功能的應用程序,通過(guò)NFS運行,經(jīng)過(guò)驗證成功后再燒入板子,過(guò)程如圖2所示。該部分內容不作詳細闡述,具體的搭建過(guò)程可參考相應的資料。

c.JPG



3 軟件設計
系統的軟件設計主要包括視頻圖像的采集、使用特定方法實(shí)現視頻數據的,其中重點(diǎn)在于,按照avi格式將采集的數據進(jìn)行封裝,并且實(shí)現視頻文件循環(huán)存儲。
3.1 avi文件格式
avi(audio video interleaved)格式即音頻視頻交錯格式,1992年由Microsoft公司推出。所謂“音頻視頻交錯”,就是可以將視頻格式和音頻格式交織在一起進(jìn)行同步播放。
RIFF文件使用4字符碼FOURCC(Four—Character Code)來(lái)表示數據類(lèi)型,例如“RIFF”表示這是一個(gè)RIFF文件,“AVI”表示文件的具體類(lèi)型,“LIST”表示用列表的形式來(lái)組織數據。其結構如圖3所示。作為一種多媒體文件的存儲方式,不同編碼的音頻、視頻文件,都可以按照RIFF定義的存儲規則保存、記錄各自不同的數據,如數據內容、采集信息、顯示尺寸、編碼方式等。播放器播放這些文件時(shí),會(huì )根據RIFF的規則分析文件,正確解析出音視頻信息進(jìn)行播放。

d.JPG


avi文件是目前使用的最復雜的RIFF文件,它包含信息塊、數據塊和索引塊3個(gè)子塊,每個(gè)子塊都按照RIFF文件結構來(lái)填充各字段。其總體結構如圖4所示。

e.JPG


avi文件有兩種基本的數據結構CHUNK和LIST,其形式如圖5所示。

f.JPG


其中,信息塊是一個(gè)以“hdrl”為標識的LIST塊,定義avi文件的數據格式;數據塊是一個(gè)以“movi”為標識的LIST塊,它保存真正的音視頻數據;索引塊是一個(gè)以“idxl”為標識的LIST塊,為avi文件中的媒體數據塊進(jìn)行索引,不是必需的。詳細的avi文件格式見(jiàn)參考文獻。
3.2 視頻采集
嵌入式Linux下視頻采集的實(shí)現使用Linux視頻驅動(dòng)接口V4L2。它的操作流程如下:打開(kāi)視頻設備、設置視頻設備屬性和采集方式、處理視頻數據、關(guān)閉視頻設備。把視頻設備當作普通文件來(lái)打開(kāi)關(guān)閉,并進(jìn)行數據的讀寫(xiě)。視頻設備屬性的設置是通過(guò)ioctl函數來(lái)進(jìn)行的,V4L2
驅動(dòng)接口包含很多控制命令,對視頻采集進(jìn)行控制。
3.3 視頻循環(huán)錄制的實(shí)現
視頻的循環(huán)存儲是很有必要的。一方面,因本系統特點(diǎn),對于事故前很長(cháng)時(shí)間的視頻信息沒(méi)有保存下來(lái)的必要,因而可以在保存必要視頻信息的前提下,當SD卡存儲滿(mǎn)的時(shí)候對最先錄制的視頻進(jìn)行覆蓋,以充分利用存儲空間。
循環(huán)錄制可以只在單個(gè)文件中進(jìn)行,參考文獻采用此方法。該方法通過(guò)修改位置指針,對存儲幀數和預定義的最大幀常量進(jìn)行判斷,以實(shí)現循環(huán)存儲。該方法實(shí)現較為繁瑣,而且由于采用avi文件存儲,其單個(gè)文件最大只有2G,保存的視頻數據有限。本系統采用多個(gè)文件循環(huán)存儲的方法。每次錄制以開(kāi)始錄制的時(shí)間作為avi的文件名,格式為“年月日-時(shí)分秒”形式,這樣便于以后查閱檢索。
3.3.1 循環(huán)存儲原理
循環(huán)存儲的原理簡(jiǎn)單直觀(guān),首先創(chuàng )建一個(gè)avi文件對視頻數據進(jìn)行錄制,當錄制到文件預定義大小時(shí),新建一個(gè)avi文件繼續存儲。如此一直下去,直到SD卡存儲已滿(mǎn)。當系統檢測到SD卡剩余容量小于預定義的閾值時(shí),則查找最先錄制的avi文件并刪除,這樣便有空閑容量繼續存儲視頻,如此往復便可實(shí)現視頻的循環(huán)錄制。
3.3.2 循環(huán)存儲方法
根據上面的循環(huán)存儲原理,按照循環(huán)存儲流程可以清楚地實(shí)現循環(huán)存儲,如圖6所示。

h.JPG


系統初始化主要是對視頻采集的初始化,設定采集視頻的相關(guān)信息,通過(guò)init_videoIn()函數將參數傳入相應的結構體,主要代碼如下;
g.JPG
接著(zhù)創(chuàng )建一個(gè)avi文件,以當前日期加時(shí)間作為文件名,這樣便于將來(lái)對視頻文件查詢(xún)檢索。然后就進(jìn)入程序大循環(huán),對SD卡剩余容量判斷,可以保證即使更換不同容量的SD卡也能充分利用存儲空間。對于SD卡剩余容量小于預定義的RESTSIZE情況,則說(shuō)明SD卡剩余容量不足,這樣就需要刪除最早保存的視頻文件。為了獲取SD卡目錄里的文件信息,使用了dirent結構體,查找SD卡里最早保存的avi文件是關(guān)鍵,其核心代碼如下:
j.jpg
i.JPG
找到最早創(chuàng )建的avi文件后,刪除它即獲得足夠的容量保存新的視頻。對于SD卡剩余容量足夠的情況,直接往avi文件寫(xiě)入一幀視頻,這也是本設計的一個(gè)重點(diǎn),在下一節介紹。若寫(xiě)入視頻數據失敗,直接跳出大循環(huán),系統結束工作。否則,使用stat()函數對當前視頻文件大小進(jìn)行判斷,看該avi文件是否達到預定大小。若是,則要新建一個(gè)avi文件以保證SD卡的每個(gè)avi文件大小固定且存儲多個(gè)avi文件;不是,則avi文件還未達到預定大小,繼續往avi文件寫(xiě)入一幀視頻數據。如此往復,即實(shí)現視頻的循環(huán)存儲功能。
3.3.3 寫(xiě)一幀avi視頻數據
向SD卡中創(chuàng )建的avi文件寫(xiě)入一幀視頻,就是按照3.1節介紹的avi文件的格式,把從攝像頭采集到的一幀圖像保存到相應位置,同時(shí)填寫(xiě)必要的avi文件頭信息。
打開(kāi)以日期時(shí)間命名的avi文件后,設置視頻相關(guān)信息,主要是視頻壓縮方式、視頻幀大小和幀率等,然后便是填充avi文件的頭信息。avi文件的頭信息是其區別于其他視頻文件一個(gè)重要標志,根據參考文獻,頭部信息主要包括2個(gè)LIST基本結構,第一個(gè)“hdrl”LIST嵌套一個(gè)“strl”LIST,其中“hdrl”是主avi信息頭數據,“strl”LIST是流的頭信息數據(strl可以有多個(gè),對應多個(gè)流),它們用于保存視頻流的詳細信息。每個(gè)“strl”至少包含一個(gè)“strh”塊(用于說(shuō)明該流的頭信息)和一個(gè)“strf”塊(說(shuō)明該流是視頻流還是音頻流)。第二個(gè)LIST是“movi”列表,它用來(lái)保存真正的視頻音頻流數據,它以4字符碼“00db”(非壓縮視頻流)或“00wb”(非壓縮音頻流)等開(kāi)始作為標記,接下來(lái)存儲流數據。“movi”列表后是avi文件的索引塊,這部分是可選的,主要是為avi文件每個(gè)數據塊進(jìn)行索引。填寫(xiě)完avi文件頭部信息后,即可將采集的視頻數據保存下來(lái)。
寫(xiě)一幀視頻數據時(shí),首先將寫(xiě)指針指向avi文件頭的尾部,接著(zhù)調用一個(gè)write_avi_data(avi_t*AVI,char*data,unsigned long length)函數,將length長(cháng)度的由指針data指向的數據寫(xiě)入到avi指向的文件。在寫(xiě)真正的流媒體數據之前,先寫(xiě)入4字符碼“00db”指示要寫(xiě)的是視頻數據,然后是要寫(xiě)入的一幀數據的長(cháng)度字段,最后寫(xiě)入一幀視頻數據。
一個(gè)avi文件只有一個(gè)頭部信息,即填充完avi文件頭部信息后,便不斷地向文件寫(xiě)入一幀視頻數據,直到文件大小達到預定大小時(shí),按照循環(huán)存儲規則新建avi文件。

4 系統功能測試
用Linux C實(shí)現了視頻采集功能、循環(huán)存儲功能,將交叉編譯成功后的應用程序下載到板子的根文件系統。自動(dòng)掛載SD卡后執行應用程序,功能實(shí)現正常,連續長(cháng)時(shí)間運行能夠實(shí)現視頻的循環(huán)錄制。取下SD卡,把視頻復制到計算機上使用視頻播放器播放,視頻清晰流暢。

結語(yǔ)
本文用嵌入式Linux實(shí)現了行車(chē)視頻錄制的功能。詳細介紹了視頻循環(huán)存儲的實(shí)現和視頻文件的保存。作為獨立的功能部件,本系統可以方便地安裝到汽車(chē)上。經(jīng)過(guò)軟硬件聯(lián)合測試,系統工作穩定可靠,有一定的實(shí)用價(jià)值。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>