• 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文件的。

    2、修复标准mp4思想

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

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

        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

  • 相关阅读:
    猿创征文|Android 11.0 Launcher3 时钟动态图标的定制化
    LVI-SAM:激光-IMU-相机紧耦合建图
    C#使用OpenCv(OpenCVSharp)图像轮廓凸包检测与绘制
    c++编写天天酷跑游戏
    C++ PrimerPlus 复习 第四章 复合类型(下)
    k8s优雅停服
    Postgresql JSON对象和数组查询
    AI大模型探索之路-实战篇12: 构建互动式Agent智能数据分析平台:实现多轮对话控制
    高等数学第七章微分方程
    测试老鸟总结,Allure测试报告-自动化测试详解,惊险避坑...
  • 原文地址:https://blog.csdn.net/yuanbinquan/article/details/126128529