一种修复mp4损坏文件的方法

文档序号:1580011 发布日期:2020-01-31 浏览:20次 >En<

阅读说明:本技术 一种修复mp4损坏文件的方法 (method for repairing MP4 damaged files ) 是由 许超明 梁效宁 韩勇 于 2019-10-31 设计创作,主要内容包括:本发明公开了一种修复MP4损坏文件的方法,其特征在于包括以下步骤:S100:获取任一MP4正常文件,解析所述MP4正常文件以获取数据流的编码方式、sample数据的封装模式及时间流的交错模式;S200:根据所述编码方式及所述交错模式,扫描所述MP4损坏文件的媒体数据区域并获取所述媒体数据区域中的sample大小及sample的偏移量并记录在音/视频序列容器中;S300:根据所述音/视频序列容器中sample大小及sample的偏移位置,修改所述MP4正常文件中moov的区块偏移表的偏移量,用以重新构建所述MP4正常文件的moov;S400:采用所述MP4损坏文件的媒体数据区域替换步骤S300中所重新构建的所述MP4正常文件的媒体数据区域,生成正常播放的MP4文件,完成所述MP4损坏文件的修复。(The invention discloses a method for repairing MP4 damaged files, which is characterized by comprising the following steps of S100, obtaining any MP4 normal files, analyzing the MP4 normal files to obtain a coding mode of a data stream, an encapsulation mode of sample data and an interleaving mode of a time stream, S200, scanning a media data area of the MP4 damaged files according to the coding mode and the interleaving mode, obtaining a sample size and an offset of the sample in the media data area, recording the sample size and the offset in an audio/video sequence container, S300, modifying an offset of a block offset table of moov in the MP4 normal files according to the sample size and the offset position of the sample in the audio/video sequence container, reconstructing the moov of the MP4 normal files, S400, replacing the media data area of the MP4 normal files reconstructed in the step S300 by the media data area of the MP4 damaged files, generating normally played MP4 files, and repairing the MP4 damaged files.)

一种修复MP4损坏文件的方法

技术领域

本发明属于电子数据恢复与取证领域,涉及一种音/视频文件的修复方法,尤其涉及一种修复MP4损坏文件的方法。

背景技术

MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通过,第二版在1999年12月通过。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播。

MPEG-4包含了MPEG-1及MPEG-2的绝大部份功能及其他格式的长处,并加入及扩充对虚拟现实模型语言(VRML,Virtual Reality Modeling Language)的支持,面向对象的合成档案(包括音效,视讯及VRML对象),以及数字版权管理(DRM)及其他互动功能。而MPEG-4比MPEG-2更先进的其中一个特点,就是不再使用宏区块做影像分析,而是以影像上个体为变化记录,因此尽管影像变化速度很快、码率不足时,也不会出现方块画面。

MPEG-4的特点如下:

(1)对于不同的对象可采用不同的编码算法,从而进一步提高压缩效率;

(2)对象各自相对独立,提高了多媒体数据的可重用性;

(3)允许用户对单个的对象操作,提供前所未有的交互性;

(4)允许在不同的对象之间灵活分配码率,对重要的对象可分配较多的字节,对次要的对象可分配较少的字节,从而能在低码率下获得较好的效果;

(5)可以方便的集成自然音视频对象和合成音视频对象。

由于MP4具有以上的优势及特点,因此,MP4获得了广泛的应用并拥有大量的使用者。

MP4文件格式中,所有的数据存在一个称为movie的容器中。一个movie可以由多个音/视频序列(track)组成。每个音/视频序列(track)就是一个随时间变化的媒体序列,例如,视频帧序列。音/视频序列(track)里的每个时间单位是一个sample,它可以是一帧视频或音频。sample按照时间顺序排列。一帧音频可以分解成多个音频sample,所以音频一般用sample作为单位,而不用帧。MP4文件格式的定义里面,用sample表示一个时间帧或者数据单元。每个音/视频序列(track)会有一个或者多个sample描述。

movie容器存放着媒体描述元数据(metadata),其指引播放器怎样索引媒体数据及怎样播放媒体数据,movie容器的名字称为moov。

但是,由于各种原因,MP4会被损坏,从而造成MP4无法正常播放,尤其在公检法领域所使用的视频监控文件中,由于MP4的视频监控文件的损坏,从而给监控及取证带来极大困难。

现有技术中,对MP4损坏文件的恢复通常采用一些应用软件来进行恢复,这些应用软件通常只能恢复一些简单的损坏情况,且修复后的MP4文件在播放的时候会出现声画不同步、播放无声、跳转播放时间后视频被卡死等问题,最主要的是,现有技术无法修复因MP4文件丢失moov而造成的损坏,从而不能修复和播放此类MP4。

发明内容

本发明针对现有技术的不足问题,提出了一种修复MP4损坏文件的方法:通过扫描媒体数据mdat里的sample,重新构建出moov数据索引信息,使播放器能正常播放文件,达到修复MP4损坏文件的目的。

为便于描述,本发明可能包含如下术语:

metadata:媒体描述元数据

mdat:媒体数据区域

chunk:区块

track:音/视频序列

interleave:交错模式

sample-to-chunk table:sample-区块对应关系表

chunk offset table:区块偏移表

sample description atom:sample描述信息

atom(Accurate Tracking by Overlap Maximization):采用最大化重叠的精确跟踪

本发明申请包括以下步骤:

S100:获取任一MP4正常文件,解析所述MP4正常文件以获取数据流的编码方式、sample数据的封装模式及时间流的交错模式,其中,所述MP4正常文件与所述MP4损坏文件由相同的MP4制作装置和/或制作软件所生成且具有相同的编码方式及交错模式;

S200:根据所述编码方式及所述交错模式,扫描所述MP4损坏文件的媒体数据区域并获取所述媒体数据区域中的sample大小及sample的偏移量并记录在音/视频序列容器中;

S300:根据所述音/视频序列容器中sample大小及sample的偏移位置,修改所述MP4正常文件中moov的区块偏移表的偏移量,用以重新构建所述MP4正常文件的moov;

S400:采用所述MP4损坏文件的媒体数据区域替换步骤S300中所重新构建的所述MP4正常文件的媒体数据区域,生成可以正常播放的MP4文件,完成所述MP4损坏文件的修复。

优选地,所述步骤S100包括以下步骤:

S101:获取数据流的编码方式,包括以下步骤:

S1011:获取sample描述信息,所述sample描述信息包含atom大小、类型、版本、标志、条目数及sample描述表,其中,所述类型为stsd;

S1012:读取所述sample描述表中的数据格式作为所述编码方式,所述编码方式包括avc1、mp4a、mp4v、alac、samr、Twos、apcn、in24、sowt及sawb;

S102:获取时间流的交错模式,包括以下步骤:

S1021:获取所述MP4正常文件中各个音/视频序列的区块偏移表并获取各个音/视频序列的偏移量,所述偏移量是相对于媒体数据区域的起始地址的相对偏移地址;

S1022:将各个音/视频序列的偏移量并入同一集合并按升序排列;

S1023:查找各个偏移量所属的音/视频序列在所述集合中出现的规律,用以确定各个音/视频序列的交错模式;

S1024:去除所述集合中重复循环的音/视频序列,用以获取时间流的交错模式;

S103:获取sample数据的封装模式,包括以下步骤:

S1031:获取所述MP4正常文件中sample-区块对应关系表并读取第一区块的序号、每区块的sample数及sample的描述识别号;

S1032:根据所获取的音/视频序列的交错模式及所述MP4正常文件中sample-区块对应关系表,获取sample数据的封装模式。

优选地,所述步骤S200包括以下步骤:

S201:读取所述MP4损坏文件的媒体数据容器的数据,查找媒体数据的标识,所述媒体数据的标识为媒体数据的起始地址;

S202:根据所述MP4正常文件的交错模式,选取要匹配的音/视频序列;

S203:根据所述MP4正常文件的每区块的sample数获取要匹配的sample个数;

S204:根据音/视频序列的编码方式来扫描媒体数据中的sample,用以匹配所读取的sample;

S205:判断所读取的sample是否与音/视频序列的编码方式匹配,如果是,执行步骤S207,否则,执行步骤S206;

S206:寻址下一所需读取的sample,执行步骤S204;

S207:记录当前sample的字节长度和偏移量,并将当前sample的偏移量记录在音/视频序列容器中。

优选地,针对不同的音/视频序列的编码方式,获取sample的字节长度的方法如下:

编码方式为avc1:以当前sample的起始地址为首地址,向后偏移0x5字节并读取字节的内容,与0x1f进行逻辑与运算,所得结果表示sample的类型且小于十进制数21,当前sample的前4字节的内容表示sample的字节长度;

编码方式为mp4a:以当前sample的起始地址为首地址,向后偏移0x5字节、0x06字节并分别读取字节的内容且所读取的内容分别为0xee、0x1b,或者,

以当前sample的起始地址为首地址,向后偏移0x5字节、0x06字节并分别读取字节的内容,所读取的内容分别为0x3e、0x64且当前sample的首字节内容不为零;

采用ffpeg的untr_decode_audio4函数获得sample的字节长度;

编码方式为mp4v:以当前sample的起始地址为首地址,前两个字节的内容为0x1b3或0x1b6,采用ffpeg的avcodec_decode_video2函数获得sample的字节长度;

编码方式为alac:以当前sample的起始地址为首地址,向后偏移0x5字节并读取连续4字节的内容的整数t,当前sample的前4字节的内容为0x00时,t的值为0x00130000,或,

当前sample的前4字节的内容为0x1000时,t的值为0x001a0000,采用ffpeg的untr_decode_audio4函数获得sample的字节长度;

编码方式为samr:当前sample的首字节内容为0x3c,sample的字节长度为32字节。

本发明具有以下有益效果是:解决了现有技术无法修复因MP4文件丢失moov而造成的损坏的技术问题。

附图说明

图1为本发明所提供的方法的总流程图;

图2为本发明一个实施例中获取sample大小及sample的偏移量的具体流程图。

具体实施方式

MP4文件格式中,所有的数据存在一个称为movie的容器中。一个movie可以由多个音/视频序列(track)组成。每个音/视频序列(track)就是一个随时间变化的媒体序列,例如,视频帧序列。音/视频序列(track)里的每个时间单位是一个sample,它可以是一帧视频或音频。sample按照时间顺序排列。一帧音频可以分解成多个音频sample,所以音频一般用sample作为单位,而不用帧。MP4文件格式的定义里面,用sample表示一个时间帧或者数据单元。每个音/视频序列(track)会有一个或者多个sample描述。

movie容器存放着媒体描述元数据(metadata),其指引播放器怎样索引媒体数据及怎样播放媒体数据,movie容器的名字称为moov。

音/视频序列(track)里面的每个sample通过引用关联到一个sample描述。这个sample描述定义了怎样解码这个sample,例如使用的压缩算法。

文件的物理格式和媒体数据的排列都不受媒体的时间顺序的限制。视频帧不需要在文件按时间顺序排列。这就意味着如果文件中真的存在这样的一些帧,那么就有一些文件结构来描述媒体的排列和对应的时间信息。

MP4文件中所有数据都封装在一些box中,以前将这种box叫atom(AccurateTracking by Overlap Maximization),即,采用重叠最大化的精确跟踪)。所有的媒体描述元数据(metadata),包括定义媒体的排列和时间信息的数据都包含在这样的一些结构box中。MP4文件格式定义了这些box的格式,其中,metadata对媒体数据(例如,视频帧)引用说明。

box定义了如何在sample表中找到媒体数据的排列。这包括数据引用、sample大小表(sample size table,简称stsz),sample-区块对应关系表(sample-to-chunk table,简称stsc)、区块偏移表(chunk offset table,简称STCO),这些表就可以找到音/视频序列(track)中每个sample在文件中的位置和大小。

为了节约空间,这些表都很紧凑。另外,交错(interleave)不是一个sample接一个sample的,而是把单个音/视频序列(track)的几个sample组合到一起,然后另外几个sample又进行新的组合。一个音/视频序列(track)的连续几个sample组成的单元就被称为区块(chunk)。每个区块(chunk)在文件中有一个偏移量,这个偏移量是相对于文件的起始地址,在这个区块(chunk)内,sample是连续存储的。

这样,如果一个区块(chunk)包含两个sample,第二个sample的位置就是区块(chunk)的偏移量加上第一个sample的大小。区块偏移表说明了每个区块(chunk)的偏移量,sample-区块对应关系表(sample-to-chunk table)说明了sample序号和区块(chunk)序号的对应关系,或者称为映射关系。

文件的时间和物理结构可以是对齐的,这表明媒体数据在容器中的物理顺序就是时间顺序。另外,如果多个音/视频序列(track)的媒体数据包含在同一个文件中,这个媒体数据可以是交错。一般来说,为了方便读取一个音/视频序列(track)的媒体数据,同时保证每个表紧凑,以一个合适的时间间隔(例如1秒)做一次交错,而不是一个sample接一个sample的。这样就可以减少区块chunk的数据,减小区块偏移表的大小

MP4文件总体布局如下所示:

Figure BDA0002255185100000091

本申请的主要方法是:解析MP4正常文件并得到其moov,并从该moov中得到音/视频序列(track)的交错模式和编码方式,根据交错模式来扫描MP4损坏文件的媒体数据区域(mdat),得到每一个sample的大小和偏移量,根据得到的sample的大小和偏移量重新改写moov中sample-区块对应关系表(chunk offset table,简称STCO),最后把改写的moov和媒体数据区域(mdat)写到一个文件,就成为一个能正常播放的mp4文件。

下面结合附图和实施例对本发明作进一步阐述。

图1示出了本发明所提供的方法的总流程图。

如图1所示,本发明的方法包括以下步骤:

S100:获取任一MP4正常文件,解析MP4正常文件以获取数据流的编码方式、sample数据的封装模式及时间流的交错模式,其中,MP4正常文件与MP4损坏文件由相同的MP4制作装置和/或制作软件所生成且具有相同的编码方式及交错模式;

具体地,解析一个与MP4损坏文件来自相同设备的MP4正常文件。相同的MP4制作装置指相同的硬件设备,例如相同的相机、相同的手机,相同的MP4制作软件指相同的录制软件,例如暴风影音。因为相同的MP4制作装置和/或制作软件生成mp4文件的数据流的编码方式、sample数据的封装模式及时间流的交错模式是相同的,并且MP4损坏文件只有媒体数据区域(mdat)而没有moov信息,因此不能得到数据流的编码方式,因此只能从解析相同的MP4制作装置和/或制作软件所生成的文件获取。

步骤S100包括以下步骤:

S101:获取数据流的编码方式,包括以下步骤:

S1011:获取sample描述信息,sample描述信息包含atom大小、类型、版本、标志、条目数及sample描述表,其中,类型为stsd;

数据流的编码方式存放在sample description atom(STSD)中,文件的路径位置为moov/track/stbl/stsd。sample description atom的数据结构如下:

Figure BDA0002255185100000101

注意,此时sample description atom的类型是'stsd',包含了一个sampledescription table。根据不同的编码方式和存储数据的文件数目,每个媒体数据可以有一个到多个sample description。sample-区块对应关系表通过该索引表,找到合适媒体数据中每个sample的描述。

S1012:读取sample描述表中的数据格式作为编码方式,编码方式包括avc1、mp4a、mp4v、alac、samr、Twos、apcn、in24、sowt及sawb;

下表为本发明实施例中的sample描述表:

Figure BDA0002255185100000111

通过读取上表中4字节的“数据格式”即获得编码方式。

S102:获取时间流的交错模式,包括以下步骤:

S1021:获取MP4正常文件中各个音/视频序列的区块偏移表并获取各个音/视频序列的偏移量,偏移量是相对于媒体数据区域的起始地址的相对偏移地址;

S1022:将各个音/视频序列的偏移量并入同一集合并按升序排列;

S1023:查找各个偏移量所属的音/视频序列在集合中出现的规律,用以确定各个音/视频序列的交错模式;

S1024:去除集合中重复循环的音/视频序列,用以获取时间流的交错模式;

具体地,mp4文件中多个音/视频序列(track)的数据在媒体数据区域(mdat)的时间上是交错分布的,即我们所说的交错(interleave)模式,相同设备生成的mp4文件交错(interleave)模式是相同,可以根据mp4正常文件的每个音/视频序列(track)的chunkoffset table(STCO)里chunk的偏移分布来确定音/视频序列(track)的交错(interleave)模式,例如,有三个track分别为track0、track1、track2,它们在区块(chunk)的偏移量分布分别为:

track0在区块(chunk)的偏移量为1,10,20,30字节,记为集合:

track0 chunk offsets('stco'):[1,10,20,30]

track1在区块(chunk)的偏移量为2,4,12,15,21,24,32,33字节,记为集合:

track1 chunk offsets('stco'):[2,4,12,15,21,24,32,33]

track2在区块(chunk)的偏移量为6,7,18,19,25,28,38,39字节,记为集合:

track2 chunk offsets('stco'):[6,7,18,19,25,28,38,39]

将各个偏移量并入同一集合并按升序排列为0,1,1,2,2,0,1,1,2,2,0,1,1,2,2,0,其中的0表示track0的偏移量在并入同一集合后在该集合中的位置,同理,1表示track1的偏移量在并入同一集合后在该集合中的位置,2表示track2的偏移量在并入同一集合后在该集合中的位置,记为如下的交错集合:

interleaveMask:[0,1,1,2,2,0,1,1,2,2,0,1,1,2,2,0]

把出现的次序中找出规律并去除集合中重复循环的部分,得到的交错集合如下:

interleaveMask:[0,1,1,2,2,0]

即,交错模式为track0,track1,track1,track2,track2,track0依次出现并按此次序进行循环。

S103:获取sample数据的封装模式,包括以下步骤:

S1031:获取MP4正常文件中sample-区块对应关系表并读取第一区块的序号、每区块的sample数及sample的描述识别号;

S1032:根据所获取的音/视频序列的交错模式及MP4正常文件中sample-区块对应关系表,获取sample数据的封装模式。

具体地,sample在媒体数据区域(mdat)里是按照区块(chunk)来组织这些sample的,一个区块(chunk)包含一个或多个sample,区块(chunk)的字节长度可以不同,区块(chunk)的sample的字节长度也可以不同。

sample描述信息sample description atom(stsc)记录了sample和区块(chunk)的对应关系,文件的路径位置为moov/track/stbl/stsc:

sample description atom的数据结构如下:

Figure BDA0002255185100000131

值得注意的是,此时sample description atom的类型是'stsc'。

下表为本发明另一实施例中的sample-区块对应关系表(sample-to-chunktable):

字段 长度(字节) 描述
尺寸 4 atom的字节数
类型 4 stsc
版本 1 atom的版本
标志 3 这里为0
条目数目 4 sample-to-chunk的数目
sample-to-chunk sample-to-chunk表的结构
First chunk 4 这个table使用的第一个chunk序号
Samples per chunk 4 当前trunk内的sample数目
Sample description ID 4 与这些sample关联的sample description的序号

读取各个sample的sample-区块对应关系表中的First chunk、Samples perchunk及Sample description ID,生成如下的表格:

First chunk Samples per chunk Sample description ID
1 4 1
4 3 1
5 4 1
8 3 1
9 4 1
12 3 1
13 4 1
16 3 1
17 4 1
20 3 1
21 4 1
277 4 1
280 3 1

第二个First chunk的序号减去第一个First chunk的序号就是一共有多少个包含相同数目sample的chunk,这样通过不断的叠加,得到一共有280个chunk、每个chunk包含多少个sample以及每个chunk对应的description ID。从mp4正常文件通过stsc表、结合上述音/视频序列(track)的交错模式,即可到媒体数据区域(mdat)里所有sample的封装模式,例如,在本发明又一实施例中,假设有两个track,track0为视频,track1为音频,track0的stsc只有一项(即,一个entry),其所有的chunk都只包含1个description ID为1的sample,记为:

track0'stsc'(one entry):[1,1,1]

其中,第一个1表示chunk的序号,第二个1表示track0的每个chunk包含的sample数,第三个1表示sample的description ID;

track1的stsc有三项(即,三个entry),第一项[1,2,1]中的第一个chunk序号为1,第二项[4,1,1]中的第一个chunk序号为4,4-1=3,表示第一项和第二项之间有3个chunk且每个chunk包含2个description ID为1的sample;第三项[5,2,1]中的第一个chunk序号5,5-4=1,表示第二项和第三项之间有1个chunk且每个chunk包含1个description ID为1的sample;第三项[5,2,1]之后就没有下一项了,表示从序号为5的chunk之后的每个chunk都包含2个description ID为1的sample,记为:

track1'stsc'(three entries):[1,2,1,4,1,1,5,2,1]

其中,[1,2,1,4,1,1,5,2,1]中各值的含义与track0的含义相同。通过这个交错对应关系,我们可以直接从上述的track序列流得到sample数量的序列流,这样,再通过序列流上的track得到对应的sample数量(即,sample数据的封装模式),记为:

Figure BDA0002255185100000151

其中,interleaveMask中的0表示track0,1表示track1,换言之,此时的交错模式是track0、track1交替出现,而交错模式的获取方法由步骤S102获得;samplesPerChunkMask中圆括号中第一个数字表示sample的数量,第二个数字表示description ID

上述track0 Chunk#和track1 Chunk#表示track序列里chunk的序号

S200:根据编码方式及交错模式,扫描MP4损坏文件的媒体数据区域并获取媒体数据区域中的sample大小及sample的偏移量并记录在音/视频序列容器中;

图2示出了本发明一个实施例中获取sample大小及sample的偏移量的具体流程图。如图2所示,步骤S200包括以下步骤:

S201:读取MP4损坏文件的媒体数据容器的数据,查找媒体数据的标识,媒体数据的标识为媒体数据的起始地址;

S202:根据MP4正常文件的交错模式,选取要匹配的音/视频序列;

S203:根据MP4正常文件的每区块的sample数获取要匹配的sample个数;

S204:根据音/视频序列的编码方式来扫描媒体数据中的sample,用以匹配所读取的sample;

S205:判断所读取的sample是否与音/视频序列的编码方式匹配,如果是,执行步骤S207,否则,执行步骤S206;

S206:寻址下一所需读取的sample,执行步骤S204;

S207:记录当前sample的字节长度和偏移量,并将当前sample的偏移量记录在音/视频序列容器中。

值得注意的是的是,针对不同的音/视频序列的编码方式,获取sample的字节长度的方法如下:

编码方式为avc1:以当前sample的起始地址为首地址,向后偏移0x5字节并读取字节的内容,与0x1f进行逻辑与运算,所得结果表示sample的类型且小于十进制数21,当前sample的前4字节的内容表示sample的字节长度;

编码方式为mp4a:以当前sample的起始地址为首地址,向后偏移0x5字节、0x06字节并分别读取字节的内容且所读取的内容分别为0xee、0x1b,或者,

以当前sample的起始地址为首地址,向后偏移0x5字节、0x06字节并分别读取字节的内容,所读取的内容分别为0x3e、0x64且当前sample的首字节内容不为零;

采用ffpeg的untr_decode_audio4函数获得sample的字节长度;

编码方式为mp4v:以当前sample的起始地址为首地址,前两个字节的内容为0x1b3或0x1b6,采用ffpeg的avcodec_decode_video2函数获得sample的字节长度;

编码方式为alac:以当前sample的起始地址为首地址,向后偏移0x5字节并读取连续4字节的内容的整数t,当前sample的前4字节的内容为0x00时,t的值为0x00130000,或,

当前sample的前4字节的内容为0x1000时,t的值为0x001a0000,采用ffpeg的untr_decode_audio4函数获得sample的字节长度;

编码方式为samr:当前sample的首字节内容为0x3c,sample的字节长度为32字节。

S300:根据音/视频序列容器中sample大小及sample的偏移位置,修改MP4正常文件中moov的区块偏移表的偏移量,用以重新构建MP4正常文件的moov。

S400:采用MP4损坏文件的媒体数据区域替换步骤S300中所重新构建的MP4正常文件的媒体数据区域,生成可以正常播放的MP4文件,完成MP4损坏文件的修复。

通过本发明提供的方法,解决了现有技术中尚无一种修复MP4损坏文件的方法的技术问题。

应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

15页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种使用寿命长的便于维护的5G无线CPE设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类