文章目录
一、前言
之前一直接触MP4格式的文件,但一直没有静下心来仔细研究,最近有时间,总结记录一下,顺便也查漏补缺一下。我们首先清楚的是,MP4 也称为 MPEG-4 第 14 部分,是继承 MPEG-4 第 12 部分的 ISO 基础媒体文件格式并略作扩展而来,定义于标准 ISO/IEC 14496-14 中,是一种标准的数字多媒体容器格式,广泛用于包装视频和音频数据流、海报、字幕和元数据等。目前流行的视频编码格式 AVC/H264 定义在 MPEG-4 Part 10。
二、MP4格式概览
1、基本结构
MP4 文件的数据都是封装在一个又一个名为 Box 的单元中。MP4 中最基本的单元就是 Box,它内部是通过一个一个独立的 box 拼接而成的。每个 box 分为 Header 和 Data。其中 Header 部分包含了 box 的类型和大小,Data 包含了子 box 或者数据。一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。
2、整体结构
下图是一个典型 MP4 文件的基本结构:

Box 有不同的类型,有着不同的数据结构,Box 中还可以包含其他 Box。Box 的类型详见下表(其中 * 表示当父 Box 存在时,则必须包含该 Box):

三、结合实例
先贴一些张我们要分析的MP4文件的mediainfo图:
再来一张整体结构图:

注意此文件的层次结构,方便后续分析理解。
1、File Type Box(ftyp)
File Type Box,一般在文件的开始位置,描述的文件的版本、兼容协议等。该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。ftyp 相当于mp4 的纲领性说明。即,告诉demuxer它的基本解码版本,兼容格式。简而言之,就是用来告诉客户端,该 MP4 的使用的解码标准。所以,ftyp 都是放在 MP4 的开头。
它的格式为:
aligned(8) class FileTypeBox
extends Box(‘ftyp’) {
unsigned int(32) major_brand;
unsigned int(32) minor_version;
unsigned int(32) compatible_brands[];
}
上面的字段一律都是放在 data 字段中(参考,box 的描述)。
- major_brand: 因为兼容性一般可以分为推荐兼容性和默认兼容性。这里 major_brand 就相当于是推荐兼容性。一般而言都是使用
isom这个万金油即可。如果是需要特定的格式,可以自行定义。 - minor_version: 指最低兼容版本。
- compatible_brands: 和 major_brand 类似,通常是针对 MP4 中包含的额外格式,比如,AVC,AAC 等相当于的音视频解码格式。
按照上文所述,每个box的header前 4 个字节 00 00 00 20 表示该 Box 的 size,接着 4 个字节 66 74 79 70 是该 Box 的 type,即 ftyp。接下来 4 个字节 69 73 6F 6D 是主 brand,表示该文件所遵循的标准规格,这里是 isom,即遵循 ISO Base Media File Format。接下来的 4 个字节 00 00 02 00 表示的是这个 Box 格式的版本号。接下来的 16 个字节则是兼容的 compatible brands,即该文件兼容的其他标准规格,这里是 isom、iso2、avc1、mp41。
2、Movie Box(moov)
该部分包含了文件媒体的metadata信息,“moov”是一个contanier box,具体内容由其子box诠释。同ftyp box一样该box有且只有一个,且只包含在文件层,一般情况下moov会跟着ftyp出现。moov Box 可以说是 MP4 文件中最重要的 Box,一般播放器的实现都需要读取到 moov 的数据才能开始播放流程。
一 般情况下,“moov”中会包含1个“mvhd”和若干个“trak”。其中“mvhd”为header box,一般作为“moov”的第一个子box出现(对于其他container box来说,header box都应作为首个子box出现)。“trak”包含了一个track的相关信息,是一个container box。
2.1 Movie Header Box(mvhd)
Movie Header Box,记录整个媒体文件的描述信息,如创建时间、修改时间、时间度量标尺、可播放时长等。
| 字段 | 字节数 | 意义 |
| box size | 4 | box大小 |
| box type | 4 | box类型 |
| version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) |
| flags | 3 | |
| creation time | 4 | 创建时间(相对于UTC时间1904-01-01零点的秒数) |
| modification time | 4 | 修改时间 |
| time scale | 4 | 文件媒体在1秒时间内的刻度值,可以理解为1秒长度的时间单元数 |
| duration | 4 |
MP4文件结构解析

本文详细介绍了MP4文件的结构及组成部分,包括基本结构、整体结构、实例分析等内容。重点讲解了FileTypeBox、MovieBox、TrackBox等核心Box的功能与组成。


最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



