关于修复mp4文件损坏的过程小记

        最近项目中遇到设备异常断电,导致mp4文件损坏的问题,最近花了点时间,深入分析原因,并进行了相关修复尝试工作,最后,虽然文件中的音视频数据大部分可以修复,但因为原始文件中视频的帧率是动态变化的,导致最终修复的视频出现音视频不同步。

       下面的内容会大概对MP4文件格式结构分析和修复策略两方面进行简单记录。

MP4文件格式的分析

       分析MP4格式,首先想到的就是看标准协议,从相关的MP4格式协议入手,那作为程序猿的人,google和维基百科两大利器,相信大部分人都会用到,mp4和mov格式是很相似的,后者的苹果搞出来的标准,具体的相关链接,可以在

https://en.wikipedia.org/wiki/MPEG-4_Part_14

https://wiki.multimedia.cx/index.php?title=QuickTime_container

维基百科页面看到,

通常mp4的格式有如下内容:

关于修复mp4文件损坏的过程小记_第1张图片 mp4格式

同样通过mp4info工具打开录制的mp4文件,发现视频文件包含下面几个atom,ftyp、free、mdat、moov,通常如果异常掉电后,其中moov包含了解析音视频数据的信息,缺少或者损坏了moov中的数据,会导致mp4视频文件打开异常,而mdat结构中则是实际的音视频数据块,它们以chunk的形式进行保存,解析它们的相关指示数据在moov结构中的stco中,stco记录着实际音视频数据的迁移地址,也就是说异常掉电使得moov结构中的数据丢失,进而导致mp4文件打开异常。

关于修复mp4文件损坏的过程小记_第2张图片

 

修复思路

       通过上面的简单描述,修复的思路是:如果存在同样环境下录制的mp4视频文件,这里所说的同样环境是指音频的采样率、通道数,采样点的位宽,视频的帧率、分辨率参数都是一样的情况下。ftyp、free、moov三个结构体中的大部分数据是一样,可以借助这个部分完好的数据,将mdat中区分开的音视频数据重新封装为mp4,注意:这三个结构中数据是重新封装mp4文件会用到。

      下面将如果将mdat块中的音频数据进行区分,通过上面的工具,我们可以观察到mdat数据是在moov前面的,而且mdat的数据是按照chunk块紧密存储的,所以对于损坏的文件,我们可以按照二进制的方式打开文件,逐步将ftyp、free去掉,然后将mda数据块缓存到一个buffer中,后面的工作就是对应这个buffer块中数据进行处理,区分工作这里主要是分区视频数据还是音频数据。而且每个视频的nal单元通常都是0开头,nal单元的第5个单元代表nal的类型,通过这种方式,可以将视频chunk分离出来,并将剩下的非视频chunk标记为音频数据。至此,能够将音视频数据,并通过moov结构中信息将视频文件重新修复。

       目前还存在的问题,由于项目的特殊原因,录制的帧率是动态的,导致修复后音视频不同步,此问题暂时没有解决,待后续考虑。

你可能感兴趣的:(音频视频处理)