前言
MP4,又称为MPEG-4 Part 14,是一种多媒体容器格式(container),扩展名为.mp4
发展历史
- 2001年,apple的QuickTime格式,.qt和.mov的后缀名。
- 2001年,MPEG-4 Part1,把基于QuickTime的box布局的容器格式添加到了MPEG-4标准。
- 2004年,MPEG-4标准文档把编码和容器格式分开为两部分进行说明。
MPEG-4 Part12:定义了容器格式通用的box结构,即ISO基本媒体文件格式(ISO base media file format, ISOBMFF)。
MPEG-4 Part14:基于Part12进行了细化,是对Part-12的一种实现,定义了用于存储MPEG-4内容的容器格式,即.mp4格式。
两者间的关系:
MP4在线分析工具
- mp4parser
界面如下:
- onlinemp4parser
界面如下:
MPEG-4
MPEG-4协议中不同部分描述的对象:
MP4解析
MP4文件中,媒体信息储存在“moov”的box中,一个moov通常包含若干个track信息,每个track都是一个随时间变化的媒体序列,Track里面基本时间单位为sample,sample是按照时间顺序排列,为了方便存取,若干个sample会被组织成一个chunk;而媒体数据存储在mdat box中,即sample是存储在mdat box中。如下图为sample和chunk关系:
重要概念
Box
MP4文件有若干个box组成。
下图为box的内部结构图:
可以看到:
- Box由header和body组成,header大小为8 bytes, 主要有size和type两个栏位。
size: 是包含box header的整个box的大小。
type: 通常是4个ASCII码的字符如“ftpy”,“moov”。这些box type都是mp4 spec已经预定义好的,表示特定的含义。!! 两种特殊情况: 当size为1,则表示box长度超出4字节表示范围,就会用largesize(8 bytes)来表示box大小。 当size为0,表示该box为文件的最后一个box,这种情况只存在“mdat”类型的box中。
如果是“uuid”,表示该box是用户自定义的拓展类型
- 规范还定义了一种Fullbox,Fullbox是box的扩展。header中加入了1字节的version和3字节的flags字段,整个header大小是12bytes。
结构如下图:
- box中可以嵌套box,这种box被称为container box,比如moov box。而ftyp box不是container box,因为没有包含其它box。
Track
相同类型的sample的集合,对于媒体数据来说,一个track表示一个视频序列、一个音频序列或一个字幕序列。
Sample
Mp4中多媒体数据存储的最小单位。
video sample表示一帧或者一组连续的视频帧,audio sample表示一段连续的音频(也可以说是一帧音频帧)。
Chunk
一个track的几个sample组成的单元。
BOX详解
MP4文件由许多box组成,每个box包含不同信息,这些box以树型结构的方式组织。如下图:
可以看到在根节点之下,主要包含三个重要节点:ftyp、moov、mdat。
- ftyp:file type box,文件类型。描述本文件遵从的规范版本。
内部结构为:aligned(8