MP4文件格式解析
- 一、目的
- 二、MP4结构一览
- 三、 MP4格式解析 & 实例分析
-
- 3.1 box
- 3.2 ftyp (File Type Box)
- 3.3 moov (Movie Box)
- 3.4 mvhd(Movie Header Box)
- 3.5 trak(Track Box)
- 3.6 tkhd(Track Header Box)
- 3.7 mdia(Media Box)
- 3.8 mdhd(Media header Box)
- 3.9 hdlr(Hanlder Reference Box )
- 3.10 minf(Media Information Box)
- 3.11 vmhd (Video Media Header Box)
- 3.12 smhd (Sound Media Header Box)
- 3.13 dinf (Data Information Box)
- 3.14 stbl (Sample Table Box)
- 3.15 stsd (Sample Description Box)
- 3.16 stts (Sample to Timestamp Table)
- 3.17 stss (Sync Sample Box)
- 3.18 stsz (Sample Size Box)
- 3.19 stsc (Sample To Chunk Box)
- 3.20 stco (Chunk Offset Box)
一、目的
- 掌握 MP4 文件格式里的内容 以及基本构成
- 为日后解析其他格式的文件提供良好的借鉴
二、MP4结构一览
- MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。
- 一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述
2.2 MP4结构参考图
- MP4 box 树结构图,可以根据这张图大致了解构造文件构造
2.2 MP4结构参考表
- 参照 c068960_ISO_IEC_14496-12_2015.pdf 中的表格
- 里面有太多元素了,我们此刻分析的.mp4没有这么多,利用小工具 mp4info 查看,仅仅包含 moov + mdat 两部分
- 一般来说,会包含以下三个部分。
节点 | 说明 |
---|---|
ftyp | 文件类型 |
moov | 媒体的metadata信息 |
mdat | 具体的媒体数据 |
三、 MP4格式解析 & 实例分析
- 结合实例来分析一些封装中的概念
- 分析封装数据,网上推荐了小工具,我觉得还可以
- mp4info, 有二进制流左右对照,分析结构很直观
- mp4explorer, 解析每个元素的具体数值,适合不关注二级制流的时候使用
- EStreamEye,据说可以逐帧播放
- Hexinator,二进制作色,分段清晰
3.1 box
- mp4 组成的最小单元,mp4 分析的过程 就是 一个个 box 解析的过程
- box中的字节序为网络字节序,也就是大端字节序(Big-Endian)(高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中)
- Box由header和body组成,其中header统一指明box的大小和类型,body根据类型有不同的意义和格式。
- 标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large size,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到large size。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)
3.2 ftyp (File Type Box)
- 该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,指示该MP4文件应用的相关信息。
3.2.1 定义
Box Type: `ftyp’
Container: File
Mandatory: Yes
Quantity: Exactly one (but see below)
3.2.2 实例
名称 | 字节数 | 元数据 | 数据 |
---|---|---|---|
major brand | 4 | 6D 70 34 32 | mp42 |
minor version | 4 | 00 00 00 00 | 0 |
compatible | 4[] list | 69 73 6F 6D 6D 70 34 32 | isom,mp42 |
3.3 moov (Movie Box)
- 该box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box诠释。同File Type Box一样,该box有且只有一个,且只被包含在文件层。一般情况下,“moov”会紧随“ftyp”出现
- “moov”中会包含1个“mvhd”和若干个“trak”
- 因为 “moov”是一个container box,它的结构可以这样看
3.4 mvhd(Movie Header Box)
- 这里说明只针对该文件的说明,实际上 version的不同,也会造成字节数的分配不同,具体可以参照 ISO -14
3.4.1 定义
Box Type: ‘mvhd’
Container: Movie Box (‘moov’)
Mandatory: Yes
Quantity: Exactly one
3.4.2 实例
名称 | 字节数 | 元数据 | 说明 |
---|---|---|---|
box size | 4 | 00 00 00 6C | 108 |
box type | 4 | 6D 76 68 64 | mvhd |
version | 1 | 00 | 0 |
flags | 3 | 00 00 00 | 0 |
creation time | 4 | DC 80 9D 8C | 创建时间 : 3/24/2021 07:41:00 |
modification time | 4 | DC 80 9D 8C | 修改时间:3/24/2021 07:41:00 |
time scale | 4 | 00 00 03 E8 | 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数: 1000 |
duration | 4 | 00 00 0B 47 | 该track的时间长度,用duration和time scale值可以计算track时长,此时audio track的time scale = 1000, duration = 2887,时长为2.8s |
rate | 4 | 00 01 00 00 | 推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放 |
volume | 2 | 10 00 | 与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量 |
reserved | 10 | 00 00 00 00 00 00 00 00 00 00 | 保留位 |
matrix | 36 | 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 | 视频变换矩阵 |
pre-defined | 24 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | 保留位 |
net track id | 4 | 00 00 | 下一个track使用的id号 |
3.5 trak(Track Box)
- “trak”也是一个container box,其子box包含了该track的媒体数据引用和描述(hint track除外)。一个MP4文件中的媒体可以包含多个track,且至少有一个track,这些track之间彼此独立,有自己的时间和空间信息。“trak”必须包含一个“tkhd”和一个“mdia”,此外还有很多可选的box(略)。其中“tkhd”为track header box,“mdia”为media box,该box是一个包含一些track媒体数据信息box的container box
- 因为 “trak”是一个container box,它的结构可以这样看