MP4数据封装格式

一 、MP4   https://blog.csdn.net/sdsszk/article/details/90719075

MP4   由很多个ATOM 嵌套构成,主要的ATOM包括  【ftyp】 【moov】【mdat】

ftyp在第一个, moov 和mdat顺序不固定,moov保存着视频播放的索引,

在线播放,moov必须在前面

部分摄像设备   moov-free-mdat

Atom结构:

这里写图片描述

 1. ftype moov 和 mdat

  ftype:

  作用:确定文件的类型

    

  MOOV 
  moov中主要保存了媒体的时间信息、trak信息和媒体索引等。

  MDAT 

  所有媒体数据统一存放在mdat中

 

3. moov  结构

3.1 mvhd   时间长度

(1/1000)*70080 秒

 

3.2 track  视频索引

3.2.1  track->tkhd

  

3.2.2 moov-trak-mdia-hdlr   track 类型   包括’vide’, ‘soun’和’hint’三种。

 3.2.3    track 时间

  moov-track-media-mdhd   :

  moov-trak-mdia-minf-stbl-stts中有媒体帧之间的时间间隔,单位是moov-trak-tkhd中的时间粒度。

3.2.4

moov-trak-mdia-minf-stbl比较重要,其中保存了解码器需要的信息和索引信息,以下Atom都是stbl Atom的孩子。 
stsd中保存了解码器需要的媒体描述信息。 

stss  标识媒体流中的关键帧

stts  数据帧之间的间隔

stco     每个数据Chunk在文件中的偏移

 stsc给出各个数据Chunk中包含的数据帧。一个chunk可能会包含一个或者几个帧。每个chunk会有不同的size,每个chunk中的帧也会有不同的size。 

stsz  样本大小

4  实际应用场景

1、把文件尾部的moov移到文件头 
对于流媒体播放,如果mdat的位置在moov之前,通过流的方式播放文件会出现问题,因为没有办法在一开始就获得文件的媒体信息和索引。 
这种情况需要对视频做预处理,把moov移动到文件头。通过遍历Atom可以很容易找到moov Atom。

需要注意的是,移动moov到文件头,同时需要修改moov中的stco/co64。因为这里保存了chunk数据的偏移量,移动moov后,需要根据moov的新位置更新stco/co64 。

2、分割MP4文件 
在视频点播服务中,需要将MP4文件分割为多个分片,此时需要获取关键帧、切割时间轴、更新moov和生成各个分片文件。

可参考 http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html

原文地址:https://www.cnblogs.com/luoyinjie/p/11581825.html