1、简介
MP4(或称MPEG-4 Part 14)是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定
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标准。
- 2001年,apple的QuickTime格式,.qt和.mov的后缀名。
- 2001年,MPEG-4 Part1,把基于QuickTime的box布局的容器格式添加到了MPEG-4标准。
- 2004年,标准文档把编码和容器格式的说明分开了。
- MPEG-4 Part12,定义了容器格式通用的box结构,即ISO媒体文件格式(ISO base media file format, ISOBMFF)。
- MPEG-4 Part14,基于Part12进行了细化,定义了用于存储MPEG-4内容的容器格式,即.mp4格式。
下面是各标准文档的链接:
- QuickTime:QuickTime/QTFF
- MPEG-4 Part12:ISO/IEC 14496-12:2015
- MPEG-4 Part14:ISO/IEC 14496-14:2018
MP4文件由许多box组成,每个box包含不同的信息, 这些box以树形结构的方式组织。以下是主要box的简要说明:
根节点之下,主要包含三个节点:ftyp、moov、mdat。
- ftyp:文件类型。描述遵从的规范的版本。
- moov box:媒体的metadata信息。
- mdat:具体的媒体数据。
说明:在 mp4 中默认写入字节序是 Big-Endian(大端字节序)的。
2、mp4文件基本组成
分析mp4文件的工具:
- mp4box.js:一个在线解析mp4的工具。
- bento4:包含mp4dump、mp4edit、mp4encrypt等工具。
- MP4Box:类似于bento4,包含很全面的工具。
- mp4info.exe: windows平台图形界面展示mp4基本信息的工具。
下图为使用mp4info.exe打开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进行描述。
mp4文件基本信息:
(1)audio信息:
- smplrate:sample rate(采样率)。
- channel:通道个数。
- bitrate:比特率。
- audiosamplenum:音频sample的个数。
(2)video信息:
- width、height:视频的宽/高。
- bitrate:比特率(码率),秒为单位。等于视频总的大小/时长。
- frames:视频帧数。
- fps:帧率(frame per second)。
- total_time:时间长度,ms为单位。等于duration/timescale。
- timescale:时间的粒度,1000表示1000个单位为1s。
- duration:时间粒度的个数。
- videosamplenum:视频sample的个数。
3、基本概念
(1)box
mp4文件由若干个box组成。下面是box结构的一个示意图。
- box由header和body组成,其中header指明box的size和type。size是包含box header的整个box的大小。
- box type,通常是4个ASCII码的字符如“ftyp”、“moov”等,这些box type都是已经预定义好的,表示固定的含义。如果是“uuid”,表示该box为用户自定义扩展类型,如果box type是未定义的,应该将其忽略。
- 如果header中的size为1,则表示box长度需要更多的bits位来描述,在后面会有一个64bits位的largesize用来描述box的长度。如果size为0,表示该box为文件的最后一个box,文件结尾(同样只存在于“mdat”类型的box中)。
- box中可以包含box,这种box称为container box。
- box分为两种,Box和Fullbox。FullBox 是 Box 的扩展,Header 中增加了version 和 flags字段,分别定义如下:
aligned(8) class Box (unsigned int(32) boxtype,
optional unsigned int(8)[16] extended_type) {
unsigned int(32) size;
unsigned int(32) type = boxtype;
if (size==1) {
unsigned int(64) largesize;
} else if (size==0) {
// box extends to end of file
}
if (boxtype==‘uuid’) {
unsigned int(8)[16] usertype = extended_type;
}
}
// FullBox有version和flags字段
aligned(8) class FullBox(unsigned int(32) boxtype, unsigned int(8) v, bit(24) f)
extends Box(boxtype) {
unsigned int(8) version = v;
bit(24) flags = f;
}
(2)sample
对于非hint track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。