2024年3月31日发(作者:)

MPEG-4文件结构解析

目前MP4的概念被炒得很火,也很乱。最开始MP4指的是音频(MP3的升级版),即

MPEG-2 AAC标准。随后MP4概念被转移到视频上,对应的是MPEG-4标准。而现在我们

流行的叫法,多半是指能播放MPEG-4标准编码格式视频的播放器。但是这篇文章介绍的

内容跟上面这些都无关,我们要讨论的是MP4文件封装格式,对应的标准为ISO/IEC

14496-12,即信息技术

视听对象编码的第12部分:ISO

基本媒体文件格式(Information

technology Coding of audio-visual objects Part 12: ISO base media file format)。ISO/IEC组织

指定的标准一般用数字表示,ISO/IEC 14496即MPEG-4标准。

MP4视频文件封装格式是基于QuickTime容器格式定义的,因此参考QuickTime的格

式定义对理解MP4文件格式很有帮助。MP4文件格式是一个十分开放的容器,几乎可以用

来描述所有的媒体结构,MP4文件中的媒体描述与媒体数据是分开的,并且媒体数据的组

织也很自由,不一定要按照时间顺序排列,甚至媒体数据可以直接引用其他文件。同时,

MP4也支持流媒体。MP4目前被广泛用于封装h.264视频和AAC音频,是高清视频的代表。

现在我们就来看看MP4文件格式到底是什么样的。

1、概述

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进行描述。

下面是一些概念:

track

表示一些sample的集合,对于媒体数据来说,track表示一个视频

或音频序列。

hint track

这个特殊的track并不包含媒体数据,而是包含了一些将其他

数据track打包成流媒体的指示信息。

sample

对于非hint track来说,video sample即为一帧视频,或一组连

续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint

track,sample定义一个或多个流媒体包的格式。

sample table

指明sampe时序和物理布局的表。

chunk

一个track的几个sample组成的单元。

在本文中,我们不讨论涉及hint的内容,只关注包含媒体数据的本地MP4

文件。下图为一个典型的MP4文件的结构树。

2、Box

首先需要说明的是,box中的字节序为网络字节序,也就是大端字 节序

(Big-Endian),简单的说,就是一个32位的4字节整数存储方式为高位字节

在内存的低端。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中。)

size后面紧跟的32位为box type,一般是4个字符,如“ftyp”、

“moov”等,这些box type都是已经预定义好的,分别表示固定的意义。如果

是“uuid”,表示该box为用户扩展类型。如果box type是未定义的,应该将

其忽略。

3、File Type Box(ftyp)

该box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该

被放在文件的最开始,指示该MP4文件应用的相关信息。

“ftyp” body依次包括1个32位的major brand(4个字符),1个32

位的minor version(整数)和1个以32位(4个字符)为单位元素的数组

compatible brands。这些都是用来指示文件应用级别的信息。该box的字节实

例如下:

4、Movie Box(moov)