一种多媒体文件的录制方法和装置与流程

文档序号:16008647发布日期:2018-11-20 20:23阅读:171来源:国知局

技术领域

本发明涉及多媒体的技术领域,特别是涉及一种多媒体文件的录制方法和一种多媒体文件的录制装置。



背景技术:

在行车记录仪、场地监控等视频监控领域,一般需要长时间录制视频。

在目前的视频录制工具中,由于文件系统及计算平台的限制,需要在录制时设定录制视频文件的尺寸上限,用多个视频文件连续存放录制的视频。

但是,在结束视频文件的录制时,需要关闭视频录制工具,在重新进行视频文件的录制时,再重新启动视频录制工具,而启动时需要进行初始化等操作。

由此可见,在视频文件切换过程中需要耗费较长时间,切换过程中无法进行录制,造成监控时间上的空白,对于要求严格的监控领域,这种视频数据的丢失可能存在严重问题。



技术实现要素:

鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题的一种多媒体文件的录制方法和相应的一种多媒体文件的录制装置。

为了解决上述问题,本发明实施例公开了一种多媒体文件的录制方法,包括:

当接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一多媒体写入器、第二多媒体写入器;

通过数据源持续采集多媒体数据;

编码器持续对所述多媒体数据进行编码,并将编码之后的多媒体数据写入预置的缓存队列;

第一多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第一多媒体文件;

判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第二多媒体文件。

优选地,所述第一多媒体写入器包括第一写入器和第一打包器,所述第二多媒体写入器包括第二写入器和第二打包器。

优选地,所述第一多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第一多媒体文件的步骤包括:

第一打包器从所述缓存队列读取编码之后的多媒体数据;

第一打包器将编码之后的多媒体数据打包成多媒体数据包;

第一写入器将所述多媒体数据包写入第一多媒体文件。

优选地,所述第一多媒体写入器从所述缓存队列读取多媒体数据包,并写入第一多媒体文件的步骤包括:

当所述第一多媒体文件超过预设的文件大小阈值时,第一多媒体写入器生成封装完成事件;

第一多媒体写入器广播所述封装完成事件。

优选地,所述判断所述第一多媒体文件是否超过预设的文件大小阈值的步骤包括:

判断是否接收到由第一多媒体写入器广播的封装完成事件;若是,则判断所述第一多媒体文件超过预设的文件大小阈值。

优选地,所述切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第二多媒体文件的步骤包括:

停止第一打包器和第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动第二打包器和第二写入器;

第二打包器从所述缓存队列读取编码之后的多媒体数据;

第二打包器将编码之后的多媒体数据打包成多媒体数据包;

第二写入器将所述多媒体数据包写入第二多媒体文件。

优选地,所述缓存队列配置有互斥锁,所述切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据的步骤包括:

第一打包器释放所述缓存队列;

第二打包器锁定所述缓存队列;

第二打包器通过所述缓存队列提供的读接口从所述缓存队列读取编码后的多媒体数据。

优选地,所述数据源包括摄像头和/或麦克风,所述多媒体数据包括视频数据和/或音频数据;

所述通过数据源持续采集多媒体数据的步骤包括:

通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

通过预置的音频源类AudioSource从麦克风采集音频数据。

本发明实施例还公开了一种多媒体文件的录制方法,包括:

当接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一写入器、第二写入器;

通过数据源持续采集多媒体数据;

编码器持续对所述多媒体数据进行编码;

打包器持续将编码之后的多媒体数据打包成多媒体数据包,并将所述多媒体数据包写入预置的缓存队列;

第一写入器从所述缓存队列读取多媒体数据包,并写入第一多媒体文件;

判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则切换至第二写入器从所述缓存队列读取多媒体数据包,并写入第二多媒体文件。

优选地,所述写入第一多媒体文件的步骤包括:

当所述第一多媒体文件超过预设的文件大小阈值时,第一写入器生成封装完成事件;

第一写入器广播所述封装完成事件。

优选地,所述判断所述第一多媒体文件是否超过预设的文件大小阈值的步骤包括:

判断是否接收到由第一写入器广播的封装完成事件;若是,则判断所述第一多媒体文件超过预设的文件大小阈值。

优选地,所述切换至第二写入器从所述缓存队列读取多媒体数据包的步骤包括:

停止第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动第二写入器;

第二写入器从所述缓存队列读取所述多媒体数据包。

优选地,所述缓存队列配置有互斥锁,所述切换至第二写入器从所述缓存队列读取多媒体数据包的步骤包括:

第一写入器释放所述缓存队列;

第二写入器锁定所述缓存队列;

第二写入器通过所述缓存队列提供的读接口从所述缓存队列读取所述多媒体数据包。

优选地,所述数据源包括摄像头和/或麦克风,所述多媒体数据包括视频数据和/或音频数据;

所述通过数据源持续采集多媒体数据的步骤包括:

通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

通过预置的音频源类AudioSource从麦克风采集音频数据。

本发明实施例还公开了一种多媒体文件的录制装置,包括:

录制工具创建模块,用于在接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一多媒体写入器、第二多媒体写入器;

多媒体数据采集模块,用于通过数据源持续采集多媒体数据;

编码模块,用于由编码器持续对所述多媒体数据进行编码,并将编码之后的多媒体数据写入预置的缓存队列;

第一封装模块,用于由第一多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第一多媒体文件;

文件大小判断模块,用于判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则调用第二封装模块;

第二封装模块,用于切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第二多媒体文件。

优选地,所述第一多媒体写入器包括第一写入器和第一打包器,所述第二多媒体写入器包括第二写入器和第二打包器。

优选地,所述第一封装模块包括:

第一读取子模块,用于由第一打包器从所述缓存队列读取编码之后的多媒体数据;

第一打包子模块,用于由第一打包器将编码之后的多媒体数据打包成多媒体数据包;

第一写入子模块,用于由第一写入器将所述多媒体数据包写入第一多媒体文件。

优选地,所述第一封装模块包括:

封装完成事件生成子模块,用于在所述第一多媒体文件超过预设的文件大小阈值时,第一多媒体写入器生成封装完成事件;

封装完成事件广播子模块,用于由第一多媒体写入器广播所述封装完成事件。

优选地,所述文件大小判断模块包括:

封装完成事件判断子模块,用于判断是否接收到由第一多媒体写入器广播的封装完成事件;若是,则调用封装完成判断子模块;

封装完成判断子模块,用于判断所述第一多媒体文件超过预设的文件大小阈值。

优选地,所述第二封装模块包括:

停止子模块,用于停止第一打包器和第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动子模块,用于启动第二打包器和第二写入器;

第二读取子模块,用于由第二打包器从所述缓存队列读取编码之后的多媒体数据;

第二打包子模块,用于由第二打包器将编码之后的多媒体数据打包成多媒体数据包;

第二写入子模块,用于由第二写入器将所述多媒体数据包写入第二多媒体文件。

优选地,所述缓存队列配置有互斥锁,所述第二封装模块包括:

释放子模块,用于由第一打包器释放所述缓存队列;

锁定子模块,用于由第二打包器锁定所述缓存队列;

接口读取子模块,用于由第二打包器通过所述缓存队列提供的读接口从所述缓存队列读取编码后的多媒体数据。

优选地,所述数据源可以包括摄像头和/或麦克风,所述多媒体数据可以包括视频数据和/或音频数据;

所述多媒体数据采集模块包括:

视频数据采集子模块,用于通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

音频数据采集子模块,用于通过预置的音频源类AudioSource从麦克风采集音频数据。

本发明实施例还公开了一种多媒体文件的录制装置,包括:

录制工具创建模块,用于在接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一写入器、第二写入器;

多媒体数据采集模块,用于通过数据源持续采集多媒体数据;

编码模块,用于由编码器持续对所述多媒体数据进行编码;

打包模块,用于由打包器持续将编码之后的多媒体数据打包成多媒体数据包,并将所述多媒体数据包写入预置的缓存队列;

第一封装模块,用于由第一写入器从所述缓存队列读取多媒体数据包,并写入第一多媒体文件;

文件大小判断模块,用于判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则调用第二封装模块;

第二封装模块,用于切换至第二写入器从所述缓存队列读取多媒体数据包,并写入第二多媒体文件。

优选地,所述第一封装模块包括:

封装完成事件生成子模块,用于在所述第一多媒体文件超过预设的文件大小阈值时,第一写入器生成封装完成事件;

封装完成事件广播子模块,用于由第一写入器广播所述封装完成事件。

优选地,所述文件大小判断模块包括:

封装完成事件判断子模块,用于判断是否接收到由第一写入器广播的封装完成事件;若是,则调用封装完成判断子模块;

封装完成判断子模块,用于判断所述第一多媒体文件超过预设的文件大小阈值。

优选地,所述第二封装模块包括:

停止子模块,用于停止第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动子模块,用于启动第二写入器;

第二读取子模块,用于由第二写入器从所述缓存队列读取所述多媒体数据包。

优选地,所述缓存队列配置有互斥锁,所述第二封装模块包括:

释放子模块,用于由第一写入器释放所述缓存队列;

锁定子模块,用于由第二写入器锁定所述缓存队列;

接口读取子模块,用于由第二写入器通过所述缓存队列提供的读接口从所述缓存队列读取所述多媒体数据包。

优选地,所述数据源可以包括摄像头和/或麦克风,所述多媒体数据可以包括视频数据和/或音频数据;

所述多媒体数据采集模块包括:

视频数据采集子模块,用于通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

音频数据采集子模块,用于通过预置的音频源类AudioSource从麦克风采集音频数据。

本发明实施例包括以下优点:

本发明实施例配置两个多媒体写入器,将数据源持续采集的多媒体数据持续进行编码并存储在缓存队列中,当第一多媒体写入器封装第一多媒体文件完成时,切换至第二多媒体写入器进行第二多媒体文件的封装,在切换过程中,数据源、编码器等录制工具可以持续正常工作,避免了在切换时数据源、编码器等录制工具的关闭,进而避免了在切换后数据源、编码器等录制工具的初始化操作,保证了在切换时持续工作,避免了录制的空白,实现了无缝连续录制。

本发明实施例复用编码器,第一多媒体写入器和第二多媒体写入器的切换过程对于数据源、编码器而言是透明的,通过互斥锁保护的缓存队列,保证了第一多媒体写入器和第二多媒体写入器在切换时的数据同步。

本发明实施例配置两个写入器,将数据源持续采集的多媒体数据持续进行编码、打包,并存储在缓存队列中,当第一写入器封装第一多媒体文件接近完成时,切换至第二写入器进行第二多媒体文件的封装,在切换过程中,数据源、编码器、打包器等录制工具可以持续正常工作,避免了在切换时数据源、编码器、打包器等录制工具的关闭,进而避免了在切换后数据源、编码器、打包器等录制工具的初始化操作,保证了在切换时持续工作,避免了录制的空白,实现了无缝连续录制。

本发明实施例复用打包器,第一写入器和第二写入器的切换过程对于数据源、编码器、打包器而言是透明的,通过互斥锁保护的缓存队列,保证了第一写入器和第二写入器在切换时的数据同步。

附图说明

图1是本发明的一种多媒体文件的录制方法实施例1的步骤流程图;

图2是本发明的一种多媒体文件的录制方法实施例2的步骤流程图;

图3是本发明的一种多媒体文件的录制装置实施例1的结构框图

图4是本发明的一种多媒体文件的录制装置实施例2的结构框图。

具体实施方式

为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。

参照图1,示出了本发明的一种多媒体文件的录制方法实施例的步骤流程图,具体可以包括如下步骤:

步骤101,当接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一多媒体写入器、第二多媒体写入器;

需要说明的是,本发明实施例可以应用于具有摄像头的电子设备,例如,手机、平板电脑、智能可穿戴设备(如智能手表、智能眼镜)、行车记录仪、视频监控器等等。

这些电子设备大多可以支持WindowsPhone、Android(安卓)、IOS、Windows等操作系统,通常可以运行录制视频的应用,如摄像头应用,实现录像功能。

为使本领域技术人员更好地理解本发明实施例,在本发明实施例中,Android作为操作系统的一种示例进行说明。

Android一种基于Linux的自由及开放源代码的操作系统,大致可以划分为四个层,从高层到低层分别是应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries)和Linux核心层(Linux Kernel)。

进一步而言,Android系统是在Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个Java的Application Framework,应用程序是基于JAVA的Application Framework之上运行的,因此,大致可以将Application Framework划分为Java层和Native层。

在具体实现中,多媒体文件的录制请求可以是指用户通过摄像头应用点击指定的控件(如录像开始控件)等方式发出的进行录像的指示。

当接收到多媒体文件的录制请求时,可以创建多媒体录制对象MediaRecorder,多媒体录制对象MediaRecorder对象创建多媒体录制服务实例StageFrightRecorder,StageFrightRecorde根据从录制视频的应用接收来的设置(如编码格式)和控制消息创建数据源DataSource、编码器Codec、第一多媒体写入器MediaWriter、第二多媒体写入器MediaWriter,即多媒体录制服务实例StageFrightRecorder可以扮演控制器Controller的角色,完成录制工具的创建和设置。

具体而言,录制视频的应用可以在创建一个Java层的MediaRecorder对象,实现录音和录像。

MediaRecorder对象是通过应用程序框架层的录制服务模块MPS创建录制服务实例——StageFrightRecorder,控制多媒体文件的录制。

其中,StagefrightRecorder是MPS创建的用于录制操作的实体对象。

录制视频的应用和MPS之间通过AIDL接口实现进程间通信,为了摄像头应用开发方便,Android系统提供了封装好的帮助类。

如录制视频的应用通过MediaRecorder对象和MediaRecorderClient实现和MPS交流。

MediaRecorder对象是运行在录制视频的应用的进程空间里面,代表MPS,MediaRecorderClient运行在多媒体服务器进程空间里面代表录制视频的应用。

需要说明的是,为了实现热备份机制,本发明实施例可以在Native层修改控制器Controller的控制逻辑和增加一个媒体写入器MediaWriter,在Java层增加连续录制的控制参数。

其中,第一多媒体写入器MediaWriter和第二多媒体写入器MediaWriter互为工作的多媒体写入器MediaWriter和备份的多媒体写入器MediaWriter。

而在本发明实施例中,第一多媒体写入器MediaWriter可以为工作的多媒体写入器MediaWriter,第二多媒体写入器MediaWriter可以为备份的多媒体写入器MediaWriter。

Android原生的多媒体录制框架简化了打包器Packetizer和写入器Writer的设计,将二者的功能合成在一个多媒体写入器MediaWriter中。

即在本发明实施例中,第一多媒体写入器MediaWriter可以包括第一写入器Writer和第一打包器Packetizer,第二多媒体写入器MediaWriter可以包括第二写入器Writer和第二打包器Packetizer,则第一打包器Packetizer与第二打包器Packetizer复用编码器Codec。

步骤102,通过数据源持续采集多媒体数据;

在具体实现中,数据源DataSource可以包括摄像头Camera和/或麦克风MIC,多媒体数据可以包括视频数据和/或音频数据;

则在本发明实施例中,可以通过预置的摄像头源类CameraSource从摄像头Camera采集视频数据,如YUV数据;

和/或,

可以通过预置的音频源类AudioSource从麦克风MIC采集音频数据,如PCM数据。

步骤103,编码器持续对所述多媒体数据进行编码,并将编码之后的多媒体数据写入预置的缓存队列;

录制的多媒体数据传输过程是消息驱动的,数据源DataSource产生多媒体数据的消息被注入编码器Codec的消息队列。

编码器Codec检测到该消息后,可以调用MediaSource(Android平台的数据源类型)的read函数来获取视频数据、音频数据,按照设定的编码格式进行编码,压缩视频数据、音频数据为各种编码格式的数据。

其中,对多媒体数据进行编码,指通过特定的压缩技术,如H.261、H.263、H.264等,将某个视频格式的文件转换成另一种视频格式文件的方式。

编码器Codec可以将编码之后的多媒体数据存储在一个内部的缓存队列里。

具体而言,缓存队列对外部对象提供了写接口(put)和读接口(read),编码器Codec可以调用该写接口(put),将编码之后的多媒体数据写入缓存队列。

步骤104,第一多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第一多媒体文件;

在具体实现中,工作的第一多媒体写入器MediaWriter可以调用缓存队列的读接口(read),从缓存队列读取编码之后的多媒体数据,按照设定的输出格式(如MP4、3GP等)封装第一多媒体文件。

在本发明的一种优选实施例中,步骤104可以包括如下子步骤:

子步骤S11,第一打包器从所述缓存队列读取编码之后的多媒体数据;

子步骤S12,第一打包器将编码之后的多媒体数据打包成多媒体数据包;

子步骤S13,第一写入器将所述多媒体数据包写入第一多媒体文件;

子步骤S14,当所述第一多媒体文件超过预设的文件大小阈值时,第一多媒体写入器生成封装完成事件;

子步骤S15,第一多媒体写入器广播所述封装完成事件。

第一打包器Packetizer读取编码器Codec输出的码流,负责将编码器Codec输出的码流分割打包,以便于存储或者传输。

第一写入器Writer将第一打包器Packetizer打包号的多媒体数据包写入第一多媒体文件中。

若第一写入器Writer在检测到第一多媒体文件超过文件大小阈值,则可以生成封装完成事件,广播至控制器Controller,通知控制器Controller已接近完成第一多媒体文件的封装。

步骤105,判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则执行步骤106;

在具体实现中,控制器Controller可以判断是否接收到由第一多媒体写入器MediaWriter广播的封装完成事件;若是,则判断第一多媒体文件超过预设的文件大小阈值。

步骤106,切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第二多媒体文件。

本发明实施例应用热备份机制,若控制器Controller获知第一多媒体文件超过预设的文件大小阈值,即接近封装完成,可以切换至第二多媒体写入器MediaWriter进行第二多媒体文件的封装。

当切换至第二多媒体写入器MediaWriter进行封装时,第二多媒体写入器MediaWriter从备份的多媒体写入器MediaWriter切换为工作的多媒体写入器MediaWriter,第一多媒体写入器MediaWriter从工作的多媒体写入器MediaWriter切换为备份的多媒体写入器MediaWriter。

在本发明的一种优选实施例中,步骤106可以包括如下子步骤:

子步骤S21,停止第一打包器和第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

子步骤S22,启动第二打包器和第二写入器;

子步骤S23,第二打包器从所述缓存队列读取编码之后的多媒体数据;

子步骤S24,第二打包器将编码之后的多媒体数据打包成多媒体数据包;

子步骤S25,第二写入器将所述多媒体数据包写入第二多媒体文件。

第一打包器Packetizer、第一写入器Writer、第二打包器Packetizer和第二写入器Writer均有一个工作的线程。

通过关闭第一打包器Packetizer、第一写入器Writer工作的线程,停止第一写入器的工作,将第一多媒体写入器MediaWriter切换至备用状态。

通过启动第二打包器Packetizer、第二写入器Writer工作的线程,启动第二写入器的工作,将第二多媒体写入器MediaWriter切换至工作状态。

第二打包器Packetizer继续读取编码器Codec输出的码流,负责将编码器Codec输出的码流分割打包,以便于存储或者传输。

第二写入器Writer将第二打包器Packetizer打包好的多媒体数据包写入第二多媒体文件中。

当然,若第二写入器Writer在检测到第二多媒体文件超过文件大小阈值,则可以生成封装完成事件,广播至控制器Controller,通知控制器Controller已接近完成第二多媒体文件的封装,再次切换至第一多媒体写入器MediaWriter继续进行封装。

具体而言,控制器Controller发送一个停止消息给第一打包器Packetizer、第一写入器Writer,当第一打包器Packetizer、第一写入器Writer在接收到该停止消息时,可以关闭第一打包器Packetizer、第一写入器Writer工作的线程,同时,第一写入器Writer对第一多媒体进行保存处理,一般包括第一多媒体文件的写入、头信息的保存和文件关闭。

其中,头信息可以包括编码信息等,用于后续的播放。

控制器Controller发送一个启动消息给第二打包器Packetizer、第二写入器Writer,当第二打包器Packetizer、第二写入器Writer在接收到该启动消息时,可以启动第二打包器Packetizer、第二写入器Writer工作的线程。

需要说明的是,本发明实施例可以对StageFrightRecorder框架进行修改,在进行多媒体写入器MediaWriter的切换,即关闭其中一个多媒体写入器MediaWriter、启动另一个多媒体写入器MediaWriter时,不停止其他录制工具(即数据源DataSource、编码器Codec)的工作,另一个多媒体写入器MediaWriter启动后,可以正常监听编码器Codec的输出信息。

当然,若监听到录制结束指示,如用户在用户通过摄像头应用点击指定的控件(如录像结束控件),则可以停止所有录制工具的工作,即控制器Controller可以发消息通知数据源DataSource、编码器Codec、和工作的多媒体写入器MediaWriter停止工作。

在本发明的另一种优选实施例中,所述缓存队列配置有互斥锁,以对缓存队列进行保护。

具体而言,互斥锁可以提供一种相互排斥的方法,通过线程的锁定和解锁,对于某一数据结构,确保某一时刻只能有一个线程能够访问它,即两个线程不能同时对同一个互斥对象加锁。

如果线程a试图锁定一个互斥对象,而此时线程b已锁定了同一个互斥对象时,线程a就将进入睡眠状态。

一旦线程b释放了互斥对象(可以通过 pthread_mutex_unlock() 调用),线程a就能够锁定这个互斥对象(即线程a可以从 pthread_mutex_lock() 函数调用中返回,同时互斥对象被锁定)。

同样地,当线程a正锁定互斥对象时,如果线程c试图锁定互斥对象的话,线程c也将临时进入睡眠状态。

对已锁定的互斥对象上锁定(可以调用pthread_mutex_lock()函数调用) 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。

则在本发明实施例中,步骤106可以包括如下子步骤:

子步骤S31,第一打包器释放所述缓存队列;

子步骤S32,第二打包器锁定所述缓存队列;

子步骤S33,第二打包器通过所述缓存队列提供的读接口从所述缓存队列读取编码后的多媒体数据。

在本发明实施例中,缓存队列作为互斥对象被保护,第一打包器Packetizer的线程释放缓存队列,则不能从缓存队列读取编码之后的多媒体数据,第二打包器Packetizer的线程锁定缓存队列,则能够从缓存队列读取编码之后的多媒体数据。

编码器Codec对其编码之后的多媒体数据的消费者,即打包器Packetizer(包括第一打包器Packetizer和第二打包器Packetizer)提供读取数据接口(read)的实现,即将读取请求read映射到缓存队列的读接口(get)上。

这样,无论是哪个打包器Packetizer(包括第一打包器Packetizer和第二打包器Packetizer)发出的读取read请求都能得到正确响应。

本发明实施例复用编码器,第一多媒体写入器和第二多媒体写入器的切换过程对于数据源、编码器而言是透明的,通过互斥锁保护的缓存队列,保证了第一多媒体写入器和第二多媒体写入器在切换时的数据同步。

本发明实施例配置两个多媒体写入器,将数据源持续采集的多媒体数据持续进行编码并存储在缓存队列中,当第一多媒体写入器封装第一多媒体文件完成时,切换至第二多媒体写入器进行第二多媒体文件的封装,在切换过程中,数据源、编码器等录制工具可以持续正常工作,避免了在切换时数据源、编码器等录制工具的关闭,进而避免了在切换后数据源、编码器等录制工具的初始化操作,保证了在切换时持续工作,避免了录制的空白,实现了无缝连续录制。

参照图2,示出了本发明的一种多媒体文件的录制方法实施例2的步骤流程图,具体可以包括如下步骤:

步骤201,当接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一写入器、第二写入器;

需要说明的是,本发明实施例可以应用于具有摄像头的电子设备,例如,手机、平板电脑、智能可穿戴设备(如智能手表、智能眼镜)、行车记录仪、视频监控器等等。

这些电子设备大多可以支持WindowsPhone、Android(安卓)、IOS、Windows等操作系统,通常可以运行录制视频的应用,如摄像头应用,实现录像功能。

为使本领域技术人员更好地理解本发明实施例,在本发明实施例中,Android作为操作系统的一种示例进行说明。

Android一种基于Linux的自由及开放源代码的操作系统,大致可以划分为四个层,从高层到低层分别是应用程序层(Applications)、应用程序框架层(Application Framework)、系统运行库层(Libraries)和Linux核心层(Linux Kernel)。

进一步而言,Android系统是在Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个Java的Application Framework,应用程序是基于JAVA的Application Framework之上运行的,因此,大致可以将Application Framework划分为Java层和Native层。

在具体实现中,多媒体文件的录制请求可以是指用户通过摄像头应用点击指定的控件(如录像开始控件)等方式发出的进行录像的指示。

当接收到多媒体文件的录制请求时,可以创建多媒体录制对象MediaRecorder,多媒体录制对象MediaRecorder对象创建多媒体录制服务实例StageFrightRecorder,StageFrightRecorde根据从录制视频的应用接收来的设置(如编码格式)和控制消息创建数据源DataSource、编码器Codec、第一多媒体写入器MediaWriter、第二多媒体写入器MediaWriter,即多媒体录制服务实例StageFrightRecorder可以扮演控制器Controller的角色,完成录制工具的创建和设置。

具体而言,录制视频的应用可以在创建一个Java层的MediaRecorder对象,实现录音和录像。

MediaRecorder对象是通过应用程序框架层的录制服务模块MPS创建录制服务实例——StageFrightRecorder,控制多媒体文件的录制。

其中,StagefrightRecorder是MPS创建的用于录制操作的实体对象。

录制视频的应用和MPS之间通过AIDL接口实现进程间通信,为了摄像头应用开发方便,Android系统提供了封装好的帮助类。

如录制视频的应用通过MediaRecorder对象和MediaRecorderClient实现和MPS交流。

MediaRecorder对象是运行在录制视频的应用的进程空间里面,代表MPS,MediaRecorderClient运行在多媒体服务器进程空间里面代表录制视频的应用。

需要说明的是,为了实现热备份机制,本发明实施例可以在Native层修改控制器Controller的控制逻辑和增加一个媒体写入器MediaWriter,在Java层增加连续录制的控制参数。

其中,第一多媒体写入器MediaWriter和第二多媒体写入器MediaWriter互为工作的多媒体写入器MediaWriter和备份的多媒体写入器MediaWriter。

而在本发明实施例中,第一多媒体写入器MediaWriter可以为工作的多媒体写入器MediaWriter,第二多媒体写入器MediaWriter可以为备份的多媒体写入器MediaWriter。

Android原生的多媒体录制框架简化了打包器Packetizer和写入器Writer的设计,将二者的功能合成在一个多媒体写入器MediaWriter中。

即在本发明实施例中,第一多媒体写入器MediaWriter可以包括第一写入器Writer和打包器Packetizer,第二多媒体写入器MediaWriter可以包括第二写入器Writer和打包器Packetizer,则第一写入器Writer与第二写入器Writer复用打包器Packetizer。

步骤202,通过数据源持续采集多媒体数据;

在具体实现中,数据源DataSource可以包括摄像头Camera和/或麦克风MIC,多媒体数据可以包括视频数据和/或音频数据;

则在本发明实施例中,可以通过预置的摄像头源类CameraSource从摄像头Camera采集视频数据,如YUV数据;

和/或,

可以通过预置的音频源类AudioSource从麦克风MIC采集音频数据,如PCM数据。

步骤203,编码器持续对所述多媒体数据进行编码;

录制的多媒体数据传输过程是消息驱动的,数据源DataSource产生多媒体数据的消息被注入编码器Codec的消息队列。

编码器Codec检测到该消息后,可以调用MediaSource(Android平台的数据源类型)的read函数来获取视频数据、音频数据,按照设定的编码格式进行编码,压缩视频数据、音频数据为各种编码格式的数据。

其中,对多媒体数据进行编码,指通过特定的压缩技术,如H.261、H.263、H.264等,将某个视频格式的文件转换成另一种视频格式文件的方式。

步骤204,打包器持续将编码之后的多媒体数据打包成多媒体数据包,并将所述多媒体数据包写入预置的缓存队列;

打包器Packetizer读取编码器Codec输出的码流,负责将编码器Codec输出的码流分割打包,以便于存储或者传输。

打包器Packetizer可以将打包好的多媒体数据包存储在一个内部的缓存队列里。

具体而言,缓存队列对外部对象提供了写接口(put)和读接口(read),打包器Packetizer可以调用该写接口(put),将打包好的多媒体数据包写入缓存队列。

步骤205,第一写入器从所述缓存队列读取多媒体数据包,并写入第一多媒体文件;

在具体实现中,工作的第一写入器Writer可以调用缓存队列的读接口(read),从缓存队列读取多媒体数据包,封装第一多媒体文件。

在本发明的一种优选实施例中,步骤205可以包括如下子步骤:

子步骤S41,当所述第一多媒体文件超过预设的文件大小阈值时,第一写入器生成封装完成事件;

子步骤S42,第一写入器广播所述封装完成事件。

在本发明实施例中,若第一写入器Writer在检测到第一多媒体文件超过文件大小阈值,则可以生成封装完成事件,广播至控制器Controller,通知控制器Controller已接近完成第一多媒体文件的封装。

步骤206,判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则执行步骤207;

在具体实现中,控制器Controller可以判断是否接收到由第一写入器Writer广播的封装完成事件;若是,则判断第一多媒体文件超过预设的文件大小阈值。

步骤207,切换至第二写入器从所述缓存队列读取多媒体数据包,并写入第二多媒体文件。

本发明实施例应用热备份机制,若控制器Controller获知第一多媒体文件超过预设的文件大小阈值,即接近封装完成,可以切换至第二写入器Writer进行第二多媒体文件的封装。

当切换至第二写入器Writer进行封装时,第二写入器Writer从备份的写入器Writer切换为工作的写入器Writer,第一写入器Writer从工作的写入器写入器Writer切换为备份的写入器Writer。

在本发明的一种优选实施例中,步骤207可以包括如下子步骤:

子步骤S51,停止第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

子步骤S52,启动第二写入器;

子步骤S53,第二写入器从所述缓存队列读取所述多媒体数据包。

第一写入器Writer和第二写入器Writer均有一个工作的线程。

通过关闭第一写入器Writer工作的线程,停止第一写入器Writer的工作,将第一写入器Writer切换至备用状态。

通过启动第二写入器Writer工作的线程,启动第二写入器Writer的工作,将第二写入器MediaWriter切换至工作状态。

第二写入器Writer继续从缓存队列中读取打包器Packetizer打包好的多媒体数据包,并写入第二多媒体文件中。

当然,若第二写入器Writer在检测到第二多媒体文件超过文件大小阈值,则可以生成封装完成事件,广播至控制器Controller,通知控制器Controller已接近完成第二多媒体文件的封装,再次切换至第一写入器Writer继续进行封装。

具体而言,控制器Controller发送一个停止消息给第一写入器Writer,当第一写入器Writer在接收到该停止消息时,可以关闭第一写入器Writer工作的线程,同时,第一写入器Writer对第一多媒体进行保存处理,一般包括第一多媒体文件的写入、头信息的保存和文件关闭。

其中,头信息可以包括编码信息等,用于后续的播放。

控制器Controller发送一个启动消息给第二写入器Writer,当第二写入器Writer在接收到该启动消息时,可以启动第二写入器Writer工作的线程。

需要说明的是,本发明实施例可以对StageFrightRecorder框架进行修改,在进行写入器Writer的切换,即关闭其中一个写入器Writer、启动另一个写入器Writer时,不停止其他录制工具(即数据源DataSource、编码器Codec、打包器Packetizer)的工作,另一个写入器Writer启动后,可以正常监听打包器Packetizer的输出信息。

当然,若监听到录制结束指示,如用户在用户通过摄像头应用点击指定的控件(如录像结束控件),则可以停止所有录制工具的工作,即控制器Controller可以发消息通知数据源DataSource、编码器Codec、和工作的多媒体写入器MediaWriter停止工作。

在本发明的另一种优选实施例中,所述缓存队列配置有互斥锁,以对缓存队列进行保护。

具体而言,互斥锁可以提供一种相互排斥的方法,通过线程的锁定和解锁,对于某一数据结构,确保某一时刻只能有一个线程能够访问它,即两个线程不能同时对同一个互斥对象加锁。

如果线程a试图锁定一个互斥对象,而此时线程b已锁定了同一个互斥对象时,线程a就将进入睡眠状态。

一旦线程b释放了互斥对象(可以通过 pthread_mutex_unlock() 调用),线程a就能够锁定这个互斥对象(即线程a可以从 pthread_mutex_lock() 函数调用中返回,同时互斥对象被锁定)。

同样地,当线程a正锁定互斥对象时,如果线程c试图锁定互斥对象的话,线程c也将临时进入睡眠状态。

对已锁定的互斥对象上锁定(可以调用pthread_mutex_lock()函数调用) 的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。

则在本发明实施例中,步骤207可以包括如下子步骤:

子步骤S61,第一写入器释放所述缓存队列;

子步骤S62,第二写入器锁定所述缓存队列;

子步骤S63,第二写入器通过所述缓存队列提供的读接口从所述缓存队列读取所述多媒体数据包。

在本发明实施例中,缓存队列作为互斥对象被保护,第一写入器Writer的线程释放缓存队列,则不能从缓存队列读取多媒体数据包,第二写入器Writer的线程锁定缓存队列,则能够从缓存队列读取多媒体数据包。

打包器Packetizer对其多媒体数据包的消费者,即写入器Writer(包括第一写入器Writer和第二写入器Writer)提供读取数据接口(read)的实现,即将读取请求read映射到缓存队列的读接口(get)上。

这样,无论是哪个写入器Writer(包括第一写入器Writer和第二写入器Writer)发出的读取请求read都能得到正确响应。

本发明实施例复用打包器,第一写入器和第二写入器的切换过程对于数据源、编码器、打包器而言是透明的,通过互斥锁保护的缓存队列,保证了第一写入器和第二写入器在切换时的数据同步。

本发明实施例配置两个写入器,将数据源持续采集的多媒体数据持续进行编码、打包,并存储在缓存队列中,当第一写入器封装第一多媒体文件接近完成时,切换至第二写入器进行第二多媒体文件的封装,在切换过程中,数据源、编码器、打包器等录制工具可以持续正常工作,避免了在切换时数据源、编码器、打包器等录制工具的关闭,进而避免了在切换后数据源、编码器、打包器等录制工具的初始化操作,保证了在切换时持续工作,避免了录制的空白,实现了无缝连续录制。

需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。

参照图3,示出了本发明的一种多媒体文件的录制装置实施例1的结构框图,具体可以包括如下模块:

录制工具创建模块301,用于在接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一多媒体写入器、第二多媒体写入器;

多媒体数据采集模块302,用于通过数据源持续采集多媒体数据;

编码模块303,用于由编码器持续对所述多媒体数据进行编码,并将编码之后的多媒体数据写入预置的缓存队列;

第一封装模块304,用于由第一多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第一多媒体文件;

文件大小判断模块305,用于判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则调用第二封装模块306;

第二封装模块306,用于切换至第二多媒体写入器从所述缓存队列读取编码后的多媒体数据,并写入第二多媒体文件。

在具体实现中,所述第一多媒体写入器包括第一写入器和第一打包器,所述第二多媒体写入器包括第二写入器和第二打包器。

在本发明的一种优选实施例中,所述第一封装模块304可以包括如下子模块:

第一读取子模块,用于由第一打包器从所述缓存队列读取编码之后的多媒体数据;

第一打包子模块,用于由第一打包器将编码之后的多媒体数据打包成多媒体数据包;

第一写入子模块,用于由第一写入器将所述多媒体数据包写入第一多媒体文件。

在本发明的另一种优选实施例中,所述第一封装模块304可以包括如下子模块:

封装完成事件生成子模块,用于在所述第一多媒体文件超过预设的文件大小阈值时,第一多媒体写入器生成封装完成事件;

封装完成事件广播子模块,用于由第一多媒体写入器广播所述封装完成事件。

在本发明的一种优选实施例中,所述文件大小判断模块305可以包括如下子模块:

封装完成事件判断子模块,用于判断是否接收到由第一多媒体写入器广播的封装完成事件;若是,则调用封装完成判断子模块;

封装完成判断子模块,用于判断所述第一多媒体文件超过预设的文件大小阈值。

在本发明的一种优选实施例中,所述第二封装模块306可以包括如下子模块:

停止子模块,用于停止第一打包器和第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动子模块,用于启动第二打包器和第二写入器;

第二读取子模块,用于由第二打包器从所述缓存队列读取编码之后的多媒体数据;

第二打包子模块,用于由第二打包器将编码之后的多媒体数据打包成多媒体数据包;

第二写入子模块,用于由第二写入器将所述多媒体数据包写入第二多媒体文件。

在本发明的另一种优选实施例中,所述缓存队列配置有互斥锁,所述第二封装模块306可以包括如下子模块:

释放子模块,用于由第一打包器释放所述缓存队列;

锁定子模块,用于由第二打包器锁定所述缓存队列;

接口读取子模块,用于由第二打包器通过所述缓存队列提供的读接口从所述缓存队列读取编码后的多媒体数据。

在本发明实施例的一种优选示例中,所述数据源可以包括摄像头和/或麦克风,所述多媒体数据可以包括视频数据和/或音频数据;

所述多媒体数据采集模块302可以包括如下子模块:

视频数据采集子模块,用于通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

音频数据采集子模块,用于通过预置的音频源类AudioSource从麦克风采集音频数据。

参照图4,示出了本发明的一种多媒体文件的录制装置实施例2的结构框图,具体可以包括如下模块:

录制工具创建模块401,用于在接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一写入器、第二写入器;

多媒体数据采集模块402,用于通过数据源持续采集多媒体数据;

编码模块403,用于由编码器持续对所述多媒体数据进行编码;

打包模块404,用于由打包器持续将编码之后的多媒体数据打包成多媒体数据包,并将所述多媒体数据包写入预置的缓存队列;

第一封装模块405,用于由第一写入器从所述缓存队列读取多媒体数据包,并写入第一多媒体文件;

文件大小判断模块406,用于判断所述第一多媒体文件是否超过预设的文件大小阈值;若是,则调用第二封装模块406;

第二封装模块407,用于切换至第二写入器从所述缓存队列读取多媒体数据包,并写入第二多媒体文件。

在本发明的一种优选实施例中,所述第一封装模块405可以包括如下子模块:

封装完成事件生成子模块,用于在所述第一多媒体文件超过预设的文件大小阈值时,第一写入器生成封装完成事件;

封装完成事件广播子模块,用于由第一写入器广播所述封装完成事件。

在本发明的一种优选实施例中,所述文件大小判断模块406可以包括如下子模块:

封装完成事件判断子模块,用于判断是否接收到由第一写入器广播的封装完成事件;若是,则调用封装完成判断子模块;

封装完成判断子模块,用于判断所述第一多媒体文件超过预设的文件大小阈值。

在本发明的一种优选实施例中,所述第二封装模块407可以包括如下子模块:

停止子模块,用于停止第一写入器,同时,第一写入器对所述第一多媒体进行保存处理;

启动子模块,用于启动第二写入器;

第二读取子模块,用于由第二写入器从所述缓存队列读取所述多媒体数据包。

在本发明的另一种优选实施例中,所述缓存队列配置有互斥锁,所述第二封装模块407可以包括如下子模块:

释放子模块,用于由第一写入器释放所述缓存队列;

锁定子模块,用于由第二写入器锁定所述缓存队列;

接口读取子模块,用于由第二写入器通过所述缓存队列提供的读接口从所述缓存队列读取所述多媒体数据包。

在本发明实施例的一种优选示例中,所述数据源可以包括摄像头和/或麦克风,所述多媒体数据可以包括视频数据和/或音频数据;

所述多媒体数据采集模块402可以包括如下子模块:

视频数据采集子模块,用于通过预置的摄像头源类CameraSource从摄像头采集视频数据;

和/或,

音频数据采集子模块,用于通过预置的音频源类AudioSource从麦克风采集音频数据。

对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。

本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。

最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。

以上对本发明所提供的一种多媒体文件的录制方法和一种多媒体文件的录制装置,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

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