容器格式
组成MP4的基本单位是
Box
Box
Box由
BoxHeader和BoxBody组成
基础Box
ftyp(File Type Box)
位于MP4文件的起始位置,是文件的类型标识符,有且仅有一个。
major_brand:标识了文件的主要编解码器或格式标准,例如isom,iso2,avc1,mp42等。minor version:提供major brand对应的版本号compatible_brands:是MP4文件中用于列出文件可兼容的一系列格式标准,确保不同软件和设备能识别并正确处理文件。
moov (Movie Box)
位于顶层,有且仅有一个。moov是一个
container Box,意味着他可以容纳别的Box。
moov通常包含以下几个子box:
mvhd(Movie Header Box):包含整个文件的全局信息,如时长和时间单位。以下是一些常见的mvhd私有字段。timescale:这是一个单位时间的度量标准,用于定义媒体的时间单位。timescale的值表示每秒包含多少个时间单位。例如,如果timescale是1000,那么每个时间单位代表1毫秒。duration:这是媒体文件的总时长,以时间单位(由timescale定义)表示rate:表示默认的播放速率。通常其值是0x00010000(即1.0),表示正常速度播放。如果值为0x00020000(即2.0),表示双倍速度播放。volume:表示默认的音量。其值是一个8.8固定点数(即一个16位值,其中高8位表示整数部分,低8位表示小数部分)。通常值为0x0100(即1.0),表示100%音量。matrix:这是一个3x3矩阵,用于描述视频的变换信息,如旋转、缩放、平移等。这个参数允许对视频内容进行几何变换,适用于在播放时进行图像处理或校正。next_track_id:表示下一个将被创建的轨道ID。每个轨道(如视频轨道、音频轨道、字幕轨道)在文件中都有一个唯一的track_id。当需要在文件中添加新轨道时,将使用next_track_id,并且这个值随后会递增。
trak(Track Box):每个trak box代表一个轨道,可能是视频、音频或字幕轨道。每个trakbox又包含其他子box,如tkhd(Track Header Box)、mdia(Media Box)等。iods(Object Descriptor Box):可选,包含初始对象描述符。
mdat(Media Data Box)
mdatBox 存储了实际的媒体数据,包括视频帧、音频样本等。它是媒体文件中实际数据的存储位置。
其他几个重要的子Box
mdia(Media Data Box):位于track下,包含实际的媒体数据,例如视频帧和音频样本。它是文件中体积最大的部分,因为它存储了所有的原始媒体内容。mdhd(Media Header Box):包含媒体的时间和时长信息。hdlr(Handler Reference Box):指定媒体的类型(视频、音频等)。minf(Media Information Box):包含媒体信息,具体到音频或视频的详细信息。
MP4解析流程
- 读取文件头部:读取
ftyp,获取文件的类型和版本号。 - 解析 Box 结构:
- 从文件头部开始,逐个解析每个 Box,直到找到
moovBox。 - 根据 Box 的大小字段来确定 Box 的结束位置,以便跳到下一个 Box 的起始位置。
- 解析
moovBox:
moovBox 包含了关于媒体文件的元信息,如轨道信息、时长、编解码器等。- 解析
moovBox 中的子 Box,如mvhd、trak等,以获取更详细的信息。
- 解析轨道(
trak) :
- 遍历
trakBox,解析每个轨道的信息,包括媒体类型、时间戳、解码器等。
- 解析媒体数据:
- 读取
mdatBox 中的实际媒体数据,根据moovBox 中的信息解析这些数据。
常见概念
sample:在MP4文件中,sample是媒体数据的基本单位,对于视频来说,sample通常是一个视频帧;对于音频来说,sample通常是一组音频样本(如一帧AAC音频数据)track:track是MP4文件中组织媒体数据的高级单位。每个track包含一种类型的媒体数据,如视频、音频或字幕。一个MP4文件可以包含多个track。