1.简介
首先了解以下几个概念:
- MP4文件由许多Box和FullBox组成
- 每个Box由Header和Data两部分组成
- FullBox是Box的扩展,在Box的基础上,在Header中增加8位version标志和24位flags标志
- Header包含了Box的size和type,size==0时,代表是最后一个Box;size==1时,说明Box的长度需要更多的位来描述,在后面会定义一个64位的largesize用来描述Box的长度。type为uuid是,说明这个Box的数据是用户自定义扩展类型。
- Data为Box的实际数据,可以是纯数据,也可以是更多的子Box,当Data为子Box时,这个Box又可以称为容器。
下图为主要的box:
2.MP4可视化工具
3.简单分析
使用MP4info工具打开任意一个MP4文件,如下图所示。
3.1moov容器
至少包含以下3种中的一种:
- mvhd标签:存放未压缩过的影片信息头容器
- cmov标签:压缩过的电影信息容器,不常用
- rmra标签:参考电影信息容器,不常用
也可以包含其他容器信息,例如:一个或几个trakAtom(trak)、User Data Atom(udta)等。
trak中定义了媒体文件中一个track的信息,track是媒体文件中可以独立操作的媒体单位,例如一个音频流就是一个track,一个视频流就是一个track。
moov参数如下所示:
4字节的movie header atom + 4字节的类型
上图所示:moov容器供包含0x0000E012(57362)字节,类型:0x6d6f6f76(moov)。
紧接着解析,0x0000006C(108)字节,类型:0x6d766864(mvhd)。
然后解析trak:
这个trak的大小是:0x00008b66(35686)字节,类型:0x7472616b
继续下一个trak:
这个trak的大小是:0x0000540E(21518)字节,类型:0x7472616b
继续解析udta:
这个udta的大小是:0x0000002A(42)字节,类型:0x75647461
如图1所示:一个moov中包含了 1个mvhd + 2个trak + 1个udta
根据前面描述的信息可知,udta+音频trak+视频trak+mvhd+moov参数描述大小(8字节)刚好为57362字节。
3.2mvhd容器
主要是电影文件头信息。上述108字节
mvhd参数如下所示:
字段 | 长度/字节 | 描述 |
尺寸 | 4 | movie header atom字节数 |
类型 | 4 | mvhd |
版本 | 1 | movie header atom版本 |
标志 | 3 | 扩展的movie header,这里为0 |
生成时间 | 4 | 起始时间 |
修订时间 | 4 | 修订时间 |
Time scale | 4 | 时间计算单位 |
Duration | 4 | 影片播放长度时间值 |
播放速度 | 4 | 播放速度。1.0位正常速度 |
播放音量 | 2 | 音量。1.0位最大音量 |
保留 | 10 | 0 |
矩阵结构 | 36 | |
预览时间 | 4 | 开始预览此movie的时间 |
预览duration | 4 | 以movie的time scale为单位,预览duration |
Poster time | 4 | Poster时间值 |
Selection time | 4 | 当前选择时间的开始时间值 |
Selection duration | 4 | 当前选择时间的计算后的时间值 |
当前时间 | 4 | |
下一个track ID |
4 | 0不是一个有效的ID |
3.3trak子容器
trak中定义了媒体文件中一个track的信息,track是媒体文件中可以独立操作的媒体单位,每个trak都有与它关联的media容器描述信息。一个trak容器中必须要有一个tkhd、一个mdia。如下图所示
3.4tkhd容器
tkhd大小为:0x0000005c(92字节),类型0x746B6864
tkhd参数如下
字段 | 长度/字节 | 描述 |
尺寸 | 4 | 字节数 |
类型 | 4 | 类型 |
版本 | 1 | 版本 |
标志 | 3 | |
生成时间 | 4 | 起始时间 |
修订时间 | 4 | 修订时间 |
Track ID | 4 | |
保留 | 4 | 0 |
duration | 4 | track的Duration |
保留 | 8 | 0 |
Layer | 2 | 视频层,默认为0 |
Alternate group | 2 | track分组信息,默认为0 |
音量 | 2 | 1.0为正常音量 |
保留 | 2 | 0 |
矩阵结构 | 36 | |
宽度 | 4 | 如果是视频,为图像宽度 |
高度 | 4 | 如果是视频,为图像高度 |
3.5mdia容器
track里面的mdia信息,必须包含下列容器:
- mdhd:媒体头
- hdlr:句柄参考
- minf:媒体信息
如图3.3中的图所示。
3.6mdhd容器
描述媒体头信息,参数如下所示
字段 | 长度/字节 | 描述 |
尺寸 | 4 | 字节数 |
类型 | 4 | 类型 |
版本 | 1 | 版本 |
标志 | 3 | 0 |
生成时间 | 4 | 起始时间 |
修订时间 | 4 | 修订时间 |
Time scale | 4 | 时间计算单位 |
duration | 4 | track的duration时长 |
语言 | 2 | 媒体的语言码 |
质量 | 2 | 媒体回放质量 |
3.7minf容器
包含了很多重要的子容器,例如音视频采样等信息相关的的容器,minf容器中的信息将作为音视频数据的映射存在,内容信息如下:
- 视频信息头:vmhd子容器
- 音频信息头:smhd子容器
- 数据信息:dinf子容器
- 采样表:stbl子容器
3.8edts容器
edts容器定义了创建Movie媒体文件中一个track的一部分媒体,所有的edts数据都在一个表里,包括每一部分的时间偏移量和长度,如果没有该表,那么这个track就会立即开始播放。