mp4文件修复

  

目录

1、MP4文件类型

2、修复标准mp4思想

1、 标准mp4文件结构如下:

2、mdat box数据封装

3、mdat box中音视频帧区分

 3、mp4修复验证平台


     最近需要在使用mp4录像,mp4录像中不可避免的要直视掉电损坏mp4文件问题。为了解决这个问题各种逛论坛,各种给大神留言,加大神qq,最后因为价格问题被逼只能自己来解决问题。在这个过程中科普了一个mp4文件类型问题。

1、MP4文件类型

标准mp4:MP4 实际代表的含义是 MPEG-4 Part 14。它只是 MPEG 标准中的 14 部分。MP4 主要作用是可以实现快进快放,边下载边播放的效果。他是基于MOV,然后发展成自己相关的格式内容。

fmp4:是基于 MPEG-4 Part 12 的流媒体格式。也有称之为ismv文件的。

mp4文件修复_第1张图片

2、修复标准mp4思想

    基本的mp4概念,h264/h265视频基本概念我这里就不做讲解了,需要了解的兄弟们可以自己去网上了解。

1、 标准mp4文件结构如下:

mp4文件修复_第2张图片

    mp4文件录制过程中,没有完成mp4文件录制,直接掉电会导致moov box数据丢失,moov box的详解了解可以百度查询,moov中心思想就是记录mdat box数据体中音视频裸流数据的数据类型、数据帧偏移地址、数据帧长度等索引信息。所以丢失moov box通用播放器是无法正常解析播放mp4文件的。但是mdat中有掉电前的音视频帧数据,将mdat中的音视频帧数据解析出来然后再封装为完整mp4是修复录像数据的关键。

2、mdat box数据封装

音频帧裸流数据单元(sample)

视频帧长度+视频帧裸流数据单元(sample)

mdat box中的数据都是以流形式写入,一个sample接一个sample存储的,其中视频和音频的差异是:视频数据前面4字节是视频原始数据(视频帧原始数据去掉了h264/h265的00 00 00 01分隔符)长度,长度不包含长度本身4字节,音频数据就没有长度字段。

读取mdat box中的数据后,最为关键的就是区分当前读取数据是视频帧还是音频帧,如果是视频就可以取前4字节指定的长度数据,从而取到一个完整的视频帧。如果是音频帧,音频帧一般都是以固定长度(g711、g726、adpcm)封装的mp4中,取出固定长度的音频帧即为完整的音频帧。然后继续读取mdat数据,区分是视频数据还是音频数据,直到mdat数据分析完成。将分组的音频+视频再打包为mp4,即可完成mp4文件的修复。

3、mdat box中音视频帧区分

这里只说方法,不讲具体实现。有兴趣的伙伴自己去实现吧!!

写入mp4时,将每一帧音视频数据的:帧类型、帧长度、帧数据前16直接打印出来。然后mp4写到一半时突然拔掉sd卡,拿出损坏的mp4文件和打印信息对比分析mdat,就知道如何区分mdat中的音、视频数据了,进而实现mp4文件修复。

 3、mp4修复验证平台

ARM+libmp4v2+h265+g711_a

你可能感兴趣的:(Linux系统,音视频,视频编解码,linux)