媒体文件格式分析之FMP4 MP4 中最基本的单元就是Box,它内部是通过一个一个独立的Box拼接而成的。所以,这里,我们先从 Box 的讲解开始,每个 Box 是由 Header 和 Data 组成的,FullBox 是 Box 的扩展,Box 结构的基础上在 Header 中增加 8bits version 和 24bits flags
1. 名词解释
2. 最小单元Box
2.1 常见的mp4文件结构(简化版)
3. Mp4文件整体结构
这里,我们按照 MP4 box 的划分来进行相关的阐述。先看一张 MP4 给出的结构图:
一般来说,解析媒体文件,最关心的部分是视频文件的宽高、时长、码率、编码格式、帧列表、关键帧列表,以及所对应的时戳和在文件中的位置,这些信息,在mp4中,是以特定的算法分开存放在stbl box下属的几个box中的,需要解析stbl下面所有的box,来还原媒体信息。下表是对于以上几个重要的box存放信息的说明
3.1 File Type Box (ftyp)
通常放在MP4文件的开头,告诉解码器基本的解码版本和兼容格式。
- 基本格式如下:
aligned(8) class FileTypeBox
extends Box(‘ftyp’) {
unsigned int(32) major_brand;
unsigned int(32) minor_version;
unsigned int(32) compatible_brands[];
}
- 字段说明:
- Nginx模块实现
ngx_int_t
ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b)
{
u_char *pos;
pos = ngx_rtmp_mp4_start_box(b, "ftyp");
/* major brand */
ngx_rtmp_mp4_box(b, "iso6");
/* minor version */
ngx_rtmp_mp4_field_32(b, 1);
/* compatible brands */
ngx_rtmp_mp4_box(b, "isom");
ngx_rtmp_mp4_box(b, "iso6");
ngx_rtmp_mp4_box(b, "dash");
ngx_rtmp_mp4_update_box_size(b, pos);
return NGX_OK;
}
3.2 Movie Box (moov)
作为容器盒子,存放相关的trak及meta信息.
- 基本格式如下: