具体实施方式
本发明实施例所提供的媒体录制方法为:在媒体录制过程中,周期性地根据当前已写入的媒体数据块生成媒体索引信息,保存所生成的媒体索引信息。由于索引信息不是在录制结束后一次性生成并保存,因此,当存储空间不足导致录制异常终止时,也能够保证录制终止之前所保存的媒体数据可以正常播放。
下面将结合附图,对本发明的具体实施方案进行详细说明。
图2所示为本发明实施例的媒体录制方法流程图,具体描述如下:
S101,根据当前已写入的媒体数据块生成媒体索引信息。
S102,保存所生成的媒体索引信息。
媒体录制开始后,经过t1时长,终端会顺序执行步骤S101和S102,在执行完S102之后,每经过t1时长,会再次执行S101,这样往复循环,相当于终端根据当前已经写入存储空间的媒体数据的变化,动态对媒体索引信息进行更新,因此,当存储空间不足导致录制异常终止时,也能够保证录制终止之前所保存的媒体数据可以正常播放。
在图1所示的媒体文件存储格式示意图中,媒体索引信息是写入媒体文件的尾部,即存储于所有媒体数据块之后,这个存储顺序也与现有技术的媒体文件数据写入时序相一致。这种存储格式,如果应用于上述的本发明技术方案,每隔周期t1后,在上一周期刚刚写入的数据块之后写入索引信息,就会造成数据块的存储位置不连续,进而导致产生存储空间碎片、影响数据读取性能等问题。
为解决上述问题,在本发明的优选实施例中,提供一种优化的媒体文件存储格式,参见图3所示,当录制开始之后,在开始写入媒体数据块之前,先预留出一块用于保存媒体索引信息的空间,后续的媒体数据块将写入所述预留数据块之后的空间。
其中,参见图4所示,所预留空间大小,可以按照如下的步骤计算:
S201,开始录制媒体时,获取可用存储空间的大小S0;
即获取在开始录制媒体时的可用存储空间大小S0,存储空间大小一般以字节单位bytes表示,或者Kb、Mb等。
S202,将录制媒体所应用的编码速率,转换为存储单位时间的媒体数据所需占用的存储空间V;
媒体编码速率,一般以bps表示,即比特每秒。(编码速率是在录制开始时就确定的,如果是固定码率编码方式,那么这个数值在编码过程中一直保持不变,如果非固定码率编码方式,需要在编码之前确定一个编码速率的平均值。)将编码速率的数值除以8,就可以得到存储每秒媒体数据所需占用的存储空间V的数值,V的单位为bytes/s(或Kb/s、Mb/s等)。
例如,媒体编码速率为128kbps,则存储每秒该媒体数据所需占用的存储空间大小为16kb,即V=16kb/s。
需要说明的是,如果所录制的媒体同时包括音频和视频,则上述的媒体编码速率应该为两种编码速率之和。例如,录制媒体时,采用64kbps的音频编码速率、384kbps的视频编码速率,则存储每秒该媒体数据所需占用的存储空间大小为(64+384)/8=56kb,即V=56kb/s。
S203,根据录制媒体所应用的编码方式,得到建立单位时间媒体数据的索引所需占用的存储空间U;
媒体数据索引占用的存储空间大小,取决于该媒体文件中所包含的数据取样(Sample)的数量。媒体数据是以数据块(Chunk)的形式存在于媒体文件中,而每个Chunk中会包含若干数量的Sample。对于每个Sample来说,在建立数据索引时,需要对应保存该Sample的时戳信息、所属媒体数据块(Chunk)在媒体文件中的位置,该Sample在此Chunk中的位置偏移、关键帧属性等4类重要内容,假设每个内容需要占用4bytes的存储空间,那么每个Sample所对应的索引空间占用量即为16bytes。
一般来说,每个Chunk代表固定单位时间(通常是1s)媒体数据,而每个Chunk中会包含若干数量的Sample,这个数量由录制媒体所应用的编码方式所决定。例如,AMR音频编码格式是以20ms的音频数据作为一个音频Sample进行处理,则在一个代表1s数据的音频Chunk中,就包含有50个音频Sample。这样,就可以进一步得到建立每秒媒体数据的索引所需占用的存储空间U,其单位为bytes/s(或Kb/s、Mb/s等)。例如,通过上面的例子,我们可以得到:建立每秒AMR音频数据的索引所需占用的存储空间为16*50=800bytes,即U=800bytes/s。
与S202所述类似,如果所录制的媒体同时包括音频和视频,则计算上述占用空间时,应同时考虑单位时间的音频数据和视频数据。例如,录制媒体时,采用15fps的QVGA视频编码格式、AMR的音频编码格式,则建立每秒该媒体数据的索引所需占用的存储空间为16*(15+50)=1040bytes,即。
根据以上步骤的描述不难看出,S0/V的值,实际上就是在开始录制时所预估的最大允许录制时间,将该值乘以U所得到的数值就是我们所需预留空间的大小。
例如,在开始录制媒体时的可用存储空间大小S0=100Mb、U=1040bytes/s、V=56kb/s,
则预留空间的大小为:
考虑到非固定码率编码方式的误差,我们可以取一个稍微大于计算结果的数值作为预留空间的大小(例如把计算结果的数值增加一定的百分比),这个预留空间的大小,即可以在S0全部用来录制媒体的情况下,确保索引信息的正确写入。并且索引信息的存储不会影响媒体数据块的写入连续性,避免出现更多的存储空间碎片,减少由于数据写入不连续对数据读取性能的影响。
在本发明的另一优选实施例中,我们还可以通过动态调整周期t1,来进一步提高存储空间的利用率。具体方案描述如下:
可以理解的是,在媒体录制刚开始时,如果剩余的可用存储空间较大,那么此时所录制的媒体文件是相对“安全”的,则此时可以选用较大的t1值,降低生成并保存索引信息的频率,以节省系统资源。在录制过程中,随着可用存储空间的不断减小,录制任务被其他写入数据任务所中断的可能性也越来越大,此时应相应提高生成并保存索引信息的频率,即减小t1的值。以确保能够尽量利用剩余的可用空间,保存更多的有效媒体数据。
上述方法,原则上是根据动态获取的当前剩余的可用存储空间St,来调整周期t1,但是在实际的业务操作中,应该根据媒体编码速率,来衡量存储空间的相对大小。因此,我们选择依据St/V的值来调整t1的大小,具体来说,可以预先设定一个或多个调整门限值,当St/V小于该调整门限值时,相应的减小t1,例如:
媒体开始录制时,t1=60s;
当St/V<300s时,t1=30s;
当St/V<180s时,t1=10s;
当St/V<120s时,t1=5s;
当St/V<60s时,t1=2s;
应用上述设定,相当于根据当前剩余的可用空间St所允许的最大录制时间的减小,动态减小t1的值。这样,一方面使得在存储空间较充裕时,可以以较低的数据操作频率来节省系统资源,另一方面,当存储空间不足时,通过提高生成并保存索引的频率,使得剩余的可用空间能够尽可能的保存更多的有效媒体数据。
此外,我们还可以进一步设定一个停止门限值,当St/V小于此停止门限值时,则自动停止媒体录制。例如,根据上面的例子,我们可以将停止门限值设为30s。当St/V值小于这个门限值时。后续的录制操作很可能已经无法得到有效保存了,因此,终端根据当前已写入的媒体数据块生成媒体索引信息并保存,结束录制任务,以避免后续可能进行的无效操作。
需要说明的是,上述调整门限值的设定方式仅为示意性说明,本领域技术人员可以根据实际需求,采用其他的门限调整方式,本发明实施例对此不加以限定。
可以理解的是,上述的实现动态获取当前剩余的可用存储空间St操作,对于该操作来说,也有一个执行周期t2,对于该t2,也可以采用与t1类似的调整方式,即根据所获取的当前剩余可用存储空间St,来调整周期t2。具体的调整方式与t1类似,这里不再赘述。需要注意的是,只有动态获取可用空间的操作频率不小于动态生成并保存索引信息的频率时,才能保证t1的调整是及时有效的,因此t1在数值上应该不小于t2。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
相应于上面的方法实施例,本发明实施例还提供一种媒体录制装置,参见图5所示,包括:
索引信息生成单元301,用于在媒体录制过程中,周期性地根据当前已写入的媒体数据块生成媒体索引信息;
索引信息保存单元302,用于保存所述索引信息即时生成单元301生成的媒体索引信息。
参见图6所示,该装置还可以包括:
预留空间计算单元303,用于计算在写入媒体数据块之前,所预留的用于保存媒体索引信息的空间大小。
所述预留空间计算单元具体可以包括:参数获取子单元,用于获取可用存储空间的大小S0、将录制媒体所应用的编码速率,转换为存储单位时间的媒体数据所需占用的存储空间大小V,及根据录制媒体所应用的编码方式,得到建立单位时间媒体数据的索引所需占用的存储空间大小U;
参见图7所示,该装置还可以包括:
存储空间检测单元304,用于在录制过程中,周期性地获取当前可用存储空间的大小St。
第一周期调整单元305,用于根据当前可用存储空间的大小St,调整所述生成媒体索引信息的周期t1。所述第一周期调整单元可以包括第一周期调整子单元,用于当
的值小于预设的调整门限值时,则减小周期t1。
参见图8所示,图7所示的装置还可以包括:
第二周期调整单元306,用于根据当前可用存储空间的大小St,调整所述存储空间检测单元304获取当前可用存储空间大小的周期t2。所述第二周期调整单元可以包括第二周期调整子单元,用于当
的值小于预设的调整门限值时,则减小周期t2,且t2小于等于t1。
所述媒体录制装置还可以包括:停止录制单元,用于当
的值小于预设的停止门限值时,停止媒体录制,通知所述索引信息保存单元根据当前已写入的媒体数据块生成媒体索引信息,保存所生成的媒体索引信息。
应用上述的媒体录制装置,在媒体录制过程中,周期性地生成媒体索引信息并对其进行保存。如果终端在录制媒体的同时还执行了其他写入任务,那么即使存储空间变化超出预期导致录制异常终止,在录制终止之前所保存的媒体数据也能够正常播放,保证了媒体录制任务的健壮性。进一步的,还可以在录制过程中,根据所剩余的可用空间大小,动态调整生成索引信息的周期,例如在可用空间小于预设的门限值时,减小所述周期,也即加大生成索引信息的频率,以确保能够尽量利用剩余的可用空间,保存更多的有效媒体数据。
对于装置实施例而言,由于其基本相应于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
以上所述仅是本发明的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。