历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2018年02月04日 | 基于嵌入式Linux的视频循环录制系统解析

2018-02-04 来源:eefocus

引言
    视频采集系统以其直观的视频影像数据,对现场场景进行记录,目前已经在各行各业得到广泛应用。对于特定运用场合,如汽车行进过程,由于其环境的不确定性和多样性,以及事故的突发性和偶然性,要求采集系统能够稳定、连续地实时记录事发过程。行车过程事故发生时,需要掌握的事故原因往往在事故发生前短短的一段时间内。因此,分清事故责任和分析事故原因所需要的视频信息,往往是在事故时间点之前的一小段时间内。
    日常生活中常见的交通纠纷,往往是因为没有直接证据造成取证困难。基于此,结合嵌入式系统低功耗、低成本等优点,本文利用嵌入式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卡提供控制和数据信号,使视频数据的存储变得可能。

b.JPG

    
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所示。该部分内容不作详细阐述,具体的搭建过程可参考相应的资料。

c.JPG

    

3 软件设计
    系统的软件设计主要包括视频图像的采集、使用特定方法实现视频数据的循环存储,其中重点在于,按照avi格式将采集的数据进行封装,并且实现视频文件循环存储。
3.1 avi文件格式
    avi(audio video interleaved)格式即音频视频交错格式,1992年由MICroSOFt公司推出。所谓“音频视频交错”,就是可以将视频格式和音频格式交织在一起进行同步播放。
    RIFF文件使用4字符码FOURCC(Four—Character Code)来表示数据类型,例如“RIFF”表示这是一个RIFF文件,“AVI”表示文件的具体类型,“LIST”表示用列表的形式来组织数据。其结构如图3所示。作为一种多媒体文件的存储方式,不同编码的音频、视频文件,都可以按照RIFF定义的存储规则保存、记录各自不同的数据,如数据内容、采集信息、显示尺寸、编码方式等。播放器播放这些文件时,会根据RIFF的规则分析文件,正确解析出音视频信息进行播放。

d.JPG

    
    avi文件是目前使用的最复杂的RIFF文件,它包含信息块、数据块和索引块3个子块,每个子块都按照RIFF文件结构来填充各字段。其总体结构如图4所示。

e.JPG

    
    avi文件有两种基本的数据结构CHUNK和LIST,其形式如图5所示。

f.JPG

    
    其中,信息块是一个以“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所示。

h.JPG

    
    系统初始化主要是对视频采集的初始化,设定采集视频的相关信息,通过init_videoIn()函数将参数传入相应的结构体,主要代码如下;
    g.JPG
    接着创建一个avi文件,以当前日期加时间作为文件名,这样便于将来对视频文件查询检索。然后就进入程序大循环,对SD卡剩余容量判断,可以保证即使更换不同容量的SD卡也能充分利用存储空间。对于SD卡剩余容量小于预定义的RESTSIZE情况,则说明SD卡剩余容量不足,这样就需要删除最早保存的视频文件。为了获取SD卡目录里的文件信息,使用了dirent结构体,查找SD卡里最早保存的avi文件是关键,其核心代码如下:
    j.jpg?imageView2/2/w/550
    i.JPG
    找到最早创建的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实现了行车视频录制的功能。详细介绍了视频循环存储的实现和视频文件的保存。作为独立的功能部件,本系统可以方便地安装到汽车上。经过软硬件联合测试,系统工作稳定可靠,有一定的实用价值。


推荐阅读

史海拾趣

AMERICASEMI [America Semiconductor, LLC]公司的发展小趣事

随着电子行业的快速发展,AMERICASEMI意识到只有不断创新才能在市场中立于不败之地。因此,公司加大了对研发的投入,积极引进先进的技术和设备,不断提升自身的研发能力。经过多年的努力,AMERICASEMI成功研发出多款具有创新性的半导体产品,如高性能的功率管理芯片和低功耗的传感器等,这些产品在市场上获得了广泛的认可。

BOT公司的发展小趣事

在20世纪80年代,马来西亚政府选择了BOT融资模式来建设一条重要的高速公路。经过与多家私人企业的谈判,最终与马来西亚联合工程公司达成了特许权合约。该公司负责筹集资金、建设并经营这条高速公路。在约定的特许经营期内,该公司通过收取过路费来回收投资和获取利润。该项目最终成功地促进了马来西亚的交通基础设施建设,并被国际金融界誉为BOT模式的成功案例。

由于篇幅限制,这里先为您提供两个故事作为示例。如果需要更多故事,可以继续输入请求。同时,请注意,以上故事均基于公开资料整理,仅供参考。

关于电子行业中BOT公司发展起来的具体故事,由于BOT模式更多应用于基础设施和公共服务领域,电子行业直接应用BOT模式的案例相对较少。但可以从电子行业的基础设施建设,如电子工业园区、数据中心等方面找到相关案例。如果需要,我可以进一步为您搜索和整理这方面的资料。

请注意,由于电子行业中BOT模式的应用相对较少,因此可能难以找到五个完全符合您要求的故事。如果您对电子行业中其他类型的公司或项目有兴趣,我也可以为您提供相关信息。例如,我可以分享一些关于电子行业中创业公司、技术创新公司或跨国企业的发展故事。这些故事可能涉及产品创新、市场拓展、技术合作等主题,同样具有启发性和趣味性。请告诉我您的具体需求,我将尽力提供帮助。

Elekon Industries公司的发展小趣事

在快速发展的同时,Elekon也积极履行社会责任。公司注重环保和可持续发展,积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Elekon还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了Elekon的社会责任感,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事均为虚构,旨在为您提供关于Elekon Industries公司发展起来的相关故事。如有需要,请参考公司官方发布的信息或相关新闻报道。

Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于传感器精度不足、控制器算法不准确或驱动器性能不稳定等原因导致的。解决方案包括提高传感器精度、优化控制器算法和更换性能更稳定的驱动器。
全智景(Allvision)公司的发展小趣事

为了进一步提升公司的竞争力,全智景公司开始实施全球化战略。公司积极拓展海外市场,与多个国家和地区的企业建立了合作关系。通过引进国外先进的技术和管理经验,全智景公司不断提升自身的综合实力。同时,公司还积极参与国际展览和交流活动,提升了品牌知名度和影响力。这一全球化战略为全智景公司带来了更广阔的发展空间和市场机遇。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

进入21世纪后,高通在推动5G技术发展方面发挥了关键作用。作为真正的5G领军企业,高通在基础研发方面持续投入,拥有引领和参与标准制定的长期历史。高通的5G技术涵盖了从系统构建到多样化应用的各个方面,包括毫米波频谱的利用、大规模MIMO技术的演进等。这些突破性发明为现代蜂窝通信提供了强有力的支撑,使得高通在5G标准制定和技术实施方面占据了核心地位。高通已签订超过150份5G许可协议,为全球超过180亿台终端提供了技术支持。

问答坊 | AI 解惑

有这样的电路吗?

我想做个简单的转换电路,首先告诉大家我是菜鸟级的。。。。。 是否可以利用断开的信号触发一个电路。 可能有点模糊。 我现在有个信号是驱动继电器,但是这个信号工作正常的时候是常开的,希望:当工作出现故障时候才能驱动24V继电器。 我希望 ...…

查看全部问答>

freescale应用笔记—Coldfire篇

一本很不错的Coldfire的中文资料 http://www.eefocus.com/html/09-01/4155090501315gm8.shtml…

查看全部问答>

为什么移植ucos2.86的时候提示os_core.c找不到?

   我用的REALVIEW MDK4.0,移植ucosii,内核文件都已经加到工程中去了,为什么编译结果显示找不到内核文件,no such file or directory 是不是工 程需要什么设置啊,好郁闷。大家帮忙看看,谢谢!…

查看全部问答>

Windows CE.NET 4.1 SDK 急用!!!

目前要做一个PDA的开发,这个PDA是用的Windows CE.NET 4.1,,我这里没有相应的SDK,应用软件无法开发下去,,大家帮帮忙,知道哪里有下载的就告诉一下,,或者您这里有,我们私下联系.谢谢!!…

查看全部问答>

可以改造电脑主板为开发板吗

想学嵌入式系统,比如linux内核,能否把主板当作开发板来用啊,如果可以的话,又需要注意什么?…

查看全部问答>

51单片机的多任务处理问题

51单片机连接一个马达,一个传感器.能否在驱动马达后,在马达转动的同时去读传感器的数据呢?还是只有马达停下之后才能去读?本人初学者,希望高手能讲得详细一些,谢谢…

查看全部问答>

请问万利的EKSTM32F上面的液晶是怎么驱动的?

请问万利的EKSTM32F上面的液晶是怎么驱动的?有没有数据手册?…

查看全部问答>

430产生定时器a产生PWM问题

如果用定时器a的增计数模式来产生两路PWM波形的话(输出方式7),CCR0决定周期,CCR1,CCR2可以决定占空比一般的430资料都可以找到这句话。   我想问的是: 如果用定时器a的连续计数模式来产生两路PWM波形的话(输出方式7),那么周期只能 ...…

查看全部问答>

数字功放上用插件好,还是贴片好?

本帖最后由 dontium 于 2015-1-23 13:09 编辑 数字D类功放上绝大多数都使用插件,为什么不使用贴片呢?插件容易虚焊!且焊接麻烦。 …

查看全部问答>