FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和 HLS(HTTP Live Streaming)等自适应流媒体协议。FMP4 的主要特点是将视频和音频数据拆分成片段(Fragment),以更灵活的方式进行传输和存储。
FMP4 与普通 MP4 的区别
普通 MP4 采用"单一 MOOF + MDAT"结构,文件内通常包含完整的媒体元数据(moov)和媒体数据(mdat),适用于本地播放。
而 FMP4 采用"多个 MOOF + MDAT 片段"结构,适用于流式传输,能减少初始加载时间,支持动态码率切换。
特性 | 普通 MP4 | FMP4 |
---|---|---|
存储方式 | 完整文件 | 分片存储 |
适用场景 | 本地存储、下载 | 直播、点播、流媒体传输 |
结构 | 单一 moov |
多个 moof 片段 |
码率自适应 | 不支持 | 支持 |
点播跳转 | 整个文件解析 | 直接访问片段 |
FMP4 结构
FMP4 由文件级、初始化段(Init Segment)和媒体片段(Media Fragment)组成。
文件级
整个 FMP4 文件仍然遵循 ISO BMFF(Base Media File Format)格式,基础结构包括:
- ftyp:文件类型(File Type Box)
- moov:元数据(Movie Box)
- 多个片段(Fragments) :由
moof
(Movie Fragment)和mdat
(Media Data)组成的多个片段。
初始化段(Init Segment)
初始化段包含:
ftyp
:声明文件类型。moov
:存储编解码信息、轨道信息(TrackBox)、采样表(Sample Table)等,不含实际音视频数据。
作用:初始化播放器,告知解码器如何解码后续的片段。
片段(Media Fragment)
每个片段都包含:
moof
(Movie Fragment Box):表示一个新的片段,包含元数据,如时间戳、帧信息。mdat
(Media Data Box):存储实际的音视频数据。
多个 moof + mdat
片段可以连续存储或按需加载,使其适用于直播和点播流媒体。
FMP4 关键 Box 解析
ftyp(文件类型 Box)
reStructuredText
ftyp
├── major_brand(主品牌,如 isom)
├── minor_version(次版本)
├── compatible_brands(兼容品牌)
示例:
hex
00000018 66747970 69736F6D 00000200 69736F6D 61766331
这里 isom
代表 MP4 文件格式,avc1
代表 H.264 兼容。
moov(Movie Box)
-
存储文件全局信息,包括轨道信息、时长、编解码信息等。
-
主要包含
mvhd
、trak
、udta
等 Box。
reStructuredText
moov
├── mvhd(Movie Header Box)
├── trak(Track Box,存储音视频轨道)
│ ├── tkhd(Track Header Box,轨道信息)
│ ├── mdia(Media Box,媒体信息)
│ ├── mdhd(Media Header Box,媒体头)
│ ├── hdlr(Handler Box,解码器类型)
│ ├── minf(Media Information Box,采样、压缩信息)
│ ├── stbl(Sample Table Box)
├── mvex(Movie Extends Box,用于分片)
作用 :播放器解析 moov
后,可知道如何解码音视频数据。
moof(Movie Fragment Box)
-
moof
是 FMP4 的核心,它表示一个新的片段,包含时间戳、采样信息。 -
moof
结构:
reStructuredText
moof
├── mfhd(Movie Fragment Header Box,片段序号)
├── traf(Track Fragment Box,轨道片段信息)
├── tfhd(Track Fragment Header Box,轨道 ID)
├── tfdt(Track Fragment Decode Time Box,时间戳)
├── trun(Track Fragment Run Box,存储帧偏移量、大小等)
作用 :播放器加载 moof
后,知道这个片段的起始时间、轨道 ID,以及解码顺序。
- moof 解析示例
mfhd 00000001
→ 片段序号 1tfhd 00000001
→ 轨道 ID 1tfdt 00000001
→ 时间戳起点 1
hex
0000006C 6D6F6F66 00000010 6D666864 00000001
00000058 74726166 00000014 74666864 00000001
00000010 74666474 00000001 00000000
mdat(Media Data Box)
mdat
包含真正的音视频数据帧,按moof
指定的时间顺序排列。
reStructuredText
mdat(Media Data)
- 示例:
hex
0000017C 6D646174 ... (H.264/HEVC 视频帧数据)
作用 :播放器解码 mdat
并播放视频。
解析示例
mp4

fmp4

FMP4 在流媒体中的应用
在 HLS 中
- 传统 HLS 使用
.ts
作为分片格式,但ts
容量大,时延较高。 - Apple 推出了 CMAF(Common Media Application Format) ,支持
fMP4
作为 HLS 的片段格式,提高兼容性和性能。
示例:HLS playlist(m3u8)
m3u8
#EXTM3U
#EXT-X-VERSION:7
#EXT-X-MAP:URI="init.mp4"
#EXTINF:6.000,
segment1.m4s
#EXTINF:6.000,
segment2.m4s
init.mp4
是初始化段,segment1.m4s
是 FMP4 片段。
在 DASH 中
DASH 直接支持 fMP4
作为流格式,每个片段可独立请求。
示例:DASH MPD(Media Presentation Description)
xml
<MPD>
<Period>
<AdaptationSet>
<Representation mimeType="video/mp4">
<SegmentTemplate media="segment$Number$.m4s" initialization="init.mp4" />
</Representation>
</AdaptationSet>
</Period>
</MPD>
总结
- FMP4 适用于流媒体传输,支持按片段加载,提高播放灵活性。
- 主要由
moov
(初始化)和moof + mdat
(片段)组成。 - 广泛应用于 HLS(CMAF)和 DASH,降低延迟,提高兼容性。