MP4 文件格式又被称为 MPEG-4 Part 14,出自 MPEG-4 标准第 14 部分 。它是一种多媒体格式容器,广泛用于包装视频和音频数据流、海报、字幕和元数据等。(顺便一提,目前流行的视频编码格式 AVC/H264 定义在 MPEG-4 Part 10)。MP4 文件格式基于 Apple 公司的 QuickTime 格式,因此, 也可以作为我们研究 MP4 的重要参考。
作者:张武星
审核:泰一
MP4 文件由 box 组成,每个 box 分为 Header 和 Data。其中 Header 部分包含了 box 的类型和大小,Data 包含了子 box 或者数据,box 可以嵌套子 box。
下图是一个典型 MP4 文件的基本结构:
图中看到 MP4 文件有几个主要组成部分:
fytpFile Type Box,一般在文件的开始位置,描述的文件的版本、兼容协议等。
Movie Box,包含本文件中所有媒体数据的宏观描述信息以及每路媒体轨道的具体信息。一般位于 ftyp 之后,也有的视频放在文件末尾。注意,当改变 moov 位置时,内部一些值需要重新计算。
Media Data Box,存放具体的媒体数据。
MP4 的媒体数据信息主要存放在 Moov Box 中,是我们需要分析的重点。moov 的主要组成部分如下:
mvhdMovie Header Box,记录整个媒体文件的描述信息,如创建时间、修改时间、时间度量标尺、可播放时长等。
下图示例中,可以获取文件信息如时长为 3.637 秒。
User Data Box,自定义数据。
trackTrack Box,记录媒体流信息,文件中可以存在一个或多个 track,它们之间是相互独立的。每个 track 包含以下几个组成部分:
tkhdTrack Header Box,包含关于媒体流的头信息。
下图示例中,可以看到流信息如视频流宽度 720,长度 1280。
Media Box,这是一个包含 track 媒体数据信息的 container box。子 box 包括:
mdhd:Media Header Box,存放视频流创建时间,长度等信息。
hdlr:Handler Reference Box,媒体的播放过程信息。
minf:Media Information Box,解释 track 媒体数据的 handler-specific 信息。minf 同样是个 container box,其内部需要关注的内容是 stbl,这也是 moov 中最复杂的部分。
stbl 包含了媒体流每一个 sample 在文件中的 offset,pts,duration 等信息。想要播放一个 MP4 文件,必须根据 stbl 正确找到每个 sample 并送给解码器。
mdia 展开如下图所示:
Sample Table Box,上文提到 mdia 中最主要的部分是存放文件中每个 Sample 信息的 stbl。在解析 stbl 前,我们需要区分 Chunk 和 Sample 这两个概念。
在 MP4 文件中,Sample 是一个媒体流的基本单元,例如视频流的一个 Sample 代表实际的 nal 数据。Chunk 是数据存储的基本单位,它是一系列 Sample 数据的集合,一个 Chunk 中可以包含一个或多的 Sample。
stbl 用来描述每个 Sample 的信息,包含以下几个主要的子 box:
stsdSample Description Box,存放解码必须的描述信息。
下图示例中,对于 h264 的视频流,其具体类型为 avc1,extensions 中存放有 sps,pps 等解码必要信息。