文章目录
- 一、Box 基础结构(核心单元)
- 1. 普通 Box 头
- 2. Full Box(Box 的扩展)
- 二、根级核心 Box(必选/关键)
- 1. ftyp(File Type Box,必选)
- 2. moov(Movie Box,必选,容器 Box)
- 3. mdat(Media Data Box,可选,可多个)
- 4. 其他常见根 Box
- 三、关键设计细节与机制
- 1. 容器 Box vs 叶子 Box
- 2. 时间尺度与时间戳映射
- 3. 快速启动(Fast Start)
- 4. 64 位扩展
- 四、典型文件结构示例
- 五、常见问题与解析要点
- 六、实用工具与命令
MP4(ISO/IEC 14496‑14)基于 ISO 基础媒体文件格式(ISOBMFF,ISO/IEC 14496‑12),整体由Box(或 Atom)嵌套构成,所有数据均封装在 Box 内,无游离数据。
一、Box 基础结构(核心单元)
每个 Box 遵循统一头格式,字节序为大端(Big‑Endian),分为普通 Box 与 Full Box(带版本/标志扩展)。
1. 普通 Box 头
| 字段 | 字节数 | 说明 |
|---|---|---|
| size | 4 | 整个 Box 总字节数(含头);size=1 时用 8 字节largesize;size=0 表示文件末尾 |
| type | 4 | 4 字符标识(如ftyp、moov) |
| [largesize] | 8 | 可选,size=1 时启用,64 位总长度 |
| body | 可变 | 数据区,可嵌套子 Box(容器 Box)或存储原始数据(叶子 Box) |
2. Full Box(Box 的扩展)
在普通 Box 头后增加:
version(1 字节):格式版本flags(3 字节):功能标志位
常见于mvhd、tkhd等核心元数据 Box。
二、根级核心 Box(必选/关键)
根层级 Box 按功能分为三类,必须以ftyp开头,其余顺序可灵活调整(但moov前置可实现“快速启动”)。
1. ftyp(File Type Box,必选)
- 作用:标识文件类型与兼容性,是 MP4 的“身份证”
- 结构:
size(4)+type(4, 'ftyp')+major_brand(4)+minor_version(4)+compatible_brands(n*4) - 示例:
major_brand=mp42表示兼容 MPEG‑4 Part 14;compatible_brands列出支持的品牌(如isom、avc1)。
2. moov(Movie Box,必选,容器 Box)
- 作用:存储媒体元数据(时长、轨道、编码、时间戳映射等),是 MP4 的“索引目录”
- 典型子 Box 结构:
moov ├─ mvhd(Movie Header Box,必选):全局媒体信息(创建时间、时长、时间尺度) ├─ trak(Track Box,至少 1 个):单个轨道(视频/音频/字幕) │ ├─ tkhd(Track Header Box):轨道头(ID、时长、分辨率、音量) │ ├─ mdia(Media Box):媒体信息容器 │ │ ├─ mdhd(Media Header Box):媒体时间尺度、时长 │ │ ├─ hdlr(Handler Reference Box):轨道类型(video/audio) │ │ └─ minf(Media Information Box):媒体编码与采样信息 │ │ ├─ vmhd/smhd(Video/Audio Media Header):音视频专属头 │ │ ├─ dinf(Data Information Box):数据存储位置 │ │ └─ stbl(Sample Table Box,核心):采样表(帧索引) │ │ ├─ stsd(Sample Description):编码参数(如 H.264 SPS/PPS、AAC 配置) │ │ ├─ stts(Time‑to‑Sample):时间戳→采样映射 │ │ ├─ stsc(Sample‑to‑Chunk):采样→数据块映射 │ │ ├─ stsz(Sample Sizes):每个采样的字节数 │ │ └─ stco/co64(Chunk Offsets):数据块在文件中的偏移量 └─ udta(User Data Box,可选):自定义元数据(标题、作者、封面) - 关键:
stbl子 Box 决定如何从mdat中定位并解码每一帧数据。
3. mdat(Media Data Box,可选,可多个)
- 作用:存储原始媒体数据(视频帧、音频帧),是 MP4 的“数据仓库”
- 结构:
size+type('mdat')+媒体字节流 - 特点:
- 数据无结构,完全由
moov中的stbl描述 - 可通过
stco/co64定位到帧的偏移量与长度 - 支持“外部引用”(无
mdat,数据来自其他文件)。
- 数据无结构,完全由
4. 其他常见根 Box
free/skip:填充/预留空间,不影响播放meta:扩展元数据(如章节、封面)。
三、关键设计细节与机制
1. 容器 Box vs 叶子 Box
- 容器 Box:可嵌套子 Box(如
moov、trak、mdia),负责组织元数据结构 - 叶子 Box:直接存储数据(如
mdat、mvhd),无嵌套。
2. 时间尺度与时间戳映射
mvhd/mdhd中的timescale定义“1 秒包含的时间单位数”(如timescale=90000对应 90kHz)stts将采样时间戳(单位:timescale)映射为实际播放时间- 示例:
timescale=90000,采样时间戳180000→ 播放时间2秒。
3. 快速启动(Fast Start)
- 默认
moov在mdat之后,播放器需读取到文件末尾才能开始播放 - 将
moov移到mdat之前(如用ffmpeg -movflags faststart),播放器可立即解析元数据并启动播放,适合网络分发。
4. 64 位扩展
- 当 Box 长度超过 4GB 时,
size=1并启用largesize(8 字节) co64替代stco存储 64 位偏移量,支持超大文件。
四、典型文件结构示例
[ftyp] → [moov] → [mdat] 或 [ftyp] → [free] → [mdat] → [moov]ftyp:固定开头,标识格式moov:元数据,决定播放逻辑mdat:音视频帧,占文件体积 90%+。
五、常见问题与解析要点
- 文件损坏:
moov丢失或stbl错误会导致无法播放,需修复索引 - 多音轨/字幕:通过多个
trak实现,每个trak对应独立的stbl - H.264/HEVC 编码适配:
stsd中存储avcC/hvcC结构,包含 SPS/PPS/VPS 等编码参数。
六、实用工具与命令
- 查看 Box 结构:
mp4box -info input.mp4或ffprobe -show_streams -show_format input.mp4 - 快速启动优化:
ffmpeg -i input.mp4 -c copy -movflags faststart output.mp4 - 提取 Box:
dd if=input.mp4 of=moov.box skip=$offset count=$size(需先解析moov偏移与长度)。