一种多媒体文件的录制方法和装置的制造方法_3

文档序号:9330996阅读:来源:国知局
br>[0186]第一打包器Packetizer、第一写入器Writer、第二打包器Packetizer和第二写入器Writer均有一个工作的线程。
[0187]通过关闭第一打包器Packetizer、第一写入器Writer工作的线程,停止第一写入器的工作,将第一多媒体写入器MediaWriter切换至备用状态。
[0188]通过启动第二打包器Packetizer、第二写入器Writer工作的线程,启动第二写入器的工作,将第二多媒体写入器MediaWriter切换至工作状态。
[0189]第二打包器Packetizer继续读取编码器Codec输出的码流,负责将编码器Codec输出的码流分割打包,以便于存储或者传输。
[0190]第二写入器Writer将第二打包器Packetizer打包好的多媒体数据包写入第二多媒体文件中。
[0191]当然,若第二写入器Writer在检测到第二多媒体文件超过文件大小阈值,则可以生成封装完成事件,广播至控制器Controller,通知控制器Controller已接近完成第二多媒体文件的封装,再次切换至第一多媒体写入器MediaWriter继续进行封装。
[0192]具体而言,控制器Controller发送一个停止消息给第一打包器Packetizer、第一写入器Writer,当第一打包器Packetizer、第一写入器Writer在接收到该停止消息时,可以关闭第一打包器Packetizer、第一写入器Writer工作的线程,同时,第一写入器Writer对第一多媒体进行保存处理,一般包括第一多媒体文件的写入、头信息的保存和文件关闭。
[0193]其中,头信息可以包括编码信息等,用于后续的播放。
[0194]控制器Controller发送一个启动消息给第二打包器Packetizer、第二写入器Writer,当第二打包器Packetizer、第二写入器Writer在接收到该启动消息时,可以启动第二打包器Packetizer、第二写入器Writer工作的线程。
[0195]需要说明的是,本发明实施例可以对StageFrightRecorder框架进行修改,在进行多媒体写入器MediaWriter的切换,即关闭其中一个多媒体写入器MediaWriter、启动另一个多媒体写入器MediaWriter时,不停止其他录制工具(即数据源DataSource、编码器Codec)的工作,另一个多媒体写入器MediaWriter启动后,可以正常监听编码器Codec的输出信息。
[0196]当然,若监听到录制结束指示,如用户在用户通过摄像头应用点击指定的控件(如录像结束控件),则可以停止所有录制工具的工作,即控制器Controller可以发消息通知数据源DataSource、编码器Codec、和工作的多媒体写入器MediaWriter停止工作。
[0197]在本发明的另一种优选实施例中,所述缓存队列配置有互斥锁,以对缓存队列进行保护。
[0198]具体而言,互斥锁可以提供一种相互排斥的方法,通过线程的锁定和解锁,对于某一数据结构,确保某一时刻只能有一个线程能够访问它,即两个线程不能同时对同一个互斥对象加锁。
[0199]如果线程a试图锁定一个互斥对象,而此时线程b已锁定了同一个互斥对象时,线程a就将进入睡眠状态。
[0200]一旦线程b释放了互斥对象(可以通过pthread_mutex_unlock()调用),线程a就能够锁定这个互斥对象(即线程a可以从pthread_mutex_lock()函数调用中返回,同时互斥对象被锁定)。
[0201]同样地,当线程a正锁定互斥对象时,如果线程c试图锁定互斥对象的话,线程c也将临时进入睡眠状态。
[0202]对已锁定的互斥对象上锁定(可以调用pthread_mutex_lock()函数调用)的所有线程都将进入睡眠状态,这些睡眠的线程将“排队”访问这个互斥对象。
[0203]则在本发明实施例中,步骤106可以包括如下子步骤:
[0204]子步骤S31,第一打包器释放所述缓存队列;
[0205]子步骤S32,第二打包器锁定所述缓存队列;
[0206]子步骤S33,第二打包器通过所述缓存队列提供的读接口从所述缓存队列读取编码后的多媒体数据。
[0207]在本发明实施例中,缓存队列作为互斥对象被保护,第一打包器Packetizer的线程释放缓存队列,则不能从缓存队列读取编码之后的多媒体数据,第二打包器Packetizer的线程锁定缓存队列,则能够从缓存队列读取编码之后的多媒体数据。
[0208]编码器Codec对其编码之后的多媒体数据的消费者,即打包器Packetizer (包括第一打包器Packetizer和第二打包器Packetizer)提供读取数据接口(read)的实现,即将读取请求read映射到缓存队列的读接口(get)上。
[0209]这样,无论是哪个打包器Packetizer (包括第一打包器Packetizer和第二打包器Packetizer)发出的读取read请求都能得到正确响应。
[0210]本发明实施例复用编码器,第一多媒体写入器和第二多媒体写入器的切换过程对于数据源、编码器而言是透明的,通过互斥锁保护的缓存队列,保证了第一多媒体写入器和第二多媒体写入器在切换时的数据同步。
[0211]本发明实施例配置两个多媒体写入器,将数据源持续采集的多媒体数据持续进行编码并存储在缓存队列中,当第一多媒体写入器封装第一多媒体文件完成时,切换至第二多媒体写入器进行第二多媒体文件的封装,在切换过程中,数据源、编码器等录制工具可以持续正常工作,避免了在切换时数据源、编码器等录制工具的关闭,进而避免了在切换后数据源、编码器等录制工具的初始化操作,保证了在切换时持续工作,避免了录制的空白,实现了无缝连续录制。
[0212]参照图2,示出了本发明的一种多媒体文件的录制方法实施例2的步骤流程图,具体可以包括如下步骤:
[0213]步骤201,当接收到多媒体文件的录制请求时,创建数据源、编码器、打包器、第一写入器、第二写入器;
[0214]需要说明的是,本发明实施例可以应用于具有摄像头的电子设备,例如,手机、平板电脑、智能可穿戴设备(如智能手表、智能眼镜)、行车记录仪、视频监控器等等。
[0215]这些电子设备大多可以支持WindowsPhone、Android (安卓)、1S、Windows等操作系统,通常可以运行录制视频的应用,如摄像头应用,实现录像功能。
[0216]为使本领域技术人员更好地理解本发明实施例,在本发明实施例中,Android作为操作系统的一种示例进行说明。
[0217]Android 一种基于Linux的自由及开放源代码的操作系统,大致可以划分为四个层,从高层到低层分别是应用程序层(Applicat1ns)、应用程序框架层(Applicat1nFramework)、系统运行库层(Libraries)和 Linux 核心层(Linux Kernel)。
[0218]进一步而言,Android系统是在Linux系统上增加了 Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个Java的Applicat1n Framework,应用程序是基于JAVA的Applicat1n Framework之上运行的,因此,大致可以将Applicat1n Framework划分为Java 层和 Native 层。
[0219]在具体实现中,多媒体文件的录制请求可以是指用户通过摄像头应用点击指定的控件(如录像开始控件)等方式发出的进行录像的指示。
[0220]当接收到多媒体文件的录制请求时,可以创建多媒体录制对象MediaRecorder,多媒体录制对象MediaRecorder对象创建多媒体录制服务实例StageFrightRecorder,StageFrightRecorde根据从录制视频的应用接收来的设置(如编码格式)和控制消息创建数据源DataSource、编码器Codec、第一多媒体写入器MediaWriter、第二多媒体写入器MediaWriter,即多媒体录制服务实例StageFrightRecorder可以扮演控制器Controller的角色,完成录制工具的创建和设置。
[0221]具体而言,录制视频的应用可以在创建一个Java层的MediaRecorder对象,实现录音和录像。
[0222]MediaRecorder对象是通过应用程序框架层的录制服务模块MPS创建录制服务实例--StageFrightRecorder,控制多媒体文件的录制。
[0223]其中,StagefrightRecorder是MPS创建的用于录制操作的实体对象。
[0224]录制视频的应用和MPS之间通过AIDL接口实现进程间通信,为了摄像头应用开发方便,Android系统提供了封装好的帮助类。
[0225]如录制视频的应用通过MediaRecorder对象和MediaRecorderClient实现和MPS交流。
[0226]MediaRecorder对象是运行在录制视频的应用的进程空间里面,代表MPS,MediaRecorderClient运行在多媒体服务器进程空间里面代表录制视频的应用。
[0227]需要说明的是,为了实现热备份机制,本发明实施例可以在Native层修改控制器Controller的控制逻辑和增加一个媒体写入器MediaWriter,在Java层增加连续录制的控制参数。
[0228]其中,第一多媒体写入器MediaWriter和第二多媒体写入器MediaWriter互为工作的多媒体写入器MediaWriter和备份的多媒体写入器MediaWriter。
[0229]而在本发明实施例中,第一多媒体写入器MediaWriter可以为工作的多媒体写入器MediaWriter,第二多媒体写入器MediaWriter可以为备份的多媒体写入器MediaWriter。
[0230]Android原生的多媒体录制框架简化了打包器Packetizer和写入器Writer的设计,将二者的功能合成在一个多媒体写入器MediaWriter中。
[0231]即在本发明实施例中,第一多媒体写入器MediaWriter可以包括第一写入器Writer和打包器Packetizer,第二多媒体写入器MediaWriter可以包括第二写入器Writer和打包器Packetizer,则第一写入器Writer与第二写入器Writer复用打包器Packetizer。
[0232]步骤202,通过数据源持续采集多媒体数据;
[0233]在具体实现中,数据源DataSource可以包括摄像头Camera和/或麦克风MIC,多媒体数据可以包括视频数据和/或音频数据;
[0234]则在本发明实施例中,可以通过预置的摄像头源类CameraSource从摄像头Camera采集视频数据,如YUV数据;
[0235]和/ 或,
[0236]可以通过预置的音频源类Aud1Source从麦克风MIC采集音频数据,如PCM数据。
[0237]步骤203,编码器持续对所述多媒体数据进行编码;
[0238]录制的多媒体数据传输过程是消息驱动的,数据源DataSource产生多媒体数据的消息被注入编码器Codec的消息队列。
[0239]编码器Codec检测到该消息后,可以调用MediaSource (Android平台的数据源类型)的read函数来获取视频数据、音频数据,按照设定的编码格式进行编码,压缩视频数据、音频数据为各种编码格式的数据。
[0240]其中,对多媒体数据进行编码,指通过特定的压缩技术,如H.261、H.263、H.264等,将某个视频格式的文件转换成另一种视频格式文件的方式。
[0241]步骤204,打包器持续将编码之后的多媒体数据打包成多媒体数据包,并将所述多媒体数据包写入预置的缓存队列;
[0242]打包器Packetizer读取编码器Codec输出的码流,负责将编码器Codec输出的码流分割打包,以便于存储或者传输。
[0243]打包器Packetizer可以将打包好的多媒体数据包存储在一个内部的缓存队列里。
[0244]具体而言,缓存队列对外部对象提供了写接口(put)和读接口(read),打包器Packetizer可以调用该写接口(put),将打包
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1