我是靠谱客的博主 冷静外套,最近开发中收集的这篇文章主要介绍android 行车记录仪分析,基于Android架构行车记录仪的异常掉电可播放视频方法与流程...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

4fe29272394a51e247e6e3f8c2852890.gif

本发明涉及摄录像视频技术领域,特别涉及一种基于Android架构行车记录仪的异常掉电可播放视频方法。

背景技术:

随着车联网概念的兴起和技术的积累,越来越多的智能设备被接入到车辆上。行车记录仪作为非常重要的一种车载设备形态,越来越被车主所接受。

最近几年随着智能系统的崛起,记录仪系统也由Linux向Android系统切换,形成了智能行车记录仪,录像功能必然基于Android的Camera和Stagefright架构,从摄像头获取的图像数据经过编码器压缩,码流最后通过封装形成可播放的视频格式。由于录像开始后需要实时写入,并且理论上应用并不知道录制结束时间,所以基于Android架构的行车记录仪在停止录像后才最后写入封装moov格式。

由于记录仪的供电方式主要有两种:一种是电瓶取电,优点是电压稳定,熄火后扔可以取点,但安装麻烦;另一种是点烟器或USB取电,优点是安装简单,但熄火后电压立刻断掉,记录仪直接关机。

无论哪种取电方式,在车辆出事故导致的异常断电,都可能导致断电时正在录制的视频无法播放,而断电时正在录制的视频为最重要的现场视频,可以确定事故的原因或责任。

概括来说,moov封装了次级box格式,里面有这段视频的无数据信息,即为文件重要属性的信息的非视频内容,如媒体数据全局描述,视频、音频的track属性等。如果moov的封装未完成,那么这段视频格式是不完整的,播放器也就无法正常播放。

对于记录仪从车辆电瓶取电时,由于记录仪可以取到常电,所以在熄火或者异常发生时,记录仪立刻结束这段视频并完成最后的封装,正常不会出现视频无法播放的问题。但记录仪从点烟器取电时,正常车辆熄火后,最后形成的视频来不及封装,因而无法播放视频。目前解决这个种记录仪异常断电时视频无法播放问题,采用在硬件上想办法留上一点电,如设备设计进大电容或安放小电池等,保证熄火后,预留几秒的时间来作最后的封装处理,保证视频的完整性,但其硬件成本高,更重要的是,当车辆太阳下暴晒的环境温度可达70°以上,使用电池时,电池加速老化会带来一定的安全隐患。

技术实现要素:

本发明主要解决的技术问题是提供一种基于Android架构行车记录仪的异常掉电可播放视频方法,该基于Android架构行车记录仪的异常掉电可播放视频方法可以避免异常断电时无法播放视频,同时不增加硬件成本。

为了解决上述问题,本发明提供一种基于Android架构行车记录仪的异常掉电可播放视频方法,该基于Android架构行车记录仪的异常掉电可播放视频方法,包括:

创建用于录制视频容器的安卓类对象,在安卓类对象内创建文件句柄,后开始录制;

安卓相机服务组件通过平台HAL层去调用驱动代码,驱动去访问硬件固件获取视频流,传递到多媒体编解码组件,压缩后的码流,码流被封装写录制文件的组件读取,进行MP4格式封装,当停止录像或设置结束完成的条件触发后,完成封装,形成MP4录像文件。

进一步地说,在安卓类对象内部逻辑里创建一个用于写数据流的句柄fd。

进一步地说,获取数据MediaBuffer的线程会将Video/Audio的Track数据以Sample结构写入到ChunkBuffer缓存中,并通知写文件的线程读取Chunk数据写入到文件中,两个线程同步通过循环获取保证数据的连续读出写入,当一段录制完成时,写入moov和free的box内容,其中两个线程以同步方式。

进一步地说,写入moov和free封装步骤包括,

录像文件创建后,先写文件头ftyp,定义TimeSlice间隔为2s,即2s的录制时间一到就作一次文件写入;

TimeSlice1,保证依次写入VideoChunk和AudioChunk数据,写入完成后,处理第一次WirteMoov,完成封装;

TimeSlice2,文件地址偏移到TimeSlice1写moov的位置,进行覆盖写入Chunk数据,后处理第二次WirteMoov;

依此循环处理,直至文件录制结束,完成最后一次WirteMoov;

本基于Android架构行车记录仪的异常掉电可播放视频方法,包括创建用于录制视频容器的安卓类对象,在安卓类对象内创建文件句柄,后开始录制;安卓的相机服务组件通过平台HAL层去调用驱动代码,驱动去访问硬件固件获取视频流,传递到多媒体编解码组件,压缩后的码流,码流被封装写录制文件的组件读取,进行MP4格式封装,当停止录像或设置结束完成的条件触发后,完成封装,形成MP4录像文件。根据MP4封装原理,只要确保每一个时间片段在写入TF卡后,都有对应的moov封装写入。也就是说在设备不增加硬件成本的前提下,通过软件实现以时间片段为单位封装视频,以解决对记录仪异常掉电导致的视频无法播放的问题。同时也避免扩展新的视频封装格式,改动Android框架带来的工作量地增加。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单介绍,显而易见地,而描述中的附图是本发明的一些实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。

图1为基于Android架构行车记录仪录像流程示意图。

图2为MP4视频封装的结构示意图。

图3为MPEG4Writer形成FdMediaFile的过程中流程示意图。

图4为写入moov和free封装流程示意图。

下面结合实施例,并参照附图,对本发明目的的实现、功能特点及优点作进一步说明。

具体实施方式

为了使发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1和图2所示:所示,本发明提供一种基于Android架构的异常掉电可播放的行车记录仪实施例。

基于Android架构的异常掉电可播放的行车记录仪,行车视频记录仪,记录过程如下:

创建用于录制视频容器的安卓类对象,在安卓类对象内创建文件句柄,后开始录制;

安卓相机服务组件通过平台HAL层去调用驱动代码,驱动去访问硬件固件获取视频流,传递到多媒体编解码组件,压缩后的码流,码流被封装写录制文件的组件读取,进行MP4格式封装,当停止录像或设置结束完成的条件触发后,完成封装,形成MP4录像文件。

所述写入moov和free封装步骤包括,

录像文件创建后,先写文件头ftyp,定义TimeSlice间隔为2s,即2s的录制时间一到就作一次文件写入;

TimeSlice1,保证依次写入VideoChunk和AudioChunk数据,写入完成后,处理第一次WirteMoov,完成封装;

TimeSlice2,文件地址偏移到TimeSlice1写moov的位置,进行覆盖写入Chunk数据,后处理第二次WirteMoov;

依此循环处理,直至文件录制结束,完成最后一次WirteMoov;

具体地说,打开相机设备,如Camera,设置好录像参数后,创建用于录制视频的容器安卓类对象,例如MediaRecorder,在MediaRecorder创建一个用于写数据流的句柄fd后开始录制。相机操作的服务组件,如CameraService从驱动获取视频流,即通过平台HAL层去调用驱动代码,驱动去访问硬件固件,并由摄像头采集的数据流,CameraService将获取的视频流传递到多媒体编解码组件,如OpenMax组件进行硬编码,压缩后的码流如H264格式,被封装组件,如MPEG4Writer读取,进行MP4格式封装,其中所述格式封装就是写moov等操作,创建一个容器,除了有视频内容数据,还要写入描述文件信息的内容,也即由一个容器将视频内容封装起来。当停止录像或设置结束完成的条件触发后,完成封装,即完成容器文件写入,形成MP4录像文件,即录制文件达到一定条件如设定的时长到了或者设定的大小到了后,对文件最后写好box内容。

所述被封装组件MPEG4Writer作用是安卓提供的写录制文件的组件,具体是将经过硬编码的视频码流按照标准封装成可播放的视频文件。

所述相机操作的服务组件CameraService是安卓提供的可访问相机的HAL(硬件抽象层)服务,如打开/关闭相机的调用通过它传递到驱动;

所述多媒体编解码组件OpenMax组件是多媒体的接口标准协议,提供了访问硬件编解码的接口。摄像头采集的原始数据流会通过多媒体编解码组件到达硬件Codec进行压缩编码。

获取数据MediaBuffer的线程会将Video/Audio的Track数据以Sample结构写入到ChunkBuffer缓存中,并通知写文件的线程读取Chunk数据写入到文件中,两个线程同步通过循环获取保证数据的连续读出写入,当一段录制完成时,写入moov和free的box内容。

被封装组件MPEG4Writer形成FdMediaFile的过程中,具体流程原理如下图3所示,

获取数据MediaBuffer的线程会将Video/Audio的Track数据以Sample结构写入到ChunkBuffer缓存中,并通知写文件的线程读取Chunk数据写入到文件中,两个线程以同步方式,通过循环获取保证数据的连续读出写入。当一段录制完成时,写入moov和free的box内容。

通过分析这个过程,如果我们在每个时间片段中,对于之前写好的内容模拟一次完成时的动作,即提前写入moov和free封装。那么文件的完整性就能得到保障,在突然掉电时仅损失最后一个片段的内容。

其过程原理图如图4所示,实现过程如下:

1)录像文件创建后,先写文件头ftyp,定义TimeSlice间隔为2s,即2s的录制时间一到就作一次文件写入;

2)TimeSlice1,保证依次写入VideoChunk和AudioChunk数据,写入完成后,处理第一次WirteMoov,完成封装;

3)TimeSlice2,文件地址偏移到TimeSlice1写moov的位置,进行覆盖写入Chunk数据,后处理第二次WirteMoov;

4)依此循环处理,知道文件录制结束,完成最后一次WirteMoov;

通过以上步骤,控制代码逻辑,在框架中实现了以时间片段为单位内容的录像文件,当发生上述异常掉电的情况是,由于文件格式的完整性,可保证视频的正常播放。也就是说在设备不增加硬件成本的前提下,通过软件实现以时间片段为单位封装视频,以解决对记录仪异常掉电导致的视频无法播放的问题。同时也避免扩展新的视频封装格式,改动Android框架带来的工作量地增加。

以上实施例仅用于说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换,而这些修改或替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

最后

以上就是冷静外套为你收集整理的android 行车记录仪分析,基于Android架构行车记录仪的异常掉电可播放视频方法与流程...的全部内容,希望文章能够帮你解决android 行车记录仪分析,基于Android架构行车记录仪的异常掉电可播放视频方法与流程...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部