发明内容
有鉴于此,本发明的主要目的在于提供一种视频文件的编辑方法和装置,能在接收采集的视音频流的同时实时地对视频数据进行编辑操作,并快速生成最终用于发布的视频片段文件,提高了对视频文件编辑的效率,保证了视频文件的时效性。
为达到上述目的,本发明的技术方案是这样实现的:
本发明提供了一种视频文件的编辑方法,该方法包括:
A、对采集到的视频采样Sample和音频Sample分别进行缓存;
B、根据缓存的视频Sample和音频Sample中的开始时间戳,对所述缓存的视频Sample和音频Sample进行同步;
C、从缓存中取出所述同步的视频Sample和音频Sample进行解码预览,同时配置文件头,生成片段文件,将所述同步的视频Sample和音频Sample连续写入所述片段文件;
D、根据所述片段文件中的视频Sample是否为关键帧的信息,确定所述片段文件的切分点,向所述正在写入同步视频Sample和音频Sample的片段文件添加索引信息,生成完整的片段文件。
步骤A之前,该方法还包括:
对视频数据和音频数据进行采集、压缩编码,并以视频Sample和音频Sample分别输出;
所述每个视频Sample中包含视频压缩编码数据及其采集时产生的开始时间戳、持续时间和是否为关键帧的信息,每个音频Sample包含音频压缩编码数据及对应的开始时间戳和持续时间。
步骤A所述一个视频Sample对应一个视频帧,所述每个视频Sample由采集到的视频数据、开始时间戳、持续时间和关键帧信息组成。
步骤B所述对缓存的视频Sample和音频Sample进行同步,具体包括:
a、记录第一个视频Sample进行缓存时的本地绝对时间TV1和采集该视频Sample时产生的开始时间戳tV1,以及第一个音频Sample的本地绝对时间TA1和开始时间戳tA1;
b、选取所述TV1和TA1中的较大者为本地绝对基准时间Tbase,设置视频Sample和音频Sample进行缓存时的缓存延时为ρ,且第一个视频Sample和音频Sample的本地render绝对时间为Tbase+ρ,并根据所述Tbase、ρ、tV1和tA1得到每个视频Sample和音频Sample的本地render绝对时间Tn。
c、轮询缓存的视频Sample和音频Sample,在Tn≥Tcurrent时,将所述缓存的视频Sample和音频Sample从缓存中取出,其中,Tcurrent表示轮询所述视频Sample或音频Sample的当前的本地绝对时间。
步骤D之后,该方法还包括:将所述各个完整的片段文件所对应的文件片断映射到流媒体处理开发包DES的时间线模型中的Source组件中,对片段文件进行编辑。
其中,所述对各个片段文件进行编辑之后,该方法还包括:对所述编辑后的片段文件进行发布。
本发明还提供了一种视频文件的编辑装置,该装置包括:
缓存模块,用于对采集到的视频Sample和音频Sample分别进行缓存;
同步模块,用于根据视频Sample和音频Sample中的开始时间戳对所述缓存模块中的视频Sample和音频Sample进行同步;
存储模块,用于从缓存模块中取出所述同步的视频Sample和音频Sample进行解码预览,同时配置文件头,生成片段文件,将所述同步的视频Sample和音频Sample连续写入所述片段文件;
切分模块,用于根据所述存储模块中片段文件的视频Sample是否为关键帧的信息,确定所述存储模块中片段文件的切分点,向所述正在写入同步视频Sample和音频Sample的片段文件添加索引信息,生成完整的片段文件。
其中,所述缓存模块进一步包括:
视频缓存子模块,用于缓存视频Sample;
音频缓存子模块,用于缓存音频Sample。
所述同步模块进一步包括:
信息记录子模块,用于记录第一个视频Sample进行缓存时的本地绝对时间TV1和采集该视频Sample时产生的开始时间戳tV1,以及第一个音频Sample的本地绝对时间TA1和开始时间戳tA1;
时间获取子模块,用于选取所述信息记录子模块中记录的TV1和TA1中的较大者为本地绝对基准时间Tbase,设置视频Sample和音频Sample进行缓存时的缓存延时为ρ,且第一个视频Sample和音频Sample的本地render绝对时间为Tbase+ρ,并根据所述Tbase、ρ、和所述信息记录子模块中的tV1、TA1得到所述每个视频Sample和音频Sample的本地render绝对时间Tn。
本发明提供的视频文件的编辑装置还包括:
采集模块,用于对视频数据和音频数据进行采集、压缩编码,并以视频Sample和音频Sample分别输出给所述缓存模块;
编辑模块,用于将所述生成模块中各个完整的片断文件所对应的片段文件,映射到DES的时间线模型中的Source组件中,对片段文件进行编辑;
发布模块,用于对所述编辑模块中编辑后的片段文件进行发布。
本发明视频编辑的方法和装置,采用基于关键帧的切分片段文件策略,可以保证写入新片段文件中的第一视频帧为关键帧,如此可以保证文件的正常播放;在切分后的片段文件中添加索引信息和文件头,可以保证实时地对片段文件进行编辑。
本发明将视音频的相对开始时间戳映射到本地绝对时间上,可以防止积累性的延时,并且,通过对缓存延时的设定,还可以精确的控制延时时间,提高预览效果。基于本发明的同步策略,能对视频数据和音频数据进行同步,保证了对WMV视频文件进行预览的良好效果;同时,还支持数据写入片段文件操作和切分片段文件的操作。
本发明通过同步策略和关键帧切分片段文件策略,可以使视音频数据同步,并且,对视频缓存和音频缓存进行快速轮询的策略,可以尽快地将同步的视频Sample和音频Sample从缓存中取出,进而快速地写入片段文件中,如此,可以防止由于网络抖动造成视音频数据在写入片段文件时不均匀的情况。
基于本发明的方法和装置,可以实时地对接收到的视频文件进行编辑,因为在编辑的同时使用了一个后台线程将编辑好的片段文件实时地写入发布文件中,所以,在编辑其他片段文件的同时,可以连续、快速地将已编辑好的片段文件生成最终发布的视频片段文件,如此,能提高视频文件的编辑和发布速度,保证实时视频文件的时效性。
具体实施方式
下面结合附图和具体实施例对本发明的技术方案进一步详细阐述。
本发明中,先将采集到的视频数据和音频数据按Sample分割,封装为视频流和音频流,经过网络传输给编辑端设备,由编辑端的视频缓存和音频缓存分别来存储视频Sample和音频Sample;之后,由于经过网络传输可能出现视频Sample和音频Sample的异步,所以需要对两个缓存中的视频Sample和音频Sample进行同步;然后,将同步的视频数据和音频数据进行解码预览,并将预览部分所对应的缓存中的数据写入片段文件中;最后,根据需要结合同步和切分片段文件策略,找到合适的切分点,向正在写入数据的片段文件添加索引信息,以生成完整的用于实时编辑的片段文件;并通过配置、添加文件头生成新的片段文件,将同步后的数据写入新的片段文件中。
本发明视频文件编辑方法的流程如图1所示,包括以下步骤:
步骤101,对视频数据和音频数据进行采集、压缩编码后,分别以视频Sample和音频Sample输出。
本发明中,由采集服务器来完成视频数据和音频数据的采集,在采集服务器中部署的采集硬件和相关采集程序对视频数据和音频数据进行采集,采集后由编码模块对数据进行压缩编码,然后,按采样Sample对采集到的数据进行分割,并打包成视频数据流和音频数据流,通过局域网或广域网分别输出给编辑端的视频缓存和音频缓存。
这里,一个Sample就是一个数据结构,一个视频Sample对应一个视频帧,一个视频Sample由采集到的视频数据、开始时间戳、持续时间和关键帧信息四个数据成员组成。其中,开始时间戳为采集该视频Sample的时刻;持续时间为开始采集该视频Sample到开始采集下一个视频Sample的时间间隔,可以称为视频的Sample间隔,一般视频的Sample间隔是固定不变的,如果视频的帧率为1s内25帧,那么其Sample间隔的间隔为40ms;通过关键帧信息可以判断出该视频帧是否为关键帧,只有当某段视频文件的第一帧是关键帧时,该视频文件才能正常播放,视频关键帧出现的频率由采集后的编码模块决定,采集视频Sample时由采集程序决定该视频帧是关键帧或非关键帧。
需要指出的是,对于音频来说,音频的Sample间隔不是固定的,一般情况下,1s内可以采集5个左右的音频数据包,一个数据包被封装在一个Sample中,一个数据包的持续时间在100ms到200ms之间。
步骤102,对采集到的视频Sample和音频Sample分别进行缓存。
将来自采集服务器的视频流和音频流分别在视频缓存中和音频缓存中进行缓存,在这两个缓存中,可采用链表节点的数据结构对视频Sample和音频Sample分别进行存储。采集服务器将采集到的视频数据和音频数据按Sample进行分割,一般采用链表节点的存储方式比较适合这种数据结构。图2所示为本发明缓存中的视频Sample和音频Sample的数据存储格式,其中201表示一个节点,202表示一个节点中的视频Sample或音频Sample,203表示指向下一个节点的指针。
需要指出的是,为了避免到达缓存中的数据倒序或者丢失,可以通过传输协议,如FTP等,保证从采集服务器传输到缓存的数据的可靠性,如此,每个视频Sample或音频Sample会按照采集时的开始时间戳顺序分别进入两个缓存中,在以后的处理过程中就不必再对缓存中的数据进行排序或修复。
步骤103~步骤104,根据缓存的视频Sample和音频Sample中的开始时间戳对缓存的视频Sample和音频Sample进行同步;将同步后的视频Sample和音频Sample分别从各自的缓存中取出,进行解码预览,同时配置文件头,生成片段文件,并且将同步的视频Sample和音频Sample写入片段文件。
采集服务器将采集到的视频数据和音频数据分别进行传输,那么视频数据和音频数据的网络传输链路就不同,如此,由于视频和音频数据在网络中的传输速度不同,会导致开始时间戳相同,即本来同步的视频Sample和音频Sample到达缓存的本地绝对时间不同,这样就造成两者失去同步。为了以后的处理过程顺利进行,必须对失去同步的视频Sample和音频Sample进行同步操作。
较佳地,可以采用以下的策略:
1、记录第一个视频Sample进入视频缓存中进行缓存时的本地绝对时间TV1和采集该视频Sample时产生的开始时间戳tV1,以及第一个音频Sample进入音频缓存中进行缓存时的本地绝对时间TA1和开始时间戳tA1。
2、选取TV1和TA1中的较大者为本地绝对基准时间Tbase,即Tbase=max(TV1,TA1),设置视频Sample和音频Sample进行缓存时的缓存延时为ρ,且第一个视频Sample和音频Sample的本地执行(render)绝对时间为Tbase+ρ,本地render绝对时间为当前的视频Sample或音频Sample解码预览和写入片段文件的时间。
根据下面的公式得到每个视频Sample和音频Sample的本地render绝对时间为:
其中,Tn表示第n个视频Sample和音频Sample的本地render绝对时间,tVn表示第n个视频Sample的开始时间戳,tAn表示第n个音频Sample的开始时间戳,n为正整数。
3、轮询视频缓存和音频缓存中的视频Sample和音频Sample,在Tn≥Tcurrent时,Tcurrent表示轮询某个视频Sample或音频Sample的当前的本地绝对时间,将视频Sample的Tn和音频Sample的Tn相等或近似相等(如,两者至之差远远小于Sample的间隔)的缓冲缓存中的视频Sample和音频Sample从缓冲缓存中取出,如此便可得到同步的视频Sample和音频Sample。这里,所说近似相等是指视频Sample的Tn和音频Sample的Tn两者之差远远小于Sample间隔。
其中,轮询的间隔应小于视频和音频Sample间隔的最小值,一般情况下,视频的Sample间隔小于音频的Sample间隔,如步骤101中所述,视频的Sample间隔一般为40ms,而音频的Sample间隔在100ms到200ms之间,所以轮询的间隔只要小于视频的Sample间隔即可。
需要指出的是,轮询的时间间隔决定了同步的精度,轮询的时间间隔越小同步的精度越高,所以在设置轮询的时间间隔时除了要小于视频的Sample间隔外,越小越好。在当前轮询的视频Sample和音频Sample写入片段文件后,在下一个轮询时刻到来时,再对缓存中的视频Sample和音频Sample进行轮询,因为轮询的间隔很小,所以在保证同步精度的同时,也保证了缓存中的数据不会溢出。
在得到同步的视频Sample和音频Sample后,对得到的视频Sample和音频Sample进行解压并预览,如此可以直观地判断需要编辑的某段视频文件;同时,需要配置文件头,生成片段文件,然后将所预览的没有解压的同步的视频Sample和音频Sample连续写入片段文件中。片段文件可以由一个磁盘产生,首先需要配置文件头,然后就生成了一个不完整的片段文件,因为该片段文件中不含有索引信息,因此不能对该片段文件进行编辑。其中,对于配置片段文件的文件头,可以通过配置Profile生成片段文件的文件头,将其添加进片段文件中,具体如何处理为现有技术,此处不再赘述。
步骤105,根据片段文件中的视频Sample是否为关键帧的信息,确定片段文件的切分点,向正在写入同步视频Sample和音频Sample的片段文件添加索引信息,生成完整的片段文件。
通过步骤104中的解码预览,可以直观的看到当前接收到的视频文件,如此可以确定需要编辑的片段文件,然后,需要确定该片段文件的切分点。具体的确定片段文件的切分点的方法如下:假设一个完整的WMV文件的时长为10分钟,如果通过预览看到,当前接收的文件已经到了本地时间第5分钟的内容,根据编辑需要,确定要对第0分钟到5分钟的片段文件进行编辑,那么需要找到本地时间第4分60秒所对应的视频帧,并通过该视频Sample中的关键帧信息判断出该帧是否为关键帧,如果是关键帧,那么将该关键帧对应的视频Sample切分到下一个片段文件中,该关键帧的上一个视频帧切分到当前的片段文件中,假设该视频帧对应的本地时间为第4分59秒,那么当前的片段文件中包含的数据为第0分0秒到第4分59秒的视频数据和与该段视频数据同步的音频数据;如果不是关键帧,那么找到距离该视频帧最近的关键帧,将该关键帧切分到下一个片段文件中,将该关键帧的上一个视频帧切分到当前的片段文件中。如此,找到片段文件的切分点后,对该片段文件添加索引信息,这样就生成了一个完整的片段文件,可以对其进行实时的编辑。其中对于添加索引信息,较佳地,可以通过使用流媒体处理开发包Windows Mdeia Format SDK提供的接口进行添加索引信息的操作,此为已有技术,这里不再详述。
当第一个完整的片段文件生成后,返回执行步骤104~105,磁盘重新配置文件头,生成新的片段文件,再将同步的视频Sample和音频Sample连续地写入片段文件中,然后再根据需要找到下一段需要编辑的片段文件的切分点,再添加索引信息,生成完整的片段文件,如此反复几次,直到需要编辑的该完整的视频文件传输完毕。如此,最后可生成几段完整的视频片段文件,如:一个完整的WMV文件的时长为10分钟,如果在第3分钟,第5分钟和第10分钟进行切分的话,那么最终可以产生三个片段文件,即0-3分钟,4-5分钟和6-10分钟的片段文件。
需要指出的是,在对写入片段文件的数据进行切分时,由于音频Sample的Sample间隔和视频Sample的Sample间隔不同,所以,会出现某一个音频Sample的持续时间比该音频Sample所对应的视频帧的持续时间长的情况,如果该视频帧是某一切分好的片段文件的最后一帧,则在这种情况下,将该视频帧对应的音频Sample切分到下一个片段文件中。
步骤106,将各个完整的片段文件映射到流媒体处理开发包DirectShowEditing Services(DES)的时间线模型中的Source组件中,对片段文件进行编辑。
对于已经生成的若干完整的片段文件,可以使用流媒体处理开发包DES提供的框架来实现对其进行编辑操作的回放支持。DES提供了一个时间线的模型来支持对视音频的编辑操作,将片段文件映射到DES的时间线模型中的Source组件中,具体如何将片段文件映射到DES的时间线模型中的Source组件中为现有技术,此处不再赘述。
图3所示为本发明中片段文件在DES时间线模型中的映射关系,其中,DES时间线模型包括:DES时间线模型(Composition)301,抽象轨道(Track)302,资源组件(Source)303;所有片段文件被映射到同一个Track 302下的多个Source组件303中,通过其他的Track 302,可以在编辑片段文件时加入logo、字幕或者其他视频、音频等,以获得叠加效果。对已生成的片段文件进行拆分、合并、移位、掐头去尾、增加标志(logo)、字幕等视频编辑操作,都是通过建立DES时间线模型,并使用其相关接口来实现的。
步骤107,对编辑后的片段文件进行发布。
为了更大的提高效率,可以使用一个后台线程对已经编辑好的部分提前写入最终用于发布的片段文件,而不必等着所有的片段文件都编辑好后再生成最终用于发布的片段文件,该步骤的实施通过现有技术便可实现,在此不再赘述。
为实现上述方法,本发明还提供了一种视频文件编辑装置,如图4所示,该视频文件编辑装置包括:采集模块10、缓存模块20、同步模块30、存储模块40、生成模块50、编辑模块60和发布模块70;其中,
采集模块10,用于对视频数据和音频数据进行采集,并进行压缩编码,最终以视频Sample和音频Sample分别输出;采集模块10可采用采集服务器。
缓存模块20,用于对来自采集模块20的视频Sample和音频Sample分别进行缓存。
缓存模块20进一步包括:视频缓存子模块21和音频缓存子模块22,其中,视频缓存子模块21,用于缓存视频Sample;音频缓存子模块22,用于缓存音频Sample。
同步模块30,用于根据视频Sample和音频Sample中的开始时间戳,对缓存模块20中的视频Sample和音频Sample进行同步。
同步模块30进一步包括信息记录子模块31、时间获取子模块32和数据触发子模块33,其中,
信息记录子模块31,用于记录第一个视频Sample进行缓存时的本地绝对时间TV1和采集该视频Sample时产生的开始时间戳tV1,以及第一个音频Sample的本地绝对时间TA1和开始时间戳tA1;
时间获取子模块32,用于选取信息记录子模块31中记录的TV1和TA1中的较大者为本地绝对基准时间Tbase,设置视频Sample和音频Sample进行缓存时的缓存延时为ρ,且第一个视频Sample和音频Sample的本地render绝对时间为Tbase+ρ,并根据下式得到所述每个视频Sample和音频Sample的本地render绝对时间为:
数据触发子模块33,用于轮询缓存模块20中的视频Sample和音频Sample,在Tn≥Tcurrent时,将视频Sample和音频Sample从缓存模块20中取出,其中Tcurrent表示轮询所述视频Sample或音频Sample的当前的本地绝对时间。
存储模块40,用于将从缓存模块20中取出的经过同步模块30同步的视频Sample和音频Sample进行解码预览,同时配置文件头,生成片段文件,将同步的视频Sample和音频Sample连续写入片段文件。
切分模块50,用于根据所述存储模块40中片段文件的视频Sample是否为关键帧的信息,确定存储模块40中所述片段文件的切分点,向所述正在写入同步视频Sample和音频Sample的片段文件添加索引信息,生成完整的片段文件。
当切分模块50生成一个完整的片段文件后,再进行存储模块40的操作,确定下一个需要片剂的片段文件,然后配置文件头生成新的片段文件,将同步的视频Sample和音频Sample连续写入片段文件;之后,再执行切分模块50的操作,确定该片段文件的切分点,然后添加索引信息,生成新的完整的片段文件,直到处理完整个视频文件。
编辑模块60,用于将切分模块50中各个完整的片段文件映射到流媒体处理开发包DirectShow Editing Services(DES)的时间线模型中的Source组件中,对片段文件进行编辑。
发布模块70,用于对编辑模块60中编辑后的片段文件进行发布。
其中,采集模块10、视频缓存子模块21、音频缓存子模块22、信息记录子模块31、时间获取子模块32、数据触发子模块33、编辑模块60和发布模块70是可选的。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。