序言
视频采集系统以其直观的视频影像数据,对现场场景进行记录,目前早已在各行各业得到广泛应用。对于特定运用场合,如车辆行进过程,因为其环境的不确定性和多样性,以及车祸的突发性和碰巧性,要求采集系统才能稳定、连续地实时记录事发过程。行车过程车祸发生时,须要把握的车祸缘由常常在车祸发生前短短的一段时间内。为此,分清车祸责任和剖析车祸诱因所须要的视频信息,常常是在车祸时间点之前的一小段时间内。
日常生活中常见的交通纠纷,常常是由于没有直接证据导致取证困难。基于此,结合嵌入式系统低帧率、低成本等优点,本文借助嵌入式Linux系统实现行车视频储存,储存的视频可以为交通纠纷的调处以及交通车祸认定,提供现场录象证据。
1系统概述
1.1系统硬件结构
系统硬件结构如图1所示。主控制芯片为三星的ARM9芯片S3C2440,它内部富含MMC/SD/SDIO控制器、NANDFlash控制器、USB主控制器、存储器控制器、时钟和电源管理等模块。其中,储存器控制器为访问外部储存提供必要的储存控器控制讯号;NANDFlash控制器为外挂的NANDFlash储存器提供控制讯号,而NANDFlash控制器因为其价钱经济,用于执行引导程序;时钟和电源管理模块由时钟控制、USB控制和电源控制3部份模块组成,时钟控制模块用于形成必要的时钟讯号,电源管理模块用于提供电源管理方案,保证对给定任务的最佳帧率;USB主控制器支持2个端口的USB主机插口,支持低速及全速USB设备,在本系统中用于联接USB摄像头;MMC/SD/SDIO控制器为外接SD卡提供控制和数据讯号,使视频数据的储存显得可能。
1.2系统原理
NANDFlasht大小为256MB,用于储存文件系统,执行必要的引导程序。SDRAM为64MB显存。考虑行车过程的振动环境,视频储存设备采用才能牢固固定的SD卡。不仅稳固的优点外,SD卡还有价钱实惠、方便插拔的优点。要实现行车视频的录制储存,首先须要采集视频数据。考虑到嵌入式储存器的资源相对有限,本设计使用中星微电子公司ZC301芯片的摄像头,这种摄像头的视频数据经过摄像头内部专用DSP芯片处理过,输出的讯号是JPEG格式的。移植Linux系统后,借助Linux下视频采集和输出驱动的内核插口V4L2对视频进行采集,之后对采集到的视频数据根据avi标准格式进行封装,添加必要的帧头信息后linux删除命令,将其三帧一帧存入插在SD卡座上的SD卡里,采用特定方式对视频文件进行管理,实现视频的循环储存,以节省储存空间。将采集储存到SD卡的视频文件拷贝到任意的带视频播放器的平台上,即可查看录制的视频信息。
因为ZC301摄像头输出的每帧是JPEG格式数据,因此储存的avi视频文件是MJPEG压缩,其中,每一帧图象都分别使用JPEG编码。MJPEG视频压缩仅采用帧内压缩,不须要过多的运算能力,无需为视频压缩浪费大量的估算效率,适宜用于嵌入式设备中。即使其压缩率不是很高,导致视频文件规格较大,而且因为该行车视频录制系统只需保存车祸发生前一段时间内的现场视频,综合考虑MJPEG压缩可以满足要求。
2嵌入式环境搭建
要在嵌入式平台实现系统功能,须要通过主机建立基本的软件系统,并烧讲到设备中。采用交叉开发模式以适应嵌入式设备的资源不足。首先,在主机编译Bootloader,将编译出的镜像文件烧入设备;之后在主机编译嵌入式Linux内核,通过Bootloader烧入板子;最后,在主机上编译实现相关功能的应用程序linux 视频采集 软件,通过NFS运行,经过验证成功后再烧入板子,过程如图2所示。该部份内容不作详尽论述,具体的搭建过程可参考相应的资料。
3软件设计
系统的软件设计主要包括视频图象的采集、使用特定方式实现视频数据的循环储存,其中重点在于,依照avi格式将采集的数据进行封装,但是实现视频文件循环储存。
3.1avi文件格式
avi(audiovideointerleaved)格式即音频视频交错格式,1992年由MICroSOFt公司推出。所谓“音频视频交错”linux 视频采集 软件,就是可以将视频格式和音频格式交织在一起进行同步播放。
RIFF文件使用4字符码FOURCC(Four—CharacterCode)来表示数据类型,比如“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卡剩余容量不足ubuntu linux,这样就须要删掉最早保存的视频文件。为了获取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,unsignedlonglength)函数,将length宽度的由表针data指向的数据写入到avi指向的文件。在写真正的流媒体数据之前,先写入4字符码“00db”指示要写的是视频数据,之后是要写入的一帧数据的宽度数组,最后写入一帧视频数据。
一个avi文件只有一个背部信息,即填充完avi文件背部信息后,便不断地向文件写入一帧视频数据,直至文件大小达到预定大小时,根据循环储存规则新建avi文件。
4系统功能测试
用LinuxC实现了视频采集功能、循环储存功能,将交叉编译成功后的应用程序下载到板子的根文件系统。手动挂载SD卡后执行应用程序,功能实现正常,连续长时间运行才能实现视频的循环录制。取下SD卡,把视频复制到计算机上使用视频播放器播放,视频清晰流畅。
结语
本文用嵌入式Linux实现了行车视频录制的功能。详尽介绍了视频循环储存的实现和视频文件的保存。作为独立的功能部件,本系统可以便捷地安装到车辆上。经过软硬件联合测试,系统工作稳定可靠,有一定的实用价值。