MP4 (MPEG-4 Part 14) 是目前跨平台相容性最佳的多媒體容器格式,廣泛應用於桌面瀏覽器、行動裝置、智慧電視與串流媒體服務。本文依據 ISO/IEC 14496-12 (ISO Base Media File Format) 與 14496-14 標準,系統剖析 MP4 的核心結構單元——Box。
Header 與 Data 兩部分。Size (4 bytes):整個 Box 大小(含 Header)。Size=0 表示該 Box 為檔案最後一個 Box,實際大小延伸至檔案結尾;Size=1 表示使用 8 位元組的 LargeSize (64-bit) 描述超大 Box。Type (4 bytes):四字元代碼 (FourCC) 識別 Box 類型,如 ftyp、moov、mdat、trak 等。若為 uuid 則表示使用者自訂擴展 Box,後續 16 bytes 為 UUID。Version (1 byte) 與 Flags (3 bytes),用於版本演進與功能開關。moov、trak、mdia),形成樹狀結構。MP4 File
├── ftyp (File Type Box) ✓ 必要
├── moov (Movie Box) ✓ 必要
│ ├── mvhd (Movie Header) ✓
│ ├── trak (Track Box) ✓ (每軌一個)
│ │ ├── tkhd (Track Header) ✓
│ │ ├── mdia (Media Box) ✓
│ │ │ ├── mdhd (Media Header)✓
│ │ │ ├── hdlr (Handler Ref) ✓
│ │ │ ├── minf (Media Info) ✓
│ │ │ │ ├── vmhd/smhd/hmhd ✓ (視訊/音訊/提示軌)
│ │ │ │ ├── dinf (Data Info)✓
│ │ │ │ │ └── dref (Data Ref)✓
│ │ │ │ └── stbl (Sample Table)✓
│ │ │ │ ├── stsd (Sample Description)✓
│ │ │ │ ├── stts (Time-to-Sample)✓
│ │ │ │ ├── stsc (Sample-to-Chunk)✓
│ │ │ │ ├── stsz (Sample Size)✓
│ │ │ │ ├── stco/stco64 (Chunk Offset)✓
│ │ │ │ ├── stss (Sync Sample)
│ │ │ │ ├── ctts (Composition Time)
│ │ │ │ └── ... (其他可選)
│ │ └── ... (udta, edts 等)
│ └── ... (iods, meta 等)
└── mdat (Media Data Box) ✓ 必要
└── 實際音視訊樣本資料 (interleaved)
標記 ✓ 者為標準強制要求的必要 Box,其餘視編碼格式、功能需求決定是否存在。
| Box | 全名 | 核心作用 |
|---|---|---|
ftyp | File Type Box | 標識檔案品牌、次要相容品牌、最低相容版本(如 isom、mp42、avc1) |
moov | Movie Box | 全檔案元資料容器,含所有軌道資訊、時間刻度、持續時間 |
mvhd | Movie Header | 建立/修改時間、時標單位 (timescale)、總時長、下一個可用 track_ID |
trak | Track Box | 單一媒體軌道容器(一條視訊、一條音訊、一條字幕各佔一個 trak) |
tkhd | Track Header | 軌道 ID、時長、層級、音量、轉換矩陣、寬高 |
mdia | Media Box | 媒體資訊容器:格式、時標、採樣表 |
stbl | Sample Table | 核心索引結構,映射「時間 → 採樣位置/大小/類型」 |
stsd | Sample Description | 編碼參數:視訊 (avc1/hev1/vp09) 含 avcC/hvcC;音訊 (mp4a) 含 esds |
stts | Decoding Time-to-Sample | 解碼時間增量表,支援變幀率 |
ctts | Composition Time-to-Sample | 顯示時間偏移 (CTS = DTS + offset),B 幀必備 |
stsc | Sample-to-Chunk | 採樣點→Chunk 映射,Chunk 為儲存分配單位 |
stsz | Sample Size | 每個採樣位元組數(定長時僅存第一個值) |
stco/co64 | Chunk Offset | Chunk 在檔案中的絕對位移 (32/64-bit) |
stss | Sync Sample | 關鍵幀 (IDR) 採樣編號列表,支援快速求索 |
mdat | Media Data | 實際編碼資料,依 interleaving 策略交織儲存 |
mvhd.timescale 通常設 1000 (ms) 或 90000 (MPEG 時鐘);各軌 mdhd.timescale 依媒體特性設定(視訊 90k、音訊 44.1k/48k)。stbl 設計決定 seek 效能。常見模式:1 秒 1 chunk 或 1 GOP 1 chunk。moof+mdat 片段取代單一巨大 moov,支援低延遲分段下載。ffprobe -show_boxes input.mp4、MP4Box -info input.mp4、gpac/mp4parser 程式庫解析。stss (關鍵幀表) 或 stco 偏移錯誤。ctts 計算錯誤、stts 累積誤差、編碼器未輸出正確 PTS。moov 位於檔案末尾且未完整寫入(錄製中斷),需用 untrunc 或 ffmpeg -c copy 修復。MP4 以 Box 樹狀結構實現高度擴展性與隨機存取能力。深入理解 stbl 索引機制與 mdat 交織策略,是開發高效能封裝器、修復損壞檔案、優化串流傳輸的關鍵基石。