CN110740391B - 一种修复mp4损坏文件的方法 - Google Patents
一种修复mp4损坏文件的方法 Download PDFInfo
- Publication number
- CN110740391B CN110740391B CN201911050367.3A CN201911050367A CN110740391B CN 110740391 B CN110740391 B CN 110740391B CN 201911050367 A CN201911050367 A CN 201911050367A CN 110740391 B CN110740391 B CN 110740391B
- Authority
- CN
- China
- Prior art keywords
- sample
- audio
- file
- bytes
- offset
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04N—PICTORIAL COMMUNICATION, e.g. TELEVISION
- H04N21/00—Selective content distribution, e.g. interactive television or video on demand [VOD]
- H04N21/80—Generation or processing of content or additional data by content creator independently of the distribution process; Content per se
- H04N21/85—Assembly of content; Generation of multimedia applications
- H04N21/854—Content authoring
- H04N21/85406—Content authoring involving a specific file format, e.g. MP4 format
Landscapes
- Engineering & Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Multimedia (AREA)
- Signal Processing (AREA)
- Signal Processing For Digital Recording And Reproducing (AREA)
- Television Signal Processing For Recording (AREA)
Abstract
本发明公开了一种修复MP4损坏文件的方法,其特征在于包括以下步骤:S100:获取任一MP4正常文件,解析所述MP4正常文件以获取数据流的编码方式、sample数据的封装模式及时间流的交错模式;S200:根据所述编码方式及所述交错模式,扫描所述MP4损坏文件的媒体数据区域并获取所述媒体数据区域中的sample大小及sample的偏移量并记录在音/视频序列容器中;S300:根据所述音/视频序列容器中sample大小及sample的偏移位置,修改所述MP4正常文件中moov的区块偏移表的偏移量,用以重新构建所述MP4正常文件的moov;S400:采用所述MP4损坏文件的媒体数据区域替换步骤S300中所重新构建的所述MP4正常文件的媒体数据区域,生成正常播放的MP4文件,完成所述MP4损坏文件的修复。
Description
技术领域
本发明属于电子数据恢复与取证领域,涉及一种音/视频文件的修复方法,尤其涉及一种修复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文件总体布局如下所示:
本申请的主要方法是:解析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的数据结构如下:
注意,此时sample description atom的类型是'stsd',包含了一个sampledescription table。根据不同的编码方式和存储数据的文件数目,每个媒体数据可以有一个到多个sample description。sample-区块对应关系表通过该索引表,找到合适媒体数据中每个sample的描述。
S1012:读取sample描述表中的数据格式作为编码方式,编码方式包括avc1、mp4a、mp4v、alac、samr、Twos、apcn、in24、sowt及sawb;
下表为本发明实施例中的sample描述表:
通过读取上表中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字节,记为集合:
track0chunk offsets('stco'):[1,10,20,30]
track1在区块(chunk)的偏移量为2,4,12,15,21,24,32,33字节,记为集合:
track1chunk offsets('stco'):[2,4,12,15,21,24,32,33]
track2在区块(chunk)的偏移量为6,7,18,19,25,28,38,39字节,记为集合:
track2chunk 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的数据结构如下:
值得注意的是,此时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数据的封装模式),记为:
interleaveMask:[0,1,0,1,0,1,0,1,0,1,0]
samplesPerChunkMask:[(1;1),(2;1),(1;1),(2;1),(1;1),(2;1),(1;1),(1;1),(1;1),(2;1),(1;1)]
其中,interleaveMask中的0表示track0,1表示track1,换言之,此时的交错模式是track0、track1交替出现,而交错模式的获取方法由步骤S102获得;samplesPerChunkMask中圆括号中第一个数字表示sample的数量,第二个数字表示description ID
track0 Chunk#:1 2 3 4 5 6
track1 Chunk#:1 2 3 4 5
上述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损坏文件的方法的技术问题。
应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
Claims (3)
1.一种修复MP4损坏文件的方法,其特征在于包括以下步骤:
S100:获取任一MP4正常文件,解析所述MP4正常文件以获取数据流的编码方式、sample数据的封装模式及时间流的交错模式,其中,所述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:根据所述编码方式及所述交错模式,扫描所述MP4损坏文件的媒体数据区域并获取所述媒体数据区域中的sample大小及sample的偏移量并记录在音/视频序列容器中;
S300:根据所述音/视频序列容器中sample大小及sample的偏移位置,修改所述MP4正常文件中moov的区块偏移表的偏移量,用以重新构建所述MP4正常文件的moov;
S400:采用所述MP4损坏文件的媒体数据区域替换步骤S300中所重新构建的所述MP4正常文件的媒体数据区域,生成正常播放的MP4文件,完成所述MP4损坏文件的修复。
2.根据权利要求1所述的一种修复MP4损坏文件的方法,其特征在于,所述步骤S200包括以下步骤:
S201:读取所述MP4损坏文件的媒体数据容器的数据,查找媒体数据的标识,所述媒体数据的标识为媒体数据的起始地址;
S202:根据所述MP4正常文件的交错模式,选取要匹配的音/视频序列;
S203:根据所述MP4正常文件的每区块的sample数获取要匹配的sample个数;
S204:根据音/视频序列的编码方式来扫描媒体数据中的sample,用以匹配所读取的sample;
S205:判断所读取的sample是否与音/视频序列的编码方式匹配,如果是,执行步骤S207,否则,执行步骤S206;
S206:寻址下一所需读取的sample,执行步骤S204;
S207:记录当前sample的字节长度和偏移量,并将当前sample的偏移量记录在音/视频序列容器中。
3.根据权利要求2所述的一种修复MP4损坏文件的方法,其特征在于,针对不同的音/视频序列的编码方式,获取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字节。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911050367.3A CN110740391B (zh) | 2019-10-31 | 2019-10-31 | 一种修复mp4损坏文件的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911050367.3A CN110740391B (zh) | 2019-10-31 | 2019-10-31 | 一种修复mp4损坏文件的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110740391A CN110740391A (zh) | 2020-01-31 |
CN110740391B true CN110740391B (zh) | 2021-10-26 |
Family
ID=69271945
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911050367.3A Active CN110740391B (zh) | 2019-10-31 | 2019-10-31 | 一种修复mp4损坏文件的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110740391B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112040239B (zh) * | 2020-09-14 | 2022-07-26 | 国网重庆市电力公司电力科学研究院 | 一种基于avi格式文件结构的文件修复方法及装置 |
CN113127265B (zh) * | 2021-03-29 | 2023-03-10 | 珠海全志科技股份有限公司 | 行车记录文件的修复方法及*** |
CN113613088A (zh) * | 2021-08-02 | 2021-11-05 | 安徽文香科技有限公司 | 一种mp4文件的修复方法、装置、电子设备及可读存储介质 |
CN114125469B (zh) * | 2021-11-08 | 2022-07-12 | 北京天宇威视科技股份有限公司 | Mp4文件修复方法、装置、电子设备及存储介质 |
CN114007112B (zh) * | 2021-11-30 | 2023-06-02 | 四川效率源信息安全技术股份有限公司 | 一种针对MP4视频文件中mdat box数据错误的修复方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102469315A (zh) * | 2010-11-16 | 2012-05-23 | 联芯科技有限公司 | Mpeg-4视频码流的错误恢复方法和装置 |
CN104462433A (zh) * | 2014-12-17 | 2015-03-25 | 四川效率源信息安全技术有限责任公司 | 一种恢复fat32分区数据的方法 |
CN104486614A (zh) * | 2014-12-10 | 2015-04-01 | 央视国际网络无锡有限公司 | Mp4视频格式损坏检测方法 |
CN105451073A (zh) * | 2015-11-16 | 2016-03-30 | 深圳Tcl数字技术有限公司 | Mp4视频源的传送方法和装置 |
CN108093299A (zh) * | 2017-12-22 | 2018-05-29 | 厦门市美亚柏科信息股份有限公司 | Mp4损坏文件的修复方法及存储介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP6681580B2 (ja) * | 2014-08-04 | 2020-04-15 | パナソニックIpマネジメント株式会社 | 送信方法、受信方法、送信装置及び受信装置 |
EP3338451A1 (en) * | 2015-09-23 | 2018-06-27 | ARRIS Enterprises LLC | Single layer high dynamic range coding with standard dynamic range backward compatibility |
-
2019
- 2019-10-31 CN CN201911050367.3A patent/CN110740391B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102469315A (zh) * | 2010-11-16 | 2012-05-23 | 联芯科技有限公司 | Mpeg-4视频码流的错误恢复方法和装置 |
CN104486614A (zh) * | 2014-12-10 | 2015-04-01 | 央视国际网络无锡有限公司 | Mp4视频格式损坏检测方法 |
CN104462433A (zh) * | 2014-12-17 | 2015-03-25 | 四川效率源信息安全技术有限责任公司 | 一种恢复fat32分区数据的方法 |
CN105451073A (zh) * | 2015-11-16 | 2016-03-30 | 深圳Tcl数字技术有限公司 | Mp4视频源的传送方法和装置 |
CN108093299A (zh) * | 2017-12-22 | 2018-05-29 | 厦门市美亚柏科信息股份有限公司 | Mp4损坏文件的修复方法及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN110740391A (zh) | 2020-01-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110740391B (zh) | 一种修复mp4损坏文件的方法 | |
US7965858B2 (en) | Data processing apparatus and method | |
CN101075462B (zh) | 记录/再现/编辑装置、方法 | |
US9729828B2 (en) | Data structure of multimedia file format, encrypting method and device thereof, and decrypting method and device thereof | |
US7920713B2 (en) | Recorded video broadcast, streaming, download, and disk distribution with watermarking instructions | |
US7831127B2 (en) | Combining video material and data | |
JP4481889B2 (ja) | データ記録装置及びその方法、プログラム、記録媒体 | |
US20080256431A1 (en) | Apparatus and Method for Generating a Data File or for Reading a Data File | |
KR100904100B1 (ko) | 프레임 관련 정보 제공 방법, 프레임 관련 정보 수신 방법및 프레임 관련 정보 검색 시스템 | |
US20050204385A1 (en) | Processing and presentation of infomercials for audio-visual programs | |
EP3695611A1 (en) | Method, device, and computer program for generating timed media data | |
KR102122628B1 (ko) | 컨테이너 포맷으로 된 미디어 파일의 구문 인식 조작 | |
CN1264120A (zh) | 数字式记录重放装置 | |
TW201230747A (en) | Arranging sub-track fragments for streaming video data | |
EP1779341A2 (en) | Methods, apparatuses, and systems for presenting advertisement content within trick files | |
KR101316579B1 (ko) | Mp4 파일 구성 장치 및 복구 장치, mp4 파일 구성 방법 및 복구 방법 | |
US20110222835A1 (en) | Application Tracks in Audio/Video Containers | |
US10446188B2 (en) | Method and apparatus for low latency non-linear media editing using file-based inserts into finalized digital multimedia files | |
CN107077873A (zh) | 将样本元数据与媒体样本进行耦合 | |
EP1472880A1 (en) | Error correction of stream data | |
KR101432994B1 (ko) | 미디어 객체 기반 메타데이터의 생성 방법, 재생 방법 및그 장치 | |
KR101681835B1 (ko) | 실감 효과 미디어 데이터 파일 구성 방법 및 장치, 실감 효과 미디어 데이터 파일 재생 방법 및 장치 및 실감 효과 미디어 데이터 파일 구조 | |
US20050276580A1 (en) | System and method for maintaining DVD-subpicture streams upon conversion to higher compressed data format | |
KR101199166B1 (ko) | 보간 프레임 생성 시스템 | |
CN112929686B (zh) | 线上实时回放录制视频的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |