摘要:本文以行车视频录制为布景,规划了以三星公司ARM9芯片S3C2440作为主控芯片,可移植开源的Linux体系。在对体系硬件结构、体系原理和环境建立描绘后,要点介绍了视频循环录制功用和将视频保存成跨渠道通用的avi文件的进程。测验结果表明此计划可行。
要害词:avi视频;循环存储;嵌入式体系;Linux
导言
视频收集体系以其直观的视频印象数据,对现场场景进行记载,现在已经在各行各业得到广泛应用。关于特定运用场合,如轿车跋涉进程,因为其环境的不确定性和多样性,以及事端的突发性和偶然性,要求收集体系能够安稳、接连地实时记载事发进程。行车进程事端产生时,需求把握的事端原因往往在事端产生前短短的一段时刻内。因此,辨明事端责任和剖析事端原因所需求的视频信息,往往是在事端时刻点之前的一小段时刻内。
日常日子中常见的交通胶葛,往往是因为没有直接依据形成取证困难。基于此,结合嵌入式体系低功耗、低成本等长处,本文运用嵌入式Linux体系完成行车视频存储,存储的视频可认为交通胶葛的调停以及交通事端确定,供给现场录像依据。
1 体系概述
1.1 体系硬件结构
体系硬件结构如图1所示。主操控芯片为三星的ARM9芯片S3C2440,它内部含有MMC/SD/SDIO操控器、NAND Flash操控器、USB主操控器、存储器操控器、时钟和电源办理等模块。其间,存储器操控器为拜访外部存储供给必要的存储控器操控信号;NAND Flash操控器为外挂的NAND Flash存储器供给操控信号,而NANDFlash操控器因为其价格经济,用于履行引导程序;时钟和电源办理模块由时钟操控、USB操控和电源操控3部分模块组成,时钟操控模块用于产生必要的时钟信号,电源办理模块用于供给电源办理计划,确保对给定使命的最佳功耗;USB主操控器支撑2个端口的USB主机接口,支撑低速及全速USB设备,在本体系顶用于衔接USB摄像头;MMC/SD/SDIO操控器为外接SD卡供给操控和数据信号,使视频数据的存储变得或许。
1.2 体系原理
NAND Flasht巨细为256 MB,用于存储文件体系,履行必要的引导程序。SDRAM为64 MB内存。考虑行车进程的轰动环境,视频存储设备选用能够牢靠固定的SD卡。除了安定的长处外,SD卡还有价格便宜、便利拔插的长处。要完成行车视频的录制存储,首要需求收集视频数据。考虑到嵌入式存储器的资源相对有限,本规划运用中星微电子公司ZC301芯片的摄像头,此类摄像头的视频数据通过摄像头内部专用DSP芯片处理过,输出的信号是JPEG格局的。移植Linux体系后,运用Linux下视频收集和输出驱动的内核接口V4L2对视频进行收集,然后对收集到的视频数据依照avi规范格局进行封装,增加必要的帧头信息后,将其一帧一帧存入插在SD卡座上的SD卡内,选用特定办法对视频文件进行办理,完成视频的循环存储,以节省存储空间。将收集存储到SD卡的视频文件拷贝到恣意的带视频播映器的渠道上,即可检查录制的视频信息。
因为ZC301摄像头输出的每帧是JPEG格局数据,因此存储的avi视频文件是MJPEG紧缩,其间,每一帧图画都别离运用JPEG编码。MJPEG视频紧缩仅选用帧内紧缩,不需求过多的运算才能,无需为视频紧缩糟蹋许多的核算功率,合适用于嵌入式设备中。尽管其紧缩率不是很高,形成视频文件尺度较大,可是因为该行车视频录制体系只需保存事端产生前一段时刻内的现场视频,归纳考虑MJPEG紧缩能够满足要求。
2 嵌入式环境建立
要在嵌入式渠道完成体系功用,需求通过主机构建根本的软件体系,并烧写到设备中。选用穿插开发办法以习惯嵌入式设备的资源缺乏。首要,在主机编译Bootloader,将编译出的镜像文件烧入设备;然后在主机编译嵌入式Linux内核,通过Bootloader烧入板子;最终,在主机上编译完成相关功用的应用程序,通过NFS运转,通过验证成功后再烧入板子,进程如图2所示。该部分内容不作具体论述,具体的建立进程可参阅相应的材料。
3 软件规划
体系的软件规划首要包括视频图画的收集、运用特定办法完成视频数据的循环存储,其间要点在于,依照avi格局将收集的数据进行封装,并且完成视频文件循环存储。
3.1 avi文件格局
avi(audio video interleaved)格局即音频视频交错格局,1992年由Microsoft公司推出。所谓“音频视频交错”,就是能够将视频格局和音频格局交错在一起进行同步播映。
RIFF文件运用4字符码FOURCC(Four—Character Code)来表明数据类型,例如“RIFF”表明这是一个RIFF文件,“AVI”表明文件的具体类型,“LIST”表明用列表的办法来安排数据。其结构如图3所示。作为一种多媒体文件的存储办法,不同编码的音频、视频文件,都能够依照RIFF界说的存储规矩保存、记载各自不同的数据,如数据内容、收集信息、显现尺度、编码办法等。播映器播映这些文件时,会依据RIFF的规矩剖析文件,正确解分出音视频信息进行播映。
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 视频循环录制的完成
视频的循环存储是很有必要的。一方面,因本体系特色,关于事端前很长时刻的视频信息没有保存下来的必要,因此能够在保存必要视频信息的前提下,当SD卡存储满的时分对最早录制的视频进行掩盖,以充分运用存储空间。
循环录制能够只在单个文件中进行,参阅文献选用此办法。该办法通过修正方位指针,对存储帧数和预界说的最大帧常量进行判别,以完成循环存储。该办法完成较为繁琐,并且因为选用avi文件存储,其单个文件最大只要2G,保存的视频数据有限。本体系选用多个文件循环存储的办法。每次录制以开端录制的时刻作为avi的文件名,格局为“年月日-时分秒”办法,这样便于今后查阅检索。
3.3.1 循环存储原理
循环存储的原理简略直观,首要创立一个avi文件对视频数据进行录制,当录制到文件预界说巨细时,新建一个avi文件持续存储。如此一向下去,直到SD卡存储已满。当体系检测到SD卡剩下容量小于预界说的阈值时,则查找最早录制的avi文件并删去,这样便有闲暇容量持续存储视频,如此往复便可完成视频的循环录制。
3.3.2 循环存储办法
依据上面的循环存储原理,依照avi视频循环存储流程能够清楚地完成循环存储,如图6所示。
体系初始化首要是对视频收集的初始化,设定收集视频的相关信息,通过init_videoIn()函数将参数传入相应的结构体,首要代码如下;
接着创立一个avi文件,以当时日期加时刻作为文件名,这样便于将来对视频文件查询检索。然后就进入程序大循环,对SD卡剩下容量判别,能够确保即便替换不同容量的SD卡也能充分运用存储空间。关于SD卡剩下容量小于预界说的RESTSIZE状况,则阐明SD卡剩下容量缺乏,这样就需求删去最早保存的视频文件。为了获取SD卡目录里的文件信息,运用了dirent结构体,查找SD卡里最早保存的avi文件是要害,其间心代码如下:
找到最早创立的avi文件后,删去它即取得满足的容量保存新的视频。关于SD卡剩下容量满足的状况,直接往avi文件写入一帧视频,这也是本规划的一个要点,鄙人一节介绍。若写入视频数据失利,直接跳出大循环,体系完毕作业。不然,运用stat()函数对当时视频文件巨细进行判别,看该avi文件是否到达预订巨细。若是,则要新建一个avi文件以确保SD卡的每个avi文件巨细固定且存储多个avi文件;不是,则avi文件还未到达预订巨细,持续往avi文件写入一帧视频数据。如此往复,即完成视频的循环存储功用。
3.3.3 写一帧avi视频数据
向SD卡中创立的avi文件写入一帧视频,就是依照3.1节介绍的avi文件的格局,把从摄像头收集到的一帧图画保存到相应方位,一起填写必要的avi文件头信息。
翻开以日期时刻命名的avi文件后,设置视频相关信息,首要是视频紧缩办法、视频帧巨细和帧率等,然后就是填充avi文件的头信息。avi文件的头信息是其差异于其他视频文件一个重要标志,依据参阅文献,头部信息首要包括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文件头部信息后,便不断地向文件写入一帧视频数据,直到文件巨细到达预订巨细时,依照循环存储规矩新建avi文件。
4 体系功用测验
用Linux C完成了视频收集功用、循环存储功用,将穿插编译成功后的应用程序下载到板子的根文件体系。主动挂载SD卡后履行应用程序,功用完成正常,接连长时刻运转能够完成视频的循环录制。取下SD卡,把视频复制到核算机上运用视频播映器播映,视频明晰流通。
结语
本文用嵌入式Linux完成了行车视频录制的功用。具体介绍了视频循环存储的完成和视频文件的保存。作为独立的功用部件,本体系能够便利地安装到轿车上。通过软硬件联合测验,体系作业安稳牢靠,有必定的实用价值。