MP4容器

274 阅读4分钟

容器格式

组成MP4的基本单位是Box

image.png

Box

Box由BoxHeaderBoxBody组成

基础Box

ftyp(File Type Box)

位于MP4文件的起始位置,是文件的类型标识符,有且仅有一个。

image.png

  • major_brand:标识了文件的主要编解码器或格式标准,例如isomiso2avc1mp42等。
  • minor version:提供major brand对应的版本号
  • compatible_brands:是MP4文件中用于列出文件可兼容的一系列格式标准,确保不同软件和设备能识别并正确处理文件。

moov (Movie Box)

位于顶层,有且仅有一个。moov是一个container Box,意味着他可以容纳别的Box

image.png 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代表一个轨道,可能是视频、音频或字幕轨道。每个trak box又包含其他子box,如tkhd(Track Header Box)、mdia(Media Box)等。
  • iods(Object Descriptor Box):可选,包含初始对象描述符。

mdat(Media Data Box)

mdat Box 存储了实际的媒体数据,包括视频帧、音频样本等。它是媒体文件中实际数据的存储位置。

其他几个重要的子Box

  • mdia(Media Data Box):位于track下,包含实际的媒体数据,例如视频帧和音频样本。它是文件中体积最大的部分,因为它存储了所有的原始媒体内容。
    • mdhd(Media Header Box):包含媒体的时间和时长信息。
    • hdlr(Handler Reference Box):指定媒体的类型(视频、音频等)。
    • minf(Media Information Box):包含媒体信息,具体到音频或视频的详细信息。

MP4解析流程

  1. 读取文件头部:读取ftyp,获取文件的类型和版本号。
  2. 解析 Box 结构
  • 从文件头部开始,逐个解析每个 Box,直到找到 moov Box。
  • 根据 Box 的大小字段来确定 Box 的结束位置,以便跳到下一个 Box 的起始位置。
  1. 解析 moov Box
  • moov Box 包含了关于媒体文件的元信息,如轨道信息、时长、编解码器等。
  • 解析 moov Box 中的子 Box,如 mvhdtrak 等,以获取更详细的信息。
  1. 解析轨道(trak
  • 遍历 trak Box,解析每个轨道的信息,包括媒体类型、时间戳、解码器等。
  1. 解析媒体数据
  • 读取 mdat Box 中的实际媒体数据,根据 moov Box 中的信息解析这些数据。

常见概念

  • sample:在MP4文件中,sample 是媒体数据的基本单位,对于视频来说,sample 通常是一个视频帧;对于音频来说,sample 通常是一组音频样本(如一帧AAC音频数据)
  • tracktrack 是MP4文件中组织媒体数据的高级单位。每个track 包含一种类型的媒体数据,如视频、音频或字幕。一个MP4文件可以包含多个track