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)
ftyp├── major_brand(主品牌,如 isom)├── minor_version(次版本)├── compatible_brands(兼容品牌)
示例:
00000018 66747970 69736F6D 00000200 69736F6D 61766331
這里 isom
代表 MP4 文件格式,avc1
代表 H.264 兼容。
moov(Movie Box)
-
存儲文件全局信息,包括軌道信息、時長、編解碼信息等。
-
主要包含
mvhd
、trak
、udta
等 Box。
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
結構:
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
0000006C 6D6F6F66 00000010 6D666864 00000001
00000058 74726166 00000014 74666864 00000001
00000010 74666474 00000001 00000000
mdat(Media Data Box)
mdat
包含真正的音視頻數據幀,按moof
指定的時間順序排列。
mdat(Media Data)
- 示例:
0000017C 6D646174 ... (H.264/HEVC 視頻幀數據)
作用:播放器解碼 mdat
并播放視頻。
解析示例
mp4
fmp4
FMP4 在流媒體中的應用
在 HLS 中
- 傳統 HLS 使用
.ts
作為分片格式,但ts
容量大,時延較高。 - Apple 推出了 CMAF(Common Media Application Format),支持
fMP4
作為 HLS 的片段格式,提高兼容性和性能。
示例:HLS playlist(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)
<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,降低延遲,提高兼容性。