MP4 边下边播:Fast Start、Range 与 fragmented MP4
moov / mdat、Progressive Download、fMP4、MSE 与分段流
解释一个 MP4 具备什么布局和服务条件才能尽早起播、支持 Seek,以及普通渐进下载与 fMP4 分段流的区别。
先明确本课目标
解释 moov 在文件头与文件尾的起播差异
理解 HTTP Range 对定位和 Seek 的作用
区分 Fast Start MP4 与 fragmented MP4
播放器要先拿到“目录”才能解释后面的压缩样本:普通 MP4 的目录是 moov,fMP4 则先给初始化目录,再为每个片段附一张局部清单。
为什么把 moov 移到文件头就能更快起播?
moov 包含解码所需轨道配置、Sample 大小、时间戳、文件偏移和关键帧索引。播放器先解析它,才能从 mdat 找到第一批可解码 Sample。
javascriptconst fastStart = ['ftyp', 'moov', 'mdat'];
const slowStart = ['ftyp', 'mdat', 'moov'];
const fragmented = [
'ftyp', 'moov',
'moof', 'mdat',
'moof', 'mdat',
];- 读取 ftyp 识别格式 文件类型 Box 告诉解析器兼容品牌,但不包含完整 Sample 索引。
- 提前解析 moov 轨道、Codec 配置和 Sample 表可用后,播放器能定位 mdat 中的数据。
- 按索引边取边解码 后续字节只要覆盖当前需要的 Sample,就可进入 Packet 与 Decoder 队列。
Fast Start MP4 可在未下载完整文件时启动;fMP4 则通过 moof 为每个片段持续提供局部 Sample 元数据。
OPTIONAL · 按需查阅完整术语表与概念边界遇到陌生术语时再展开,不打断主线实验。
展开⌄
边改边运行
浏览器加载后会激活代码编辑器、独立运行环境与实时输出。
为点播文件、DASH 点播和低延迟直播分别选择 MP4 布局与分片时长,并说明原因。
回到原理,解释刚才发生了什么
先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。
核心讲解
普通 MP4:先有 moov 才能读懂 mdat
moov 保存 Track、Time Base、Codec 配置和 Sample 表。若它在 mdat 前,播放器拿到文件开头即可规划解码;若在文件尾,则需先下载到尾部,或通过 HTTP Range 单独请求尾部。
fMP4:初始化一次,片段逐个追加
fragmented MP4 先发送含 ftyp+moov 的 Initialization Segment,之后每个 moof 描述紧随其后的 mdat Sample。MSE、DASH 和部分 HLS 工作流可按片段持续追加,适合自适应码率与直播。
OPTIONAL · 迁移时查阅Web 与原生实现对照主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。
展开⌄
Web 与原生都需要先取得 MP4 索引;Web 更常通过 Range/MSE,原生可直接控制 AVIO 与 Demuxer。
WebGL
libavformat 可在可 Seek 输入上跳到 moov,也可持续解析 fragmented MP4 的 moof/mdat。
WebGPU
video 元素可渐进读取 Fast Start MP4;MSE 应用追加 init segment 与后续 fMP4 media segments。
判断“能否边下边播”要同时看文件布局、服务器 Range/缓存头、播放器 Demux 能力三层。