MP3 (MPEG-1 Audio Layer III) 作為最普及的有損音頻格式,其文件結構設計精妙地平衡了壓縮效率、流式傳輸適應性與元數據擴展性。本文系統梳理 MP3 文件的整體架構、幀級結構、ID3v1/v2 標籤規範,並深入對比 CBR 與 VBR 碼率控制機制,為音頻處理、播放器開發、元數據解析提供參考依據。
標準 MP3 文件由三大區塊順序組成:
[ID3v2 標籤 (可選, 位於文件頭)] [MPEG 音頻幀序列 (核心數據區)] [ID3v1 標籤 (可選, 固定 128 字節, 位於文件尾)]
每幀 = 幀頭 (4 字節) + CRC 校驗 (可選, 2 字節) + 主數據 (MAIN_DATA, 變長)
| 字段 | 位數 | 位置 | 含義 |
|---|---|---|---|
| Sync | 11 | 31-21 | 幀同步字,全 1 (0x7FF),解碼器尋幀關鍵 |
| MPEG Version | 2 | 20-19 | 00=MPEG 2.5, 01=保留, 10=MPEG 2, 11=MPEG 1 |
| Layer | 2 | 18-17 | 00=保留, 01=Layer III, 10=Layer II, 11=Layer I |
| Protection Bit | 1 | 16 | 0=有 CRC 校驗, 1=無校驗 |
| Bitrate Index | 4 | 15-12 | 碼率索引,查表得實際 kbps (見下表) |
| Sampling Rate | 2 | 11-10 | 采樣率索引:00=44.1k, 01=48k, 10=32k, 11=保留 |
| Padding Bit | 1 | 9 | 1=幀填充 1 槽,用於 CBR 平均碼率微調 |
| Private Bit | 1 | 8 | 私有位,用途未標準化 |
| Channel Mode | 2 | 7-6 | 00=立體聲, 01=聯合立體聲, 10=雙聲道, 11=單聲道 |
| Mode Extension | 2 | 5-4 | 聯合立體聲擴展:Intensity Stereo / MS Stereo 開關 |
| Copyright | 1 | 3 | 1=受版權保護 |
| Original | 1 | 2 | 1=原始媒體 |
| Emphasis | 2 | 1-0 | 去重點標識:00=無, 01=50/15ms, 10=保留, 11=CCITT J.17 |
| Index | MPEG1 L1 | MPEG1 L2 | MPEG1 L3 | MPEG2 L1 | MPEG2 L2/L3 |
|---|---|---|---|---|---|
| 0000 | free | free | free | free | free |
| 0001 | 32 | 32 | 32 | 32 | 8 |
| 0010 | 64 | 48 | 40 | 64 | 16 |
| 0011 | 96 | 56 | 48 | 96 | 24 |
| 0100 | 128 | 64 | 56 | 128 | 32 |
| 0101 | 160 | 80 | 64 | 160 | 40 |
| 0110 | 192 | 96 | 80 | 192 | 48 |
| 0111 | 224 | 112 | 96 | 224 | 56 |
| 1000 | 256 | 128 | 112 | 256 | 64 |
| 1001 | 288 | 160 | 128 | 288 | 80 |
| 1010 | 320 | 192 | 160 | 320 | 96 |
| 1011 | 352 | 224 | 192 | 352 | 112 |
| 1100 | 384 | 256 | 224 | 384 | 128 |
| 1101 | 416 | 320 | 256 | 416 | 144 |
| 1110 | 448 | 384 | 320 | 448 | 160 |
| 1111 | bad | bad | bad | bad | bad |
MPEG 1 Layer III:
FrameSize (bytes) = 144 * Bitrate(kbps) * 1000 / SampleRate(Hz) + PaddingBit
示例:128 kbps, 44.1 kHz, Padding=1 → 144 * 128000 / 44100 + 1 = 417 bytes
關鍵結論:每幀播放時長固定為 26 ms (1152 樣本 / 44100 Hz ≈ 0.026s),與碼率無關。
目標位置 = 幀索引 × 固定幀大小。VBR 文件首幀(不含音頻數據)攜帶 Xing 標識結構:
| 偏移 | 字段 | 長度 | 說明 |
|---|---|---|---|
| 0-3 | 標準幀頭 | 4B | 通常為 FF FB 30 4C,幀長 156B 滿足元數據空間 |
| 4-? | 填充至 "Xing" | 可變 | 位置取決於 MPEG 版本與聲道模式 |
| - | "Xing" 字符串 | 4B | 58 69 6E 67,VBR 文件核心標識 |
| - | Flags | 4B | 位標識:Frames(0x1), Bytes(0x2), TOC(0x4), VBR Scale(0x8) |
| - | Frames 總數 | 4B | 含首幀,用於時長計算 |
| - | 文件總字節數 | 4B | 精確文件大小 |
| - | TOC (Table of Contents) | 100B | 100 個字節索引,映射百分比位置→字節偏移 |
| - | VBR Scale | 4B | 質量刻度 (1-100),參考用 |
// 目標:跳轉到歌曲 25% 處 (如 240s 歌曲跳至 60s) targetPercent = 25; // 0-100 tocIndex = targetPercent; // 直接對應 TOC 數組索引 byteOffset ≈ (TOC[tocIndex] / 256.0) * fileTotalBytes;
精度:相鄰 TOC 項約對應 1% 時長,誤差在秒級,足夠 UI 拖拽定位。
Offset Length Field 0 3 "TAG" 識別頭 3 30 Title (標題) 33 30 Artist (藝術家) 63 30 Album (專輯) 93 4 Year (年份) 97 28 Comment (註釋) 125 1 Reserved (保留, 通常 0) 126 1 Track Number (軌道號, 擴展用) 127 1 Genre (流派索引, 0-147 標準/擴展表)
0x00 填充,無分隔符。| 字段 | 長度 | 說明 |
|---|---|---|
| Identifier | 3 | "ID3" |
| Version | 1 | 主版本號 (3= v2.3, 4= v2.4) |
| Revision | 1 | 次版本號 (通常 0) |
| Flags | 1 | bit7=Unsynchronisation, bit6=Extended Header, bit5=Experimental |
| Size | 4 | 同步安全整數 (28 位有效),標籤總大小含頭 |
Size 解碼:每字節最高位為 0,實際值 = (b0<<21)|(b1<<14)|(b2<<7)|b3。
每幀 = 幀頭 (10B) + 幀內容 (可變)
| 字段 | 長度 | 說明 |
|---|---|---|
| Frame ID | 4 | 四字符標識,如 TIT2(標題), TPE1(藝術家), APIC(封面) |
| Size | 4 | 內容大小 (不含頭),大端序 32 位整數 |
| Flags | 2 | bit15=Tag alter preservation, bit14=File alter preservation, bit13=Read only, bit12=Compression, bit11=Encryption, bit10=Grouping |
0x00 分隔)。TDRC (錄製日期) 替代 TYER/TDAT。Unsynchronisation、Data Length Indicator。0x03 (UTF-8) 或 0x01 (UTF-16 BOM) 需轉碼;ID3v1 強制 ISO-8859-1/GBK 兼容處理。RandomAccessFile 或 mmap 避免全量讀入;封面圖按需解碼縮放。MP3 文件結構展現了「簡單核心 + 靈活擴展」的經典設計哲學:MPEG 幀序列保證流式解碼的獨立性與隨機訪問能力;ID3v1 以極小開銷提供基礎兼容元數據;ID3v2 以可變長結構承載豐富多媒體元信息;CBR/VBR 雙模適配不同質量/體積/求索性能權衡需求。透徹理解這些機制,是構建高性能音頻播放器、編輯器、分析工具的基石。