一种任意帧率视频文件拼接方法转让专利

申请号 : CN202011187951.6

文献号 : CN112019880B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胡一凡张宇殷力李晓聪

申请人 : 南斗六星系统集成有限公司

摘要 :

一种任意帧率视频文件拼接方法,包括:获取待拼接的视频文件,确定待拼接的视频文件拼接顺序;分别获取待拼接视频文件的帧率,对视频文件格式和数据正确性进行判断;根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。本发明通过找寻最小视频帧率,参与拼接文件以最小视频帧率为参照,以自身视频帧率为周期,均匀丢帧,保证每段参与拼接的视频在拼接后帧率统一、各自播放时长不变,音视频同步,从而保证拼接生成的视频文件总体性能良好。本发明逻辑简单,易实现。拼接效果好,磁盘占用空间小。可行性和可靠性高,适用范围广。

权利要求 :

1.一种任意帧率视频文件拼接方法,其特征在于,包括:

S100.获取待拼接的视频文件,确定待拼接的视频文件拼接顺序;

S200.分别获取待拼接视频文件的帧率,对视频文件格式和数据正确性进行判断;

S300.根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;

具体的,S300中,拼接装置预设第一规则包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率不等于第二帧率时,获取两者较小的帧率赋值给目标视频文件的帧率,对较小帧率的待拼接视频文件进行编解码和重新赋值时间戳,然后写入目标视频文件;拼接装置预设第一规则还包括:对帧率较大的视频文件中的音频进行编解码和重新赋值时间戳,对帧率较大的视频文件中的视频进行解码,生成原始YUV数据,丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,判断原始YUV数据是保留还是丢弃,若判定此YUV数据保留,编码此YUV数据生成视频帧,为编码生成的视频帧重新赋值时间戳,赋值时间戳后的音视频帧写入目标视频文件,若判定此YUV数据丢弃,终止此帧数据处理,读取文件下一帧音视频数据;

具体的,丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,包括:对帧率较大的视频文件的帧率与目标视频文件的帧率计算,分别获取两者作商运算后的商QuotientValue和余值ResidualValue,当余值ResidualValue为0时,按每QuotientValue帧取1帧的规律连续丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,模块内部统计被调用的次数Count,当Count对QuotientValue取余的值为1,丢帧模块通知拼接装置此帧保留,否则,通知拼接装置此帧丢弃,当Count值等于帧率较大的视频文件的帧率时,将Count置为0,准备下一个丢帧周期到来;

丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,还包括:

当余值ResidualValue不为0时,丢帧模块持续、交替的按每QuotientValue帧取1帧、每(QuotientValue + 1)帧取1帧的方式判断拼接装置读取的当前帧是否丢弃;

需要丢帧的视频文件被解码一帧视频后,拼接装置就调用一次丢帧模块,丢帧模块内部统计被调用的次数Count和已经保留的视频帧数Num,若已保留的视频帧数Num加上周期内剩余帧能保留的最大帧数RemainNum值的和小于目标视频文件的帧率,则通知拼接装置保留当前帧,否则通知拼接装置丢弃当前帧;当Count值等于帧率较大的视频文件的帧率时,将Count、Num值均置为0,准备下一个丢帧周期到来;

周期内剩余帧能保留的最大帧数RemainNum值公式为:

其中,SrcFps表示待拼接视频文件帧率较大的视频文件的帧率,Count表示丢帧模块被调用次数,QuotientValue表示帧率较大的视频文件的帧率与目标视频文件的帧率作商运算后的商值;

S400.当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,将视频文件拼接完成。

2.如权利要求1的一种任意帧率视频拼接方法,其特征在于,S100中,待拼接视频文件格式至少包括:MP4、FLV、WMV、AVI和MPEG之一。

3.如权利要求1的一种任意帧率视频拼接方法,其特征在于,S200中,对视频文件格式和数据正确性进行判断的方法为:获取待拼接视频文件,获取待拼接视频文件的音视频流信息和视频帧率,创建对应的编解码器,若能创建对应的编解码器,则判定当前待拼接视频文件格式和数据正确。

4.如权利要求1的一种任意帧率视频拼接方法,其特征在于,S300中,拼接装置预设第一规则还包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率等于第二帧率时,将当前帧率赋值给目标视频文件的帧率,开始编解码待拼接视频文件中音视频数据,为编码生成的音视频重新赋值时间戳后写入目标视频文件,视频帧重新赋值时间戳依赖目标视频文件的帧率。

5.如权利要求1的一种任意帧率视频拼接方法,其特征在于,丢帧预设第二规则还包括:对每个周期第一帧视频数据,丢帧模块直接通知拼接装置保留,从周期内的第二帧开始,拼接装置向需要丢帧的视频文件逐帧读取周期内剩余帧,剩余帧中的每一帧由丢帧模块持续、交替的按每QuotientValue帧取1帧、每(QuotientValue + 1)帧取1帧的方式判断是丢弃还是保留。

说明书 :

一种任意帧率视频文件拼接方法

技术领域

[0001] 本发明涉及的是视频拼接技术领域,特别涉及一种任意帧率视频文件拼接方法。

背景技术

[0002] 随着网络通信技术的飞速发展,人们娱乐方式越来越多样化,网红直播、短视频、网剧、网络电影等基于流媒体的快时尚更是火爆现今网络。为了增强视频趣味性,用户会操作视频文件播放速度、为视频文件添加背景音乐、剪辑视频文件和拼接任意视频文件等。
[0003] 视频拼接,是将两个或两个以上视频文件按指定顺序连成一个视频文件,视频若配有音频,音频也一同拼接。每个参与拼接的视频文件含有独自的播放时长、音视频数目和视频帧率等属性,拼接生成的视频文件也含有上述属性。视频拼接装置不仅要实现视频拼接功能,也要保证拼接性能,如拼接前后播放时长不变,拼接生成视频文件满足能被再次正常拼接、占用磁盘空间无明显变大、播放画面流畅、音视频同步等。视频帧率,指视频每秒钟显示的图片数目。现有技术中,若所有参与拼接的视频文件帧率均相同,上述拼接性能容易保证,若所有参与拼接的视频文件帧率不完全相同,则很难保证上述拼接性能。

发明内容

[0004] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种任意帧率视频文件拼接方法。
[0005] 一种任意帧率视频文件拼接方法,其特征在于,包括:
[0006] S100.获取待拼接的视频文件,确定待拼接的视频文件拼接顺序;
[0007] S200.分别获取待拼接视频文件的帧率,对视频文件格式和数据正确性进行判断;
[0008] S300.根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;
[0009] S400.当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。
[0010] 进一步地,S100中,待拼接视频文件格式至少包括:MP4、FLV、WMV、AVI和MPEG。
[0011] 进一步地,S200中,对视频文件格式和数据正确性进行判断的方法为:获取待拼接视频文件,获取待拼接视频文件的音视频流信息和视频帧率,创建对应的编解码器,若能创建对应的编解码器,则判定当前待拼接视频文件格式和数据正确。
[0012] 进一步地,S300中,拼接预设第一规则包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率等于第二帧率时,将当前帧率赋值给目标视频文件的帧率,开始编解码待拼接视频文件中音视频数据,为编码生成的音视频重新赋值时间戳后写入目标视频文件,视频帧重新赋值时间戳依赖目标视频文件的帧率。
[0013] 进一步地,S300中,拼接预设第一规则还包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率不等于第二帧率时,获取两者较小的帧率赋值给目标视频文件的帧率,对较小帧率的待拼接视频文件进行编解码和重新赋值时间戳,然后写入目标目标视频文件;
[0014] 进一步地,S300中,拼接预设第一规则还包括:对帧率较大的视频文件中的音频进行编解码和重新赋值时间戳,对帧率较大的视频文件中的视频进行解码,生成原始YUV数据,丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,判断原始YUV数据是保留还是丢弃,若判定此YUV数据保留,编码此YUV数据生成视频帧,为编码生成的视频帧重新赋值时间戳,赋值时间戳后的音视频帧写入目标视频文件,若判定此YUV数据丢弃,终止此帧数据处理,读取文件下一帧音视频数据。
[0015] 进一步地,丢帧预设第二规则包括:对帧率较大的视频文件的帧率与目标视频文件的帧率计算,分别获取两者作商运算后的商值QuotientValue和余值ResidualValue,当余值ResidualValue为0时,按每QuotientValue帧取1帧的规律连续丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,模块内部统计被调用的次数Count,当Count对QuotientValue取余的值为1,丢帧模块通知拼接装置此帧保留,否则,通知拼接装置此帧丢弃,当Count值等于帧率较大的视频文件的帧率时,将Count置为0,准备下一个丢帧周期到来。
[0016] 进一步地,丢帧预设第二规则还包括:当余值ResidualValue不为0时,丢帧模块持续的按每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律丢帧,即每(QuotientValue * 2 + 1)帧取2帧的规律丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,丢帧模块内部统计被调用的次数Count和已经保留的视频帧数Num,若已保留的视频帧数Num加上周期内剩余帧能保留的最大帧数RemainNum值的和小于目标视频文件的帧率,则通知拼接装置保留当前帧,否则通知拼接装置丢弃当前帧;当Count值等于帧率较大的视频文件的帧率时,将Count、Num值均置为0,准备下一个丢帧周期到来。
[0017] 进一步地,周期内剩余帧能保留的最大帧数RemainNum值公式为:
[0018]
[0019] 其中,SrcFps表示待拼接视频文件帧率较大的视频文件的帧率,Count表示丢帧模块被调用次数,QuotientValue表示帧率较大的视频文件的帧率与目标视频文件的帧率作商运算后的商值。
[0020] 进一步地,丢帧预设第二规则还包括:对每个周期第一帧视频数据,丢帧模块直接通知拼接装置保留,从周期内的第二帧开始,拼接装置计算周期内剩余帧持续采用每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律进行丢帧。
[0021] 本发明实施例提供的上述技术方案的有益效果至少包括:
[0022] 本发明公开的一种任意帧率视频文件拼接方法,通过获取待拼接的视频文件,确定待拼接的视频文件拼接顺序,对视频文件格式和数据正确性进行判断;若待视频文件格式和数据正确,分别获取待拼接视频文件的帧率;根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。本发明通过找寻最小视频帧率,参与拼接文件以最小视频帧率为参照,以自身视频帧率为周期,均匀丢帧,保证每段参与拼接的视频在拼接后帧率统一、各自播放时长不变,音视频同步,从而保证拼接生成的视频文件总体性能良好。本发明逻辑简单,易实现。拼接效果好,磁盘占用空间小。可行性和可靠性高,适用范围广。
[0023] 下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。

附图说明

[0024] 附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
[0025] 图1为本发明实施例1中,一种任意帧率视频文件拼接方法的流程图;
[0026] 图2为本发明实施例2中,丢帧视频文件拼接流程图;
[0027] 图3为本发明实施例2中,余值ResidualValue非0丢帧模块处理流程图;
[0028] 图4为本发明实施例2中,余值ResidualValue为0丢帧模块处理流程图。

具体实施方式

[0029] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0030] 为了解决现有技术中存在的拼接的视频文件帧率不完全相同,视频拼接效果难以保证的问题,本发明实施例提供一种任意帧率视频文件拼接方法。
[0031] 实施例1
[0032] 图1为一种任意帧率视频文件拼接方法流程图,包括:
[0033] S100.获取待拼接的视频文件,确定待拼接的视频文件拼接顺序。
[0034] 在本实施例中,S100中,待拼接视频文件格式至少包括:MP4、FLV、WMV、AVI和MPEG。视频文件中音视频数据流条数不限,可以只含视频、只含音频或音视频同时包含。对于只含音频的媒体文件,不参与视频帧率比较,拼接装置也能成功实现拼接,且性能良好,本实施例假设用户指定的媒体文件全部包含视频流。另外,拼接装置处理三个或三个以上视频文件,参与拼接的视频文件越多,只是拼接处理过程越长,整体逻辑与处理两个视频文件的逻辑完全相同,本实施例以两个视频文件拼接为例进行介绍。
[0035] S200.分别获取待拼接视频文件的帧率,对视频文件格式和数据正确性进行判断。在本实施例中,对视频文件格式和数据正确性进行判断的方法为:获取待拼接视频文件,获取待拼接视频文件的音视频流信息和视频帧率,创建对应的编解码器,若能创建对应的编解码器,则判定当前待拼接视频文件格式和数据正确。
[0036] S300.根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件。
[0037] 在本实施例中,拼接预设第一规则包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率等于第二帧率时,将当前帧率赋值给目标视频文件的帧率,开始编解码待拼接视频文件中音视频数据,为编码生成的音视频重新赋值时间戳后写入目标视频文件,视频帧重新赋值时间戳依赖目标视频文件的帧率。
[0038] 在一些优选实施例中,拼接预设第一规则还包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率不等于第二帧率时,获取两者较小的帧率赋值给目标视频文件的帧率,对较小帧率的待拼接视频文件进行编解码和重新赋值时间戳,然后写入目标目标视频文件。
[0039] 在一些优选实施例中,拼接预设第一规则还包括:对帧率较大的视频文件中的音频进行编解码和重新赋值时间戳,对帧率较大的视频文件中的视频进行解码,生成原始YUV数据,丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,判断原始YUV数据是保留还是丢弃,若判定此YUV数据保留,编码此YUV数据生成视频帧,为编码生成的视频帧重新赋值时间戳,赋值时间戳后的音视频帧写入目标视频文件,若判定此YUV数据丢弃,终止此帧数据处理,读取文件下一帧音视频数据。
[0040] 在一些优选实施例中,丢帧预设第二规则包括:对帧率较大的视频文件的帧率与目标视频文件的帧率计算,分别获取两者作商运算后的商值QuotientValue和余值ResidualValue,当余值ResidualValue为0时,按每QuotientValue帧取1帧的规律连续丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,模块内部统计被调用的次数Count,当Count对QuotientValue取余的值为1,丢帧模块通知拼接装置此帧保留,否则,通知拼接装置此帧丢弃,当Count值等于帧率较大的视频文件的帧率时,将Count置为0,准备下一个丢帧周期到来。
[0041] 在一些优选实施例中,丢帧预设第二规则还包括:当余值ResidualValue不为0时,丢帧模块持续的按每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,丢帧模块内部统计被调用的次数Count和已经保留的视频帧数Num,若已保留的视频帧数Num加上周期内剩余帧能保留的最大帧数RemainNum值的和小于目标视频文件的帧率,则通知拼接装置保留当前帧,否则通知拼接装置丢弃当前帧;当Count值等于帧率较大的视频文件的帧率时,将Count、Num值均置为0,准备下一个丢帧周期到来。
[0042] 在一些优选实施例中,周期内剩余帧能保留的最大帧数RemainNum值公式为:
[0043]
[0044] 其中,SrcFps表示待拼接视频文件帧率较大的视频文件的帧率,Count表示丢帧模块被调用次数,QuotientValue表示帧率较大的视频文件的帧率与目标视频文件的帧率作商运算后的商值。
[0045] 在一些优选实施例中,丢帧预设第二规则还包括:对每个周期第一帧视频数据,丢帧模块直接通知拼接装置保留,从周期内的第二帧开始,拼接装置计算周期内剩余帧持续采用每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律进行丢帧。
[0046] S400.当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。在本实施例中,不同格式的流媒体文件对文件头尾信息有不同要求,头尾信息缺失或异常,播放器不能正常播放此文件。
[0047] 本实施例公开的一种任意帧率视频文件拼接方法,通过获取待拼接的视频文件,确定待拼接的视频文件拼接顺序,对视频文件格式和数据正确性进行判断;若待拼接视频文件格式和数据正确,分别获取待拼接视频文件的帧率;根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。本发明通过找寻最小视频帧率,参与拼接文件以最小视频帧率为参照,以自身视频帧率为周期,均匀丢帧,保证每段参与拼接的视频在拼接后帧率统一、各自播放时长不变,音视频同步,从而保证拼接生成的视频文件总体性能良好。本发明逻辑简单,易实现。拼接效果好,磁盘占用空间小。可行性和可靠性高,适用范围广。
[0048] 实施例2
[0049] 为了更好理解本发明,本实施例以更具体的例子对本发明进行详细说明。一种任意帧率视频文件拼接方法流程图,包括:
[0050] S100.获取待拼接的视频文件,确定待拼接的视频文件拼接顺序。具体的,用户向拼接装置指定参与拼接的媒体文件和拼接顺序,参与拼接的媒体文件格式不限,常见的格式有MP4、FLV、WMV、AVI和MPEG等,文件中音视频数据流条数不限,可以只含视频、只含音频或音视频同时包含。对于只含音频的媒体文件,不参与视频帧率比较,拼接装置也能成功实现拼接,且性能良好,本实施例假设用户指定的媒体文件全部包含视频流。另外,拼接装置处理三个或三个以上视频文件,参与拼接的视频文件越多,只是拼接处理过程越长,整体逻辑与处理两个视频文件的逻辑完全相同,本实施例以两个视频文件拼接为例进行介绍,假设用户指定的视频文件为SrcFile1.mp4、SrcFile2.flv,拼接顺序是SrcFile1.mp4在前,SrcFile2.flv在后。
[0051] S200.分别获取待拼接视频文件的帧率,对视频文件格式和数据正确性进行判断。具体的,拼接装置打开用户指定的SrcFile1.mp4和SrcFile2.flv,读取文件中的音视频属性,主要包含音视频数据的编码格式和视频帧率SrcFps1和SrcFps2,若上述两步操作均成功,表明用户指定的视频文件正常,否则拼接装置终止工作,告警用户视频文件异常。在成功获取SrcFile1.mp4和SrcFile2.flv的音视频属性后,分别创建音视频格式对应的解码器,创建拼接生成文件DstFile.mp4,指定DstFile.mp4中音视频格式,如视频为H264编码格式,音频为AAC编码格式,并创建对应格式的音视频编码器。
[0052] S300.根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件。
[0053] 在本实施例中,拼接预设第一规则包括:获取待拼接视频文件的帧率,分别为第一帧率和第二帧率,对第一帧率和第二帧率大小进行比较,当第一帧率等于第二帧率时,将当前帧率赋值给目标视频文件的帧率,开始编解码待拼接视频文件中音视频数据,为编码生成的音视频重新赋值时间戳后写入目标视频文件,视频帧重新赋值时间戳依赖目标视频文件的帧率。
[0054] 具体的,拼接装置在获取SrcFile1.mp4和SrcFile2.flv的视频帧率后,比较SrcFps1和SrcFps2大小,若SrcFps1和SrcFps2相等,参与拼接的视频文件无需丢帧,拼接生成文件DstFile.mp4的视频帧率DstFps为SrcFps1;若SrcFps1和SrcFps2不等,标记帧率值小的视频文件无需丢帧,标记帧率值大的视频文件需要丢视频帧,拼接生成文件DstFile.mp4的视频帧率DstFps为SrcFps1和SrcFps2数值小者。当SrcFps1和SrcFps2相等时,拼接装置解码、编码SrcFile1.mp4和SrcFile2.flv音视频数据,为编码生成的音视频数据打上时间戳,并根据拼接顺序将编码生成的音视频数据写入DstFile.mp4。
[0055] 在一些优选实施例中,拼接预设第一规则还包括:对帧率较大的视频文件中的音频进行编解码和重新赋值时间戳,对帧率较大的视频文件中的视频进行解码,生成原始YUV数据,丢帧模块对生成的原始YUV数据按预设第二规则进行丢帧判断,判断原始YUV数据是保留还是丢弃,若判定此YUV数据保留,编码此YUV数据生成视频帧,为编码生成的视频帧重新赋值时间戳,赋值时间戳后的音视频帧写入目标视频文件,若判定此YUV数据丢弃,终止此帧数据处理,读取文件下一帧音视频数据。
[0056] 具体的,如图2,拼接装置工作流程为:拼接装置打开参与拼接的视频文件SrcFile1.mp4和SrcFile2.flv,读取视频文件中的音视频流属性,假设SrcFile1.mp4的视频帧率是45帧每秒,SrcFile2.flv的视频帧率是60帧每秒,SrcFile1.mp4和SrcFile2.flv均含有音频流和视频流,SrcFile1.mp4中视频编码格式是H265,音频编码格式是AAC,SrcFile2.flv中视频编码格式是H264,音频编码格式是AAC,拼接装置分别为SrcFile1.mp4和SrcFile2.flv创建对应格式的音视频解码器,同时,拼接装置创建拼接生成文件DstFile.mp4,选定DstFile.mp4的视频格式为H264,音频格式为AAC,并创建对应格式的编码器。
[0057] 拼接装置比较SrcFile1.mp4和SrcFile2.flv的帧率大小,45小于60,拼接装置将SrcFile1.mp4标记为无需丢帧,将SrcFile2.flv标记为需要丢帧。拼接装置按用户指定的拼接顺序处理SrcFile1.mp4和SrcFile2.flv,当处理无需丢帧的SrcFile1.mp4时,拼接装置调用SrcFile1.mp4对应的AAC音频解码器和H265视频解码器解码音视频,生成音视频原始数据,再调用DstFile.mp4对应的AAC编码器和H264编码器编码音视频原始数据,为编码生成的音视频帧赋值时间戳,视频帧赋值时间戳基于45帧每秒的帧率,最后将赋值时间戳后的音视频帧写入DstFile.mp4。
[0058] 拼接装置处理需要丢帧的视频文件SrcFile2.flv,SrcFile2.flv同时含有H264格式的视频数据和AAC格式的音频数据,拼接装置每次读取一帧完整的音频数据或视频数据,读取到的音频帧直接解码、编码、编码帧赋值时间戳,将赋值时间戳后的音频帧写入DstFile.mp4,读取到的视频帧需要做丢帧处理。
[0059] 拼接装置调用SrcFile2.flv对应的H264视频解码器解码视频,生成视频原始YUV数据,每解码一帧视频帧,拼接装置调用一次丢帧模块,丢帧模块内部有一套丢帧逻辑,丢帧模块通知拼接装置当前原始YUV数据是保留还是丢弃。
[0060] 丢帧模块若通知拼接装置丢弃当前原始YUV数据,拼接装置终止当前YUV数据处理,读取SrcFile2.flv中的下一帧媒体数据,可能是音频帧或视频帧。丢帧模块若通知拼接装置保留当前原始YUV数据,拼接装置调用DstFile.mp4对应的H264编码器编码当前原始YUV数据,为编码生成的视频帧赋值时间戳,视频帧赋值时间戳基于45帧每秒的帧率,最后将赋值时间戳后的视频帧写入DstFile.mp4。
[0061] 在一些优选实施例中,丢帧预设第二规则包括:对帧率较大的视频文件的帧率与目标视频文件的帧率计算,分别获取两者作商运算后的商值QuotientValue和余值ResidualValue,当余值ResidualValue为0时,按每QuotientValue帧取1帧的规律连续丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,模块内部统计被调用的次数Count,当Count对QuotientValue取余的值为1,丢帧模块通知拼接装置此帧保留,否则,通知拼接装置此帧丢弃,当Count值等于帧率较大的视频文件的帧率时,将Count置为0,准备下一个丢帧周期到来。
[0062] 在一些优选实施例中,丢帧预设第二规则还包括:当余值ResidualValue不为0时,丢帧模块持续的按每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律丢帧,需要丢帧的视频文件每解码一帧视频,拼接装置就调用一次丢帧模块,丢帧模块内部统计被调用的次数Count和已经保留的视频帧数Num,若已保留的视频帧数Num加上周期内剩余帧能保留的最大帧数RemainNum值的和小于目标视频文件的帧率,则通知拼接装置保留当前帧,否则通知拼接装置丢弃当前帧;当Count值等于帧率较大的视频文件的帧率时,将Count、Num值均置为0,准备下一个丢帧周期到来。
[0063] 在一些优选实施例中,周期内剩余帧能保留的最大帧数RemainNum值公式为:
[0064]
[0065] 其中,SrcFps表示待拼接视频文件帧率较大的视频文件的帧率,Count表示丢帧模块被调用次数,QuotientValue表示帧率较大的视频文件的帧率与目标视频文件的帧率作商运算后的商值。
[0066] 在一些优选实施例中,丢帧预设第二规则还包括:对每个周期第一帧视频数据,丢帧模块直接通知拼接装置保留,从周期内的第二帧开始,拼接装置计算周期内剩余帧持续采用每QuotientValue帧取1帧,每(QuotientValue + 1)帧取1帧的规律进行丢帧。
[0067] 具体的,如图3,当余值ResidualValue值非0时,假设丢帧模块从拼接装置分别获取此次视频拼接的最小帧率45帧每秒和需要丢帧的视频文件SrcFile2.flv帧率值60帧每秒,算出两个帧率值间商的余值ResidualValue和商的整数部分值QuotientValue,此时ResidualValue值非0,等于15,QuotientValue等于1。
[0068] ResidualValue值非0,丢帧模块会统计被调用次数Count和已保留视频帧数Num,Count和Num初始值为0,丢帧模块每被调用一次,Count值加1,丢帧模块每通知拼接装置保留当前视频数据一次,Num值加1。丢帧模块以需要丢帧的视频文件SrcFile2.flv帧率值60为周期,周期性的统计Count和Num值,当Count等于60,表示一个统计周期结束,Count和Num值置为0,等待下一个统计周期开始。为了保证拼接生成的DstFile.mp4视频文件封面与参与拼接的第一个视频文件封面相同,丢帧模块的Count值等于1时,直接通知拼接装置保留当前帧,同时Num值加1。
[0069] 丢帧模块被调用,且Count值不等于1时,假设Count等于2,即丢帧模块是周期内第2次被调用,包含当前第2帧,本周期内还剩59帧原始视频数据,通过公式(3)丢帧模块能保留的最大帧数RemainNum为59 * 2 / (2 * 1 + 1),等于39,此时丢帧模块已保留视频帧数Num等于1。
[0070] 当丢帧模块是周期内第2次被调用时,RemainNum等于39,Num等于1,RemainNum加Num等于40,小于最小帧率45,丢帧模块判定当前原始视频数据保留,并将判定结果通知给拼接装置。
[0071] 当丢帧模块是周期内第31次被调用,通过公式算出RemainNum等于20,此时丢帧模块统计的Num等于25,RemainNum加Num等于45,不小于最小帧率45,丢帧模块判定当前原始视频数据丢弃,并将判定结果通知给拼接装置。需要说明的是,丢帧模块的评判条件是RemainNum与Num之和小于45,不能小于等于45,例如周期内最后一次调用丢帧模块时,Num等于45,RemainNum等于0,Num与RemainNum之和等于45,丢帧模块通知拼接装置保留最后一帧,Num值会变为46,即拼接装置在每个周期内保留了46帧视频数据,而不是期望的45帧视频数据。
[0072] 如图4,当余值ResidualValue值为0时,假设参与拼接的视频文件SrcFile3.mp4和SrcFile4.flv的视频帧率分别为30帧每秒和90帧每秒,其它流媒体属性与S201中的SrcFile1.mp4和SrcFile2.flv相同,丢帧模块依据作商公式分别算出ResidualValue等于0,QuotientValue等于3。能发现90恰好是30的整数倍,基于丢帧模块均匀丢帧的特点,SrcFile4.flv的视频数据可以每隔QuotientValue帧取1帧,此处即每隔3帧视频数据取1帧。为了保证拼接生成的DstFile.mp4视频文件封面与参与拼接的第一个视频文件封面相同,拼接装置需要保留SrcFile4.flv的第一帧视频数据,故丢帧模块采取周期内第一帧视频数据保留,从第一帧开始,每隔QuotientValue帧,此处即3帧,保留一帧视频数据的均匀丢帧策略。
[0073] ResidualValue值等于0,丢帧模块会统计被调用次数Count,Count初始值为0,丢帧模块每被调用一次,Count值加1。丢帧模块以需要丢帧的视频文件SrcFile4.flv帧率值90为周期,周期性的统计Count值,当Count等于90,表示一个统计周期结束,Count值置为0,等待下一个统计周期开始。
[0074] 丢帧模块每被调用一次,Count值加1,并计算Count与QuotientValue商的余值。
[0075] 当丢帧模块被第7次调用,Count等于7,QuotientValue等于3,7对3取余,即7%3等于1,丢帧模块通知拼接装置保留当前视频数据。
[0076] 当丢帧模块被第8次调用,Count等于8,QuotientValue等于3,8对3取余,即8%3等于2,丢帧模块通知拼接装置丢弃当前视频数据。
[0077] 本实施例公开的一种任意帧率视频文件拼接方法,通过获取待拼接的视频文件,确定待拼接的视频文件拼接顺序,对视频文件格式和数据正确性进行判断;若待视频文件格式和数据正确,分别获取待拼接视频文件的帧率;根据待拼接视频文件帧率,按拼接装置预设第一规则,生成拼接完成的目标视频文件;当目标视频文件生成后,更新目标文件的文件头信息,写入文件尾,视频文件拼接完成。本发明通过找寻最小视频帧率,参与拼接文件以最小视频帧率为参照,以自身视频帧率为周期,均匀丢帧,保证每段参与拼接的视频在拼接后帧率统一、各自播放时长不变,音视频同步,从而保证拼接生成的视频文件总体性能良好。本发明逻辑简单,易实现。拼接效果好,磁盘占用空间小。可行性和可靠性高,适用范围广。
[0078] 应该明白,公开的过程中的步骤的特定顺序或层次是示例性方法的实例。基于设计偏好,应该理解,过程中的步骤的特定顺序或层次可以在不脱离本公开的保护范围的情况下得到重新安排。所附的方法权利要求以示例性的顺序给出了各种步骤的要素,并且不是要限于所述的特定顺序或层次。
[0079] 在上述的详细描述中,各种特征一起组合在单个的实施方案中,以简化本公开。不应该将这种公开方法解释为反映了这样的意图,即,所要求保护的主题的实施方案需要清楚地在每个权利要求中所陈述的特征更多的特征。相反,如所附的权利要求书所反映的那样,本发明处于比所公开的单个实施方案的全部特征少的状态。因此,所附的权利要求书特此清楚地被并入详细描述中,其中每项权利要求独自作为本发明单独的优选实施方案。
[0080] 本领域技术人员还应当理解,结合本文的实施例描述的各种说明性的逻辑框、模块、电路和算法步骤均可以实现成电子硬件、计算机软件或其组合。为了清楚地说明硬件和软件之间的可交换性,上面对各种说明性的部件、框、模块、电路和步骤均围绕其功能进行了一般地描述。至于这种功能是实现成硬件还是实现成软件,取决于特定的应用和对整个系统所施加的设计约束条件。熟练的技术人员可以针对每个特定应用,以变通的方式实现所描述的功能,但是,这种实现决策不应解释为背离本公开的保护范围。
[0081] 结合本文的实施例所描述的方法或者算法的步骤可直接体现为硬件、由处理器执行的软件模块或其组合。软件模块可以位于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、移动磁盘、CD-ROM或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质连接至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。该ASIC可以位于用户终端中。当然,处理器和存储介质也可以作为分立组件存在于用户终端中。
[0082] 对于软件实现,本申请中描述的技术可用执行本申请所述功能的模块(例如,过程、函数等)来实现。这些软件代码可以存储在存储器单元并由处理器执行。存储器单元可以实现在处理器内,也可以实现在处理器外,在后一种情况下,它经由各种手段以通信方式耦合到处理器,这些都是本领域中所公知的。
[0083] 上文的描述包括一个或多个实施例的举例。当然,为了描述上述实施例而描述部件或方法的所有可能的结合是不可能的,但是本领域普通技术人员应该认识到,各个实施例可以做进一步的组合和排列。因此,本文中描述的实施例旨在涵盖落入所附权利要求书的保护范围内的所有这样的改变、修改和变型。此外,就说明书或权利要求书中使用的术语“包含”,该词的涵盖方式类似于术语“包括”,就如同“包括,”在权利要求中用作衔接词所解释的那样。此外,使用在权利要求书的说明书中的任何一个术语“或者”是要表示“非排它性的或者”。