一种基于android系统的自动分段录像方法及系统与流程

文档序号:14726679发布日期:2018-06-19 10:47阅读:944来源:国知局

本发明涉及录像领域,具体为基于android系统的自动分段录像方法及系统。



背景技术:

自从android系统第一个版本发布以来,应用越来越广泛,从最初单纯的手机系统慢慢向传统嵌入式领域渗透,同时随着汽车,通讯等行业的迅猛发展,市面上基于android系统的监控类产品也越来越多,这些产品存在共同的基础需求,按时间分段录像并保存。Android原生系统的录像功能不支持自动分段,简单的使用MediaRecorder类(android系统提供的接口)停止上段录像然后启动新的一段录像,中间不可避免的存在时间差,导致漏秒和漏帧,其在某些特殊的产品上(如行车记录仪)是不可接受的。现有技术采用修改android系统框架层,使系统支持同时开启两个或多个录像功能,然后使用类似接力跑步比赛的方式,在上段录像将要完成的时候,开启第二个录像,两个录像会存在一段重叠的画面。采用录像接力方案的缺陷是实施技术难度门槛比较大,需要对系统做比较大的定制修改(需要定制系统的多媒体部分并保证对原有接口的稳定和兼容性),投入研发的成本很高;同时因为两段录像部分重叠,降低存储卡存储效率和使用寿命。

综上,该技术有必要进行改进。



技术实现要素:

为了解决上述技术问题,本发明的目的是提供一种基于android系统的自动分段录像方法及系统。

本发明所采用的技术方案是:

本发明提供一种基于android系统的自动分段录像方法,包括以下步骤:

系统启动录像工作任务,其中所述录像工作任务包括视频处理任务、音频处理任务和文件写入任务;

系统将所述视频处理任务、音频处理任务均按照生产者/消费者模式进行拆分;

所述视频处理任务的生产者线程和音频处理任务的生产者线程分别获取数据帧,并由各自的消费者线程将每帧中的信息及系统环境信息缓冲至内存中;

系统将所述数据帧打包成数据块,并发送指令至文件写入任务,将所述数据块写入目标文件。

作为该技术方案的改进,所述生产者线程从编码器中读取视频和/或音频数据并缓存至内存中。

作为该技术方案的改进,所述消费者线程从内存缓冲中读取所述视频和/或音频数据。

作为该技术方案的改进,所述消费者线程将所述视频和/或音频数据添加时间戳和/或录像文件格式的文件头。

进一步地,所述缓冲采用环形缓冲。

进一步地,所述缓冲采用栈数据结构缓冲。

另一方面,本发明还提供一种基于android系统的自动分段录像系统,其包括:

启动模块,用于执行步骤系统启动录像工作任务,其中所述录像工作任务包括视频处理任务、音频处理任务和文件写入任务;

数据处理模块,用于执行步骤系统将所述视频处理任务、音频处理任务均按照生产者/消费者模式进行拆分;所述视频处理任务的生产者线程和音频处理任务的生产者线程分别获取数据帧,并由各自的消费者线程将每帧中的信息及系统环境信息缓冲至内存中;

数据写入模块,用于执行步骤系统将所述数据帧打包成数据块,并发送指令至文件写入任务,将所述数据块写入目标文件。

进一步地,其还包括缓冲模块,所述缓冲模块包括环形缓冲和/或栈数据结构缓冲。

本发明的有益效果是:本发明提供的基于android系统的自动分段录像方法及系统,采用生产者/消费者模式将所述视频处理任务、音频处理任务进行拆分,在android系统上实现了自动分段录像功能,其可保证在系统极限能力范围内不损失一帧画面,同时可保证两段录像之间画面连贯。

与现有的接力录像方案相比,本方案不增加系统额外性能开销,没有冗余录像数据,不会降低存储卡效率和使用寿命,整体方案开发难度低,通用性较强,在任何android系统上都可以使用。

附图说明

下面结合附图对本发明的具体实施方式作进一步说明:

图1是本发明第一实施例的示意图;

图2a是本发明第二实施例的示意图;

图2b是本发明第三实施例的示意图;

图2c是本发明第四实施例的示意图;

图2d是本发明第五实施例的示意图;

图3是本发明第六实施例的控制流程示意图。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

本发明提供一种基于android系统的自动分段录像方法,包括以下步骤:

系统启动录像工作任务,其中所述录像工作任务包括视频处理任务、音频处理任务和文件写入任务;

系统将所述视频处理任务、音频处理任务均按照生产者/消费者模式进行拆分;

所述视频处理任务的生产者线程和音频处理任务的生产者线程分别获取数据帧,并由各自的消费者线程将每帧中的信息及系统环境信息缓冲至内存中;

系统将所述数据帧打包成数据块,并发送指令至文件写入任务,将所述数据块写入目标文件。

作为该技术方案的改进,所述生产者线程从编码器中读取视频和/或音频数据并缓存至内存中。

作为该技术方案的改进,所述消费者线程从内存缓冲中读取所述视频和/或音频数据。

作为该技术方案的改进,所述消费者线程将所述视频和/或音频数据添加时间戳和/或录像文件格式的文件头。

进一步地,所述缓冲采用环形缓冲。

进一步地,所述缓冲采用栈数据结构缓冲。

本发明采用对android系统框架层定制的方案,采用缓冲技术来实现分割包装录像文件。

其中,在Android原生系统的录像功能系统中,摄像头原始数据经过编码器,最终送到文件组合器(如MPEG4Writer,该组合器按照ISO 14496-12标准对音视频数据进行封装,MP4、3GP、ismv等常见的媒体封装格式都是以这种基础文件格式为基础衍生的。一般基于Android系统录像类产品都是录制为MP4或3GP格式,本方案以此格式为目标。其他格式在同一层级也有会有对应的XXWriter,上述音视频数据按照MP4视频封装格式的要求,加上时间戳等信息生成最终的录像文件。

所述MPEG4Writer的工作原理为:其由3个工作线程配合完成工作,两个轨迹线程(TrackThread):一个视频处理线程TrackThread(Video),一个音频处理线程TrackThread(Audio),这两个线程完成的工作都是一样的,只是处理的源数据不一样;还有一个文件写入线程(WriterThread)。实际运行中,轨迹线程至少为一个(录音,录像,录像并带声音)。

其工作流程为:轨迹线程(TrackThread,即视频或音频线程)以帧(原始数据帧)为单位获取数据帧,并将其缓存在内存中,同时将每帧中的信息及系统环境信息提取汇总并存储在内存中(这些信息等录像完成后,会由文件写入线程写入),当数据帧缓存达到一定数量,将这些数据帧打包成数据块,并通知文件写入线程将其写入最终的文件。

其中无论是否分段,录像数据都是一样的,都来自编码器的输出,而且只要不停止录像,数据会源源不断;如果需要分段,只需要在MPEG4Writer中,根据需要把录像数据写入不同文件即可。本方案以此为基础,通过简单修改MPEG4Writer封装工具,实现了不漏帧漏秒的分段录像。其具体实现原理如图1所示,系统把轨迹线程进一步拆分成生产者/消费者线程模型(生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),其是一个计算机多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据),其中生产者线程赋值从编码器读取数据并缓冲到内存中,在整个录像过程中一直运行,保证录像数据不漏秒漏帧;消费者线程则完成原先轨迹线程的工作,从内存缓冲中读取数据,维护上述提到的每帧中的信息及系统环境等信息,通知文件写入线程写入最终的文件等,该线程会随着录像分段不停的启动,关闭,每次重启对应一段录像文件,每次启动都会接着上一次数据的地方继续处理,这样从设计上保证了不漏秒漏帧。原生的轨迹线程除了根据分段情况切换不同的目标文件写入数据外,原有的功能保持不变。

生产者/消费者模型需要一个可靠的缓冲,考虑到录像数据处理的效率问题,本方案采用一种改良型的环形缓冲区(环形缓冲区(ring buffer),环形队列(ring queue)多用于2个线程之间传递数据。一般来说,对于多线程共享数据,需要使用mutex(互斥机制)来同步,这样共享数据才不至于发生不可预测的修改/读取,然而,mutex的使用也带来了额外的系统开销,ring buffer/queue就是为了有效地解决这个问题,因其特殊的结构及算法,可以用于2个线程中共享数据的同步,而且必须遵循A线程写入,B线程取出的原则。采用这个机制另外一个用处是A写入完数据后可以马上接收另外一个数据,当输入数据快速时不容易造成数据阻塞而丢包设计,简化了缓冲区的开发难度。

原生轨迹线程被拆成两个更小的线程,一个线程负责读取并缓存原始音视频数据,另一个线程负责原来的轨迹线程的工作。本方案只描述了只有一个轨迹线程的情况,实际情况中,每个轨迹线程都会拥有自己的一套生产者/消费者。

参照图2a、图2b、图2c、图2d,分别是本方案使用的的环形缓冲原理图,实际运行中生产者的生产(获取编码器输出的数据并缓存)速度远慢于消费者的消费(读取缓存数据并维护Stco等信息)的速度,能够保证最大限度的发挥整个系统的录像性能(系统的录像性能的瓶颈一般都是在摄像头获取数据阶段和把摄像头数据编码成H.264等视频格式阶段,本方案的改动是在编码阶段之后,并且消费者处理比生产者块,不会造成新的瓶颈。假设原来系统有30帧/秒的录像能力,本方案不会降低原来的性能,同样因为这个原因,本方案的环形缓冲的处理逻辑比传统的环形缓冲可以简化很多,消费者线程只要判断当前是否有可用数据即可,没有则休眠一定时间等待。

本方案的缓冲方式是可替换的,换成其他任何形式的缓冲方案(比如用栈等其他经典的数据结构)都可以。本方案的描述是基于MPEG4Writer这个组合器,实际应用中,可以使用任意组合器或者新增一自定义的组合器,所以本方案的核心点在于对编码器输出的音视频数据,采用消费者/生产者模式实现分段不漏帧漏秒录像,而不仅仅是在MPEG4Writer里的具体实现。

采用生产者/消费者模型,环形缓冲来实现自动分段录像,保证录像数据不漏秒漏帧。

作为一优选实施例,如行车记录实施例,项目要求格式是MP4,对应android系统,需要对MPEG4Writer加以修改,整体的控制流程如图3所示。

1.开始录像,初始化工作主要如下:

在内存中开辟音频,视频两个一定长度并且连续的空间,记为Q1,Q2,每个空间按照音视频数据单位长度(可以简单的理解为一帧数据的长度)分割成N份,通过循环使用的方式实现逻辑上的环形队列。每个空间配置生产者指针和消费者指针,初始值都指向环形缓冲P0位置。

启动视频生产者线程,视频消费者线程;

启动音频生成者线程,音频消费者线程;

启动数据写入线程;

2.音频和视频两个部分的流程是一样的,下面以通用方式描述;

录像开始后,生产者线程不停的从android编码器里以帧为单位取出数据,按照生产者指针的指示,依次存入空间P0,P1,P2,P3……,消费者线程则不停的按P0,P1,P2,P3……的顺序从缓冲队列拿出数据处理(加时间戳,录像文件格式的文件头等),然后把处理好的数据传给数据写入线程写入到最终文件。生产者线程和数据写入线程的生命周期和整个录像过程相同,而消费者线程的生命周期和每段录像的时间相同,即每个录像文件都对应一个全新的消费者线程,新的录像开始时,启动一个新的消费者线程接着上一段录像结束时消费者指针指示的位置取数据。数据写入线程

上述过程中,生产者指针和消费者指针都会随着录像的进行独立的往前移动,消费者指针不能越过生产者指针,不然拿到的数据就是无效数据。当达到Pn时,即到达缓冲区末尾时,需要重新把指针移动回P0。录像过程中,编码器的性能是瓶颈,所以生产者的处理速度要远小于消费者的速度,相比于通用的环形队列(生产者和消费者速度不稳定,需要考虑各种并发问题),本方案的环形队列在设计上做了简化,把逻辑上的环形队列铺平处理(生产者和消费者一直王强不回头),在生产者指针和消费者指针的基础上,分别再加一个基础量,具体运作过程如下:

第一次队列循环中,基础量为0,生产者和消费者往前移动。

生产者或消费者移动到队列尾部Pn时,基础量变为队列长度N。

继续移动,生成者或消费者继续往前移动,

……

第a次到达队列尾部,基础量变为(a-1)×N

当需要访问(读取或写入)缓冲区时,真正的地址通过生产者/消费者指针–生产者/消费者基础量方式得到,即不管移动了多少次,最后写入的数据的位置仍然在这个队列的范围内。使用这种方式,生成者指针和消费者指针在整个过程中的值都在增长,无需在队列尾部重新置回初始值P0。好处之一是可以简化生产者和消费者线程之间的协调判断逻辑,生产者线程判断缓冲区是否有可用空间用于存储时可用生产者指针–消费者指针>1(为真则表明缓冲区有空间,为假则表明空间已用完)来判断,同样的,消费者线程判断是否有可用数据时,可用消费者指针<生成者指针-1(为真则表示有可用数据,为假则表明队列里没有可用数据,需等待生产者写入)来判断。

另一方面,本发明还提供一种基于android系统的自动分段录像系统,其包括:

启动模块,用于执行步骤系统启动录像工作任务,其中所述录像工作任务包括视频处理任务、音频处理任务和文件写入任务;

数据处理模块,用于执行步骤系统将所述视频处理任务、音频处理任务均按照生产者/消费者模式进行拆分;所述视频处理任务的生产者线程和音频处理任务的生产者线程分别获取数据帧,并由各自的消费者线程将每帧中的信息及系统环境信息缓冲至内存中;

数据写入模块,用于执行步骤系统将所述数据帧打包成数据块,并发送指令至文件写入任务,将所述数据块写入目标文件。

进一步地,其还包括缓冲模块,所述缓冲模块包括环形缓冲和/或栈数据结构缓冲。

本发明提供的基于android系统的自动分段录像方法及系统,采用生产者/消费者线程模式将所述视频处理线程、音频处理线程进行拆分,在android系统上实现了自动分段录像功能,能够保证在系统极限能力范围内不损失一帧画面。

与现有的接力录像方案相比,本方案不增加系统额外性能开销,没有冗余录像数据,不会降低存储卡效率和使用寿命,整体方案开发难度低,通用性较强,在任何android系统上都可以使用。

以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1