MP4音视频格式
1.MP4
MP4是一种用于封装音视频/字幕/图片/章节信息等数据的多媒体容器格式,是MPEG-4系列的成员之一
2.文件结构
MP4由一层层的嵌套Box(atom)组成
[ size (4 bytes) ][ type (4 bytes)][ payload (嵌套box或者数据) ]

3.常见Box
| 类型 | 名称 | 描述 | 
|---|---|---|
| 加粗样式 | ftyp | File Type | 
| moov | Movie Box | 视频元数据(时长、轨道、帧率等) | 
| mdat | Media Data Box | 真正的视频/音频数据 | 
| mvhd | Movie Header | 在 moov 中,记录全局时长、时间基等 | 
| trak | Track Box | 每个音视频轨道的容器(如 video、audio) | 
| tkhd | Track Header | 描述轨道的基本信息(id、宽高等) | 
| mdia | Media Box | 媒体信息容器 | 
| minf | Media Information | 媒体详细信息,如音频格式、视频帧率等 | 
| stbl | Sample Table | 每帧的偏移、大小、时间戳信息 | 
| moof | Movie Fragment | 流式播放中分片播放时的元数据(fragmented MP4 用) | 
| free / skip | Padding Box | 空的填充区域,无实际内容 | 
4.常见box介绍
1.ftyp box
告知视频播放器/编辑器等MP4的格式和兼容标准
[ size ][ type ][ major_brand ][ minor_version ][ compatible_brands… ]
| 字段名 | 大小 | 说明 | 
|---|---|---|
| size | 4 字节 | 总长度(含 header) | 
| type | 4 字节 | Box 类型,值为 ftyp | 
| major_brand | 4 字节 | 主标识,例如 isom, mp41, mp42 | 
| minor_version | 4 字节 | 小版本号 | 
| compatible_brands | N 字节 | 一个或多个 4 字节字符串,表示兼容的播放环境 | 
2.moov box
定义一个MP4文件中的数据信息,类型是moov,包含
mvhd标签:Move Header Atom,存放为压缩过的影片信息头容器
cmov标签:Compressed Movie Atom,压缩过的电影信息容器
rmra标签:Reference Movie Atom, 参考电影信息容器
3.track box
track容器定义了媒体文件中的一个track信息,一个媒体文件中可以包含多个track,每个track之间互相独立,具有自己的时间和空间占用信息。主要用于
 包含媒体数据的引用和描述
 包含modifier track信息
 流媒体协议的打包信息
| 字段 | 长度 | 说明 | 
|---|---|---|
| size | 4字节 | 描述atom大小 | 
| 类型 | 4字节 | tkhd,mdia,clip,matt等 | 
3.tkhd box
| 字段 | 长度/字节 | 描述 | 
|---|---|---|
| 尺寸 | 4 | 这个 Atom 的字节数 | 
| 类型 | 4 | tkhd | 
| 版本 | 1 | 这个 Atom 的版本 | 
| 标志 | 3 | 有效的标志分别如下: • 0x0001:track 生效 • 0x0002:track 被用于 Movie 预览中 • 0x0004:track 被用于 Movie 的 Poster 中 | 
| 生成时间 | 4 | Movie Atom 的起始时间(基准时间是 1904-1-1 0:00 AM) | 
| 修改时间 | 4 | Movie Atom 的修订时间(基准时间是 1904-1-1 0:00 AM) | 
| Track ID | 4 | 唯一标志该 track 的一个非零值 | 
| 保留 | 4 | 这里为 0 | 
| Duration | 4 | track 的 Duration,在电影的时间戳中。与 track 的 edts list 进行的时间戳会建立关联,然后进行时间戳计算,得到对应的 track 的播放时间坐标 | 
| 保留 | 8 | 这里为 0 | 
| Layer | 2 | 视频层,默认为 0,值小的在上层 | 
| Alternate group | 2 | track 分组信息,默认为 0,表示该 track 未与其他 track 有群组关系 | 
| 音量 | 2 | 播放此 track 的音量。1.0 为正常音量 | 
| 保留 | 2 | 这里为 0 | 
| 矩阵结构 | 36 | 该矩阵定义了此 track 中两个坐标空间的映射关系 | 
4.hdlr box
描述媒体流的播放过程
| 字段 | 长度 / 字节 | 描述 | 
|---|---|---|
| 尺寸 | 4 | 这个 Atom 的字节数 | 
| 类型 | 4 | hdlr | 
| 版本 | 1 | 这个 Atom 的版本 | 
| 标志 | 3 | 这里为 0 | 
| Handle 的类型 | 4 | handler 的类型。当前只有两种类型: • mhlr:media handlers• dhlr:data handlers | 
| Handle 的子类型 | 4 | media handler 或 data handler 的类型。 如果 component type 是 mhlr,那么这个字段定义的是媒体数据类型,如:• vide:video 数据• soun:sound 数据如果 component type 是 dhlr,那么这个字段定义的是数据引用类型,如:• alis:文件的别名 | 
| 保留 | 12 | 保留字段,默认为 0 | 
| Component name | 可变 | 这个 component 的名字,也就是生成此 media 的 media handler。该字段的长度可以为 0 | 
