一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种针对MP4视频文件中mdatbox数据错误的修复方法与流程

2022-02-22 08:35:07 来源:中国专利 TAG:

一种针对mp4视频文件中mdat box数据错误的修复方法
技术领域
1.本发明属于电子取证及数据恢复领域,涉及一种mp4视频文件的修复方法,尤其涉及一种针对mp4视频文件中mdat box数据错误的修复方法。


背景技术:

2.mp4作为一种常见的多媒体容器格式,它是在“iso/iec 14496-14”标准文件中定义的,属于mpeg-4的一部分,是媒体格式的一种实现。它可以在其中嵌入任何形式的数据、各种编码的视频、音频等。不过我们常见的大部分mp4文件中存放的是avc(h.264)或mpeg-4(part 2)编码的视频和aac编码的音频。mp4格式的官方文件后缀名是“.mp4”,还有其他的以mp4为基础进行的扩展或者套用mp4容器格式的文件后缀名,包括:mov,3gp,3g2等。
3.mp4作为一种最常被使用的视频文件格式,运用范围非常的广泛。但同时存在电子数据易损坏的这一特性。因此,针对此类文件的修复在日常工作生活中的运用就显得尤为重要。
4.在mp4视频文件中,视频数据由若干个“box”组成,且box内还可嵌套若干个box,而这些box之间存在相应的关联性。现有技术中,尚无一种通过各种类型box的特性以及box之间的关联性来修复mp4视频文件的方法,特别是当mp4视频文件中mdat box出现数据错误时,现有技术中尚无针对该技术问题的解决方法。


技术实现要素:

5.针对现有技术的技术问题,本发明提供了一种针对mp4视频文件中mdat box数据错误的修复方法:
6.利用各个box之间的关联性和不同类型box的特性,实现mp4视频文件的修复。通过此种方法修复后生成的视频文件与源文件的格式相同,不会改变其原本的文件数据存储结构。即,在导致源视频无法正常播放的损坏部分,按照mp4视频文件的固有存储结构特性构造视频数据,从而达到mp4视频能够正常播放的目的。通过此种方法实现的mp4视频文件修复,能够最大程度地保证源视频数据的完整性。
7.名词解释:
8.sample:对视频数据来说,video sample即为一帧视频,或一组连续视频帧;对音频数据来说,audio sample即为一段连续的压缩音频,它们统称sample。
9.track:表示一些sample的集合。对媒体数据来说,track表示一个视频或音频序列。
10.chunk:组块,即,一个track的几个sample组成的单元。换言之,其由若干个sample数据组成。
11.mp4视频文件所包括的主要的box类型名称、层级关系及说明请参考如下表一:
12.表一:
[0013][0014]
mp4视频文件所包括的更为详细的box类型名称、层级关系及说明请参考如下表二:
[0015]
表二:
[0016]
[0017]
[0018]
[0019]
[0020][0021]
本发明所提供的方法包括以下步骤:
[0022]
s100:加载视频文件,判断当前视频文件是否满足mp4视频文件的存储结构,如果是,执行步骤s200,否则,结束流程;
[0023]
s200:解析并判断当前视频文件是否为损坏文件,如果是,执行步骤s300,否则,结束流程;
[0024]
s300:解析当前视频文件包含的moov box,并解析moov box中嵌套的各个类型的box,确定moov box所描述的mdat box中音视频的编解码类型;
[0025]
s400:依据音视频编解码类型,解析当前视频文件的mdat box中包含的音视频;
[0026]
s500:根据解析所获取的moov box的内容及mdat box的内容,判断moov box描述的mdat box所包含的完整音视频信息是否正确,如果是,执行步骤s700,否则,执行步骤s600;
[0027]
s600:如果moov box及mdat box对应关联关系不正确,则根据moov box修复mdat box;
[0028]
s700:将修复后的数据按照mp4视频文件结构进行重组并生成修复后的mp4视频文件。
[0029]
优选地,步骤s100包括以下步骤:
[0030]
s101:加载并遍历当前视频文件;
[0031]
s102:根据mp4视频文件结构的标识,判断当前视频文件是否同时满足下述两个条件,如果是,表示当前视频文件为mp4视频文件的存储结构,执行步骤s200,否则,结束流程;
[0032]
条件1:当前视频文件是否同时包含下述标识的box:
[0033]
ftyp、moov、mvhd、trak、tkhd、mdia、mdhd、hdlr、minf、vmhd、smhd、dinf、dref、stbl、stsd、stts、stsc、stco;
[0034]
条件2:当前视频文件结构的标识符合mp4视频文件的box的层级结构,且各个box符合各自类型的数据结构。
[0035]
优选地,所述步骤s200中,解析并判断当前视频文件是否为损坏文件包括以下步
骤:
[0036]
是否同时满足下述4个条件:
[0037]
条件1:当前视频文件的首个box为ftyp,ftyp在当前视频文件中储存的起始地址为0x00;
[0038]
条件2:moov中嵌套stsz和stco两种box,其中,stsz用以记录mdat box音视频中sample的字节长度,stco用以记录mdat box音视频中chunk的偏移地址;
[0039]
条件3:moov box中嵌套的box必须满足mp4视频文件的box的层级结构;
[0040]
条件4:根据moov box中嵌套的各个类型的box的标识不同,所包含的数据内容也各不相同并分别各自满足相应类型的数据结构,且各自的数据不为全零。
[0041]
优选地,步骤s300包括以下步骤:
[0042]
s301:按照mp4视频文件的box的层级结构中moov box嵌套的各个box的层级关系,遍历各个box的数据;
[0043]
s302:通过moov box中trak box所包含的stsd描述的数据编解码,确定mdat box中音视频数据的编解码格式。
[0044]
优选地,步骤s300包括以下步骤:
[0045]
s301:按照mp4视频文件的box的层级结构中moov box嵌套的各个box的层级关系,遍历各个box的数据;
[0046]
s302:通过moov box中trak box所包含的stsd描述的数据编解码,确定mdat box中音视频数据的编解码格式。
[0047]
优选地,步骤s400包括以下步骤:
[0048]
根据所获取的音视频的编解码格式,确定mdat box中音视频sample的结构,并获取mdat box中所有音视频sample,记录各个音视频sample的字节长度及各自相对于mdat box起始地址的偏移地址。
[0049]
优选地,步骤s500包括以下步骤:
[0050]
s501:在moov box的音视频的trak box所记录的stco box中,获取首个chunk的偏移地址;
[0051]
s502:获取当前视频文件中mdat box相对于当前视频文件起始地址以及步骤400中所获取的首个sample相对于mdat box起始地址的偏移地址,判断当前视频文件中mdat box相对于当前视频文件起始地址加首个sample相对于mdat box起始地址的偏移地址的和,是否等于首个chunk的偏移地址,如果是,表示moov box描述的mdat box所包含的完整音视频信息正确,执行步骤s700,否则,执行步骤s503;
[0052]
s503:判断当前视频文件中mdat box相对于当前视频文件起始地址加首个sample相对于mdat box起始地址的偏移地址的和,是否大于首个chunk的偏移地址,如果是,执行步骤s504,否则,执行步骤s506;
[0053]
s504:确定mdat box头结构的字节长度:如果box大小的值为1,则头结构的字节长度为0x10,否则为0x08;
[0054]
s505:判断首个sample相对于mdat box起始地址的偏移地址减mdat box头结构的字节长度的差,是否等于当前视频文件中mdat box相对于当前视频文件起始地址,如果是,表示mdat box中完整音视频数据信息在moov box中描述的错误类型为内部数据错误,执行
步骤s602,否则,表示mdat box中完整音视频数据信息在moov box中描述的错误类型为偏移地址错误,执行步骤s601;
[0055]
s506:标记moov box描述的mdat box所包含的完整音视频信息的错误类型为偏移地址错误,执行步骤s601。
[0056]
优选地,步骤s600包括以下步骤:
[0057]
s601:首个sample相对于mdat box起始地址的偏移地址减mdat box头结构的字节长度的差,作为当前视频文件中mdat box相对于当前视频文件起始地址,执行步骤s700;
[0058]
s602:遍历moov box中的音视频trak box并读取stsz box的值,其表示各个sample的字节长度,与mdat box中音视频sample的字节长度各自对比,在moov box中查找对比后字节长度相等的sample,且当前sample之后连续n个sample的字节长度依次与stsz box中对应的字节长度分别相等,记录字节长度相等的sample在stsz box中的顺序,并记录对应sample的位置信息描述s_sam,其中,n为不小于3的自然数;
[0059]
s603:遍历moov box中音视频trak box,并读取stsc box的值,其表示sample与chunk的关联信息,所述关联信息包含各个chunk中sample的个数;
[0060]
根据位置信息描述所属的chunk,获取stsc box中位置信息描述对应的chunk的序号;
[0061]
s604:根据chunk的序号,在stco box中读取chunk的序号所对应的chunk偏移值;
[0062]
s605:根据chunk序号对应sample在mdat box中实际偏移地址值,以及当前视频文件中mdat box相对于当前视频文件起始地址,计算需填零字节的字节长度为:chunk的序号所对应的chunk偏移值减当前视频文件中mdat box相对于当前视频文件起始地址的差,再减实际偏移地址值;
[0063]
s606:根据所计算的填零字节的字节长度,将moov box中所查找的字节长度相等的sample前的字节填零,完成对mdat box内部数据错误的修复。
[0064]
优选地,所述实际偏移地址值的获取方法包括:
[0065]
根据chunk对应序号,在stsz中找到当前chunk的首个sample的字节长度;
[0066]
根据该字节长度,在步骤s400中查找与该字节长度相等的sample;
[0067]
读取步骤s400中与该字节长度相等的sample在mdat box中的偏移地址,作为实际偏移地址值。
[0068]
优选地,步骤s700包括以下步骤:
[0069]
s701:新建mp4视频文件,用以存放修复后的box;
[0070]
s702:将修复后的ftyp box、mdat box及moov box依次写入新建mp4视频文件;
[0071]
s703:判断新建mp4视频文件中mdat box与moov box之间是否存在空余空间,如果是,执行步骤s704,否则,执行步骤s705;
[0072]
s704:采用free box填充moov box与mdat box之间的空余空间;
[0073]
s705:输出修复后的mp4视频文件并检测是否可以正常播放。
[0074]
本发明具有以下有益效果:针对mp4视频文件中mdat box数据错误的修复,确保文件内容能够正常播放,并且播放画面与源文件保持一致,并解决了现有技术中尚无一种针对mp4视频文件中mdat box数据错误的修复方法的技术问题。
附图说明
[0075]
图1为本发明所提供的方法的总流程图;
[0076]
图2为本发明所提供的方法中判断moov box描述的mdat box所包含的完整音视频信息是否正确及判断mdat box中完整音视频数据信息在moov box中描述的错误类型的具体流程图;
[0077]
图3为本发明所提供的方法中根据moov box修复mdat box的具体流程图。
具体实施方式
[0078]
图1示出了本发明所提供的方法的总流程图。如图1所示,本发明的方法包括以下步骤:
[0079]
s100:加载视频文件,判断当前视频文件是否满足mp4视频文件的存储结构,如果是,执行步骤s200,否则,结束流程;步骤s100包括以下步骤:
[0080]
s101:加载并遍历当前视频文件;
[0081]
s102:根据mp4视频文件结构的标识,判断当前视频文件是否同时满足下述两个条件,如果是,表示当前视频文件为mp4视频文件的存储结构,执行步骤s200,否则,结束流程;
[0082]
条件1:当前视频文件是否同时包含下述标识的box:
[0083]
ftyp、moov、mvhd、trak、tkhd、mdia、mdhd、hdlr、minf、vmhd、smhd、dinf、dref、stbl、stsd、stts、stsc、stco;
[0084]
条件2:当前视频文件结构的标识符合mp4视频文件的box的层级结构,且各个box符合各自类型的数据结构。其中,各个box符合各自类型的数据结构属于公知常识,此处不再赘述。此外,box的层级结构也为公知常识,如表一及表二所示,此处也不再赘述。
[0085]
s200:解析并判断当前视频文件是否为损坏文件,如果是,执行步骤s300,否则,结束流程;
[0086]
步骤s200中,解析并判断当前视频文件是否为损坏文件包括以下步骤:
[0087]
是否同时满足下述4个条件,如果是,则为损坏文件:
[0088]
条件1:当前视频文件的首个box为ftyp,ftyp在当前视频文件中储存的起始地址为0x00;
[0089]
条件2:moov中嵌套stsz和stco两种box,其中,stsz用以记录mdat box音视频中sample的字节长度,stco用以记录mdat box音视频中chunk的偏移地址;
[0090]
条件3:moov box中嵌套的box必须满足mp4视频文件的box的层级结构;
[0091]
条件4:根据moov box中嵌套的各个类型的box的标识不同,所包含的数据内容也各不相同并分别各自满足相应类型的数据结构,且各自的数据不为全零。
[0092]
s300:解析当前视频文件包含的moov box,并解析moov box中嵌套的各个类型的box,确定moov box所描述的mdat box中音视频的编解码类型;
[0093]
步骤s300包括以下步骤:
[0094]
s301:按照mp4视频文件的box的层级结构中moov box嵌套的各个box的层级关系,遍历各个box的数据;
[0095]
s302:通过moov box中trak box所包含的stsd描述的数据编解码,确定mdat box中音视频数据的编解码格式。
[0096]
s400:依据音视频编解码类型,解析当前视频文件的mdat box中包含的音视频;
[0097]
步骤s400包括以下步骤:
[0098]
根据所获取的音视频的编解码格式,确定mdat box中音视频sample的结构,并获取mdat box中所有音视频sample,记录各个音视频sample的字节长度及各自相对于mdat box起始地址的偏移地址。
[0099]
s500:根据解析所获取的moov box的内容及mdat box的内容,判断moov box描述的mdat box所包含的完整音视频信息是否正确,如果是,执行步骤s700,否则,执行步骤s600;
[0100]
图2示出了本发明所提供的方法中判断moov box描述的mdat box所包含的完整音视频信息是否正确及判断mdat box中完整音视频数据信息在moov box中描述的错误类型的具体流程图。如图2所示,步骤s500包括以下步骤:
[0101]
s501:在moov box的音视频的trak box所记录的stco box中,获取首个chunk的偏移地址c;
[0102]
s502:获取当前视频文件中mdat box相对于当前视频文件起始地址m以及步骤400中所获取的首个sample相对于mdat box起始地址的偏移地址s,判断m s是否等于c,如果是,表示moov box描述的mdat box所包含的完整音视频信息正确,执行步骤s700,否则,执行步骤s503;
[0103]
s503:判断m s是否大于c,如果是,执行步骤s504,否则,执行步骤s506;
[0104]
s504:确定mdat box头结构的字节长度h_len:如果box size的值为1,则头结构的字节长度h_len为0x10,否则为0x08;
[0105]
s505:设首个sample相对于mdat box起始地址的偏移地址为s,判断s减h_len的差是否等于当前视频文件中mdat box相对于当前视频文件起始地址m,如果是,表示mdat box中完整音视频数据信息在moov box中描述的错误类型为内部数据错误,执行步骤s602,否则,表示mdat box中完整音视频数据信息在moov box中描述的错误类型为偏移地址错误,执行步骤s601;
[0106]
s506:标记moov box描述的mdat box所包含的完整音视频信息的错误类型为偏移地址错误,执行步骤s601。
[0107]
s600:如果moov box及mdat box对应关联关系不正确,则根据moov box修复mdat box;
[0108]
图3示出了本发明所提供的方法中则根据moov box修复mdat box的具体流程图。如图3所示,步骤s600包括以下步骤:
[0109]
s601:首个sample相对于mdat box起始地址的偏移地址s减mdat box头结构的字节长度h_len的差,作为当前视频文件中mdat box相对于当前视频文件起始地址m,执行步骤s700;
[0110]
s602:遍历moov box中的音视频trak box并读取stsz box的值,其表示各个sample的字节长度,与mdat box中音视频sample的字节长度各自对比,在moov box中查找对比后字节长度相等的sample,且当前sample之后连续3个sample的字节长度依次与stsz box中对应的字节长度分别相等,记录字节长度相等的sample在stsz box中的顺序,并记录对应sample的位置信息描述s_sam;
[0111]
例如,遍历moov box中的音视频trak box并读取stsz box中当前的值为0x16,表示当前sample的字节长度为0x16,读取其后连续3个sample的字节长度分别为0x08、0x32及0x64。与mdat box中音视频sample的字节长度对比,在moov box中查找到字节长度也为0x16的sample,并且,读取其后连续3个sample的字节长度也分别为0x08、0x32及0x64,则记录字节长度为0x16的sample在stsz box中的顺序,并记录sample的位置信息描述s_sam。应理解,其后连续sample的个数不受3个的限制,个数约大,结果越精确。
[0112]
s603:遍历moov box中音视频trak box,并读取stsc box的值,其表示sample与chunk的关联信息,关联信息包含各个chunk中sample的个数;
[0113]
根据位置信息描述s_sam所属的chunk,获取stsc box中位置信息描述s_sam对应的chunk的序号c_order;
[0114]
s604:根据chunk的序号c_order,在stco box中读取chunk的序号c_order所对应的chunk偏移值c_offset;
[0115]
s605:根据chunk序号c_order对应sample在mdat box中实际偏移地址值s_offset,以及当前视频文件中mdat box相对于当前视频文件起始地址m,计算需填零字节的字节长度=c_offset-m-s_offset;
[0116]
进一步地,实际偏移地址值s_offset的获取方法包括:
[0117]
根据chunk对应序号c_order,在stsz中找到当前chunk的首个sample的字节长度;
[0118]
根据该字节长度,在步骤s400中查找与该字节长度相等的sample;
[0119]
读取步骤s400中与该字节长度相等的sample在mdat box中的偏移地址,作为实际偏移地址值s_offset。
[0120]
s606:根据所计算的填零字节的字节长度,将moov box中所查找的字节长度相等的sample前的字节填零,完成对mdat box内部数据错误的修复。
[0121]
s700:将修复后的数据按照mp4视频文件结构进行重组并生成修复后的mp4视频文件。步骤s700包括以下步骤:
[0122]
s701:新建mp4视频文件,用以存放修复后的box;
[0123]
s702:将修复后的ftyp box、mdat box及moov box依次写入新建mp4视频文件;
[0124]
s703:判断新建mp4视频文件中mdat box与moov box之间是否存在空余空间,如果是,执行步骤s704,否则,执行步骤s705;
[0125]
s704:采用free box填充moov box与mdat box之间的空余空间;其中,free box为公知技术,此处不再赘述。
[0126]
s705:输出修复后的mp4视频文件并检测是否可以正常播放。
[0127]
通过本发明所提供的上述方法,确保修复后的mp4视频文件能够正常播放,并且播放画面与源文件保持一致,解决了现有技术中尚无一种针对mp4视频文件中mdatbox数据错误的修复方法的技术问题。
[0128]
应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献