天天看點

MP3檔案頭格式

MP3檔案結構及編解碼流程

http://blog.sina.com.cn/s/blog_67b7cb7b01018i2l.html

http://blog.csdn.net/liuyan4794/article/details/7746993

MPEG音頻标簽分為兩種,一種是ID3v1,存在檔案尾部,長度128位元組,另一種是ID3v2,是對ID3v1的擴充,存在檔案頭部,長度不定。

1、ID3v1

ID3v1标簽用來描述MPEG音頻檔案。包含藝術家,标題,唱片集,釋出年代和流派。另外還有額外的注釋空間。位于音頻檔案的最後固定為128位元組。可以讀取該檔案的最後這128位元組獲得标簽。

結構如下

AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB

BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD

DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE

EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG

符号 長度 (bytes) 位置 (bytes) 描述
A 3 (0-2) 标簽标志。如果存在标簽并且正确的話,必須包含\'TAG\'。
B 30 (3-32) 标題
C 30 (33-62) 藝術家
D 30 (63-92) 唱片集
E 4 (93-96) 年代
F 30 (97-126) 注釋
G 1 (127) 流派

該規格要求所有的空間必須以空字元(ASCII 0)填充。但是并不是所有的應用程式遵循該規則,比如winamp就用空格(ASCII 32)代替之。

在ID3v1.1結構中有些改變。注釋部分的最後一個位元組用來定義唱片集中的軌道号。如果不知道該資訊時可以用空字元(ASCII 0)代替。

流派使用原碼表示,為下列數字之一:

\'Blues\' 20 \'Alternative\' 40 \'AlternRock\' 60 \'Top 40\'
1 \'Classic Rock\' 21 \'Ska\' 41 \'Bass\' 61 \'Christian Rap\'
2 \'Country\' 22 \'Death Metal\' 42 \'Soul\' 62 \'Pop/Funk\'
3 \'Dance\' 23 \'Pranks\' 43 \'Punk\' 63 \'Jungle\'
4 \'Disco\' 24 \'Soundtrack\' 44 \'Space\' 64 \'Native American\'
5 \'Funk\' 25 \'Euro-Techno\' 45 \'Meditative\' 65 \'Cabaret\'
6 \'Grunge\' 26 \'Ambient\' 46 \'Instrumental Pop\' 66 \'New Wave\'
7 \'Hip-Hop\' 27 \'Trip-Hop\' 47 \'Instrumental Rock\' 67 \'Psychadelic\'
8 \'Jazz\' 28 \'Vocal\' 48 \'Ethnic\' 68 \'Rave\'
9 \'Metal\' 29 \'Jazz+Funk\' 49 \'Gothic\' 69 \'Showtunes\'
10 \'New Age\' 30 \'Fusion\' 50 \'Darkwave\' 70 \'Trailer\'
11 \'Oldies\' 31 \'Trance\' 51 \'Techno-Industrial\' 71 \'Lo-Fi\'
12 \'Other\' 32 \'Classical\' 52 \'Electronic\' 72 \'Tribal\'
13 \'Pop\' 33 \'Instrumental\' 53 \'Pop-Folk\' 73 \'Acid Punk\'
14 \'R&B\' 34 \'Acid\' 54 \'Eurodance\' 74 \'Acid Jazz\'
15 \'Rap\' 35 \'House\' 55 \'Dream\' 75 \'Polka\'
16 \'Reggae\' 36 \'Game\' 56 \'Southern Rock\' 76 \'Retro\'
17 \'Rock\' 37 \'Sound Clip\' 57 \'Comedy\' 77 \'Musical\'
18 \'Techno\' 38 \'Gospel\' 58 \'Cult\' 78 \'Rock & Roll\'
19 \'Industrial\' 39 \'Noise\' 59 \'Gangsta\' 79 \'Hard Rock\'

Winamp擴充了這個表

80 \'Folk\' 92 \'Progressive Rock\' 104 \'Chamber Music\' 116 \'Ballad\'
81 \'Folk-Rock\' 93 \'Psychedelic Rock\' 105 \'Sonata\' 117 \'Poweer Ballad\'
82 \'National Folk\' 94 \'Symphonic Rock\' 106 \'Symphony\' 118 \'Rhytmic Soul\'
83 \'Swing\' 95 \'Slow Rock\' 107 \'Booty Brass\' 119 \'Freestyle\'
84 \'Fast Fusion\' 96 \'Big Band\' 108 \'Primus\' 120 \'Duet\'
85 \'Bebob\' 97 \'Chorus\' 109 \'Porn Groove\' 121 \'Punk Rock\'
86 \'Latin\' 98 \'Easy Listening\' 110 \'Satire\' 122 \'Drum Solo\'
87 \'Revival\' 99 \'Acoustic\' 111 \'Slow Jam\' 123 \'A Capela\'
88 \'Celtic\' 100 \'Humour\' 112 \'Club\' 124 \'Euro-House\'
89 \'Bluegrass\' 101 \'Speech\' 113 \'Tango\' 125 \'Dance Hall\'
90 \'Avantgarde\' 102 \'Chanson\' 114 \'Samba\'
91 \'Gothic Rock\' 103 \'Opera\' 115 \'Folklore\'

其他擴充

126 \'Goa\' 132 \'BritPop\' 138 \'BlackMetal\' 144 \'TrashMetal\'
127 \'Drum&Bass\' 133 \'Negerpunk\' 139 \'Crossover\' 145 \'Anime\'
128 \'Club-House\' 134 \'PolskPunk\' 140 \'ContemporaryChristian\' 146 \'JPop\'
129 \'Hardcore\' 135 \'Beat\' 141 \'ChristianRock\' 147 \'Synthpop\'
130 \'Terror\' 136 \'ChristianGangstaRap\' 142 \'Merengue\'
131 \'Indie\' 137 \'HeavyMetal\' 143 \'Salsa\'

其他任何的數值都認為是“unknown”

2、ID3V2

ID3V2 到現在一共有4 個版本,但流行的播放軟體一般隻支援第3 版,既ID3v2.3。由于ID3V1 記錄在MP3 檔案的末尾,ID3V2

就隻好記錄在MP3 檔案的首部了(如果有一天釋出ID3V3,真不知道該記錄在哪裡)。也正是由于這個原因,對ID3V2 的操作比ID3V1

要慢。而且ID3V2 結構比ID3V1 的結構要複雜得多,但比前者全面且可以伸縮和擴充。

下面就介紹一下ID3V2.3。

每個ID3V2.3 的标簽都一個标簽頭和若幹個标簽幀或一個擴充标簽頭組成。關于曲目的資訊如标題、作者等都存放在不同的标簽幀中,擴充标簽頭和标簽幀并不是必要的,但每個标簽至少要有一個标簽幀。标簽頭和标簽幀一起順序存放在MP3 檔案的首部。

(一)、标簽頭

在檔案的首部順序記錄10 個位元組的ID3V2.3 的頭部。資料結構如下:

char Header[3]; /*必須為"ID3"否則認為标簽不存在*/

char Ver; /*版本号ID3V2.3 就記錄3*/

char Revision; /*副版本号此版本記錄為0*/

char Flag; /*存放标志的位元組,這個版本隻定義了三位,稍後詳細解說*/

char Size[4]; /*标簽大小,包括标簽頭的10 個位元組和所有的标簽幀的大小*/

注:對這裡我有疑惑,因為在實際尋找首幀的過程中,我發現有的mp3檔案的标簽大小是不包含标簽頭的,但有的又是包含的,可能是某些mp3編碼器寫标簽的BUG,是以為了相容隻好認為其是包含的,如果按大小找不到,再向後搜尋,直到找到首幀為止。

(1).标志位元組

标志位元組一般為0,定義如下:

abc00000

a -- 表示是否使用Unsynchronisation(這個單詞不知道是什麼意思,字典裡也沒有找到,一般不設定)

b -- 表示是否有擴充頭部,一般沒有(至少Winamp 沒有記錄),是以一般也不設定

c -- 表示是否為測試标簽(99.99%的标簽都不是測試用的啦,是以一般也不設定)

(2).标簽大小

一共四個位元組,但每個位元組隻用7 位,最高位不使用恒為0。是以格式如下

0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

計算大小時要将0 去掉,得到一個28 位的二進制數,就是标簽大小(不懂為什麼要這樣做),計算公式如

下:

int total_size;

total_size = (Size[0]&0x7F)*0x200000

+(Size[1]&0x7F)*0x4000

+(Size[2]&0x7F)*0x80

+(Size[3]&0x7F)

len = (hdr[0] << 21) | (hdr[1] << 14) | (hdr[2] << 7) | hdr[3];

(二)、标簽幀

每個标簽幀都有一個10 個位元組的幀頭和至少一個位元組的不固定長度的内容組成。它們也是順序存放在檔案

中,和标簽頭和其他的标簽幀也沒有特殊的字元分隔。得到一個完整的幀的内容隻有從幀頭中的到内容大

小後才能讀出,讀取時要注意大小,不要将其他幀的内容或幀頭讀入。

幀頭的定義如下:

char FrameID[4]; /*用四個字元辨別一個幀,說明其内容,稍後有常用的辨別對照表*/

char Size[4]; /*幀内容的大小,不包括幀頭,不得小于1*/

char Flags[2]; /*存放标志,隻定義了6 位,稍後詳細解說*/

(1).幀辨別

用四個字元辨別一個幀,說明一個幀的内容含義,常用的對照如下:

TIT2=标題 表示内容為這首歌的标題,下同

TPE1=作者

TALB=專集

TRCK=音軌 格式:N/M 其中N 為專集中的第N 首,M 為專集中共M 首,N 和M 為ASCII 碼表示的數字

TYER=年代 是用ASCII 碼表示的數字

TCON=類型 直接用字元串表示

COMM=備注 格式:"eng/0 備注内容",其中eng 表示備注所使用的自然語言

(2).大小

這個可沒有标簽頭的算法那麼麻煩,每個位元組的8 位全用,格式如下

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

算法如下:

int FSize;

FSize = Size[0]*0x100000000

+Size[1]*0x10000

+Size[2]*0x100

+Size[3];

(3).标志

隻定義了6 位,另外的10 位為0,但大部分的情況下16 位都為0 就可以了。格式如下:

abc00000 ijk00000

a -- 标簽保護标志,設定時認為此幀廢棄

b -- 檔案保護标志,設定時認為此幀廢棄

c -- 隻讀标志,設定時認為此幀不能修改(但我沒有找到一個軟體理會這個标志)

i -- 壓縮标志,設定時一個位元組存放兩個BCD 碼表示數字

j -- 加密标志(沒有見過哪個MP3 檔案的标簽用了加密)

k -- 組标志,設定時說明此幀和其他的某幀是一組

值得一提的是winamp 在儲存和讀取幀内容的時候會在内容前面加個\'/0\',并把這個位元組計算在幀内容的

大小中。

附:幀辨別的含義

(4). Declared ID3v2 frames

The following frames are declared in this draft.

AENC Audio encryption

APIC Attached picture

COMM Comments

COMR Commercial frame

ENCR Encryption method registration

EQUA Equalization

ETCO Event timing codes

GEOB General encapsulated object

GRID Group identification registration

IPLS Involved people list

LINK Linked information

MCDI Music CD identifier

MLLT MPEG location lookup table

OWNE Ownership frame

PRIV Private frame

PCNT Play counter

POPM Popularimeter

POSS Position synchronisation frame

RBUF Recommended buffer size

RVAD Relative volume adjustment

RVRB Reverb

SYLT Synchronized lyric/text

SYTC Synchronized tempo codes

TALB Album/Movie/Show title

TBPM BPM (beats per minute)

TCOM Composer

TCON Content type

TCOP Copyright message

TDAT Date

TDLY Playlist delay

TENC Encoded by

TEXT Lyricist/Text writer

TFLT File type

TIME Time

TIT1 Content group description

TIT2 Title/songname/content description

TIT3 Subtitle/Description refinement

TKEY Initial key

TLAN Language(s)

TLEN Length

TMED Media type

TOAL Original album/movie/show title

TOFN Original filename

TOLY Original lyricist(s)/text writer(s)

TOPE Original artist(s)/performer(s)

TORY Original release year

TOWN File owner/licensee

TPE1 Lead performer(s)/Soloist(s)

TPE2 Band/orchestra/accompaniment

TPE3 Conductor/performer refinement

TPE4 Interpreted, remixed, or otherwise modified by

TPOS Part of a set

TPUB Publisher

TRCK Track number/Position in set

TRDA Recording dates

TRSN Internet radio station name

TRSO Internet radio station owner

TSIZ Size

TSRC ISRC (international standard recording code)

TSSE Software/Hardware and settings used for encoding

TYER Year

TXXX User defined text information frame

UFID Unique file identifier

USER Terms of use

USLT Unsychronized lyric/text transcription

WCOM Commercial information

WCOP Copyright/Legal information

WOAF Official audio file webpage

WOAR Official artist/performer webpage

WOAS Official audio source webpage

WORS Official internet radio station homepage

WPAY Payment

WPUB Publishers official webpage

WXXX User defined URL link frame

注:讀取參考執行個體

--------------------->ID3v2<---------------------

TPE1    ��?��`

TALB    ��j�b�SAmjm

TIT2    ��j�b�SAmjm

TYER    ��2013-04-10

APIC    image/jpeg

TXXX    ��Tagging time��2013-04-11T03:34:56

--------------------->ID3v2<---------------------

[root@gx6602 music]# busybox hexdump -n 256 -C withme.mp3

00000000  49 44 33 03 00 00 00 02  15 60 54 50 45 31 00 00  |ID3......`TPE1..|

00000010  00 07 00 00 01 ff fe 3f  96 84 60 54 41 4c 42 00  |.......?..`TALB.|

00000020  00 00 0d 00 00 01 ff fe  6a 96 11 62 bb 53 41 6d  |........j..b.SAm|

00000030  6a 6d 54 49 54 32 00 00  00 0d 00 00 01 ff fe 6a  |jmTIT2.........j|

00000040  96 11 62 bb 53 41 6d 6a  6d 54 59 45 52 00 00 00  |..b.SAmjmTYER...|

00000050  17 00 00 01 ff fe 32 00  30 00 31 00 33 00 2d 00  |......2.0.1.3.-.|

00000060  30 00 34 00 2d 00 31 00  30 00 41 50 49 43 00 00  |0.4.-.1.0.APIC..|

00000070  86 27 00 00 01 69 6d 61  67 65 2f 6a 70 65 67 00  |.\'...image/jpeg.|

00000080  03 ff fe 65 00 00 00 ff  d8 ff e0 00 10 4a 46 49  |...e.........JFI|

00000090  46 00 01 01 00 00 01 00  01 00 00 ff fe 00 3c 43  |F.............<C|

000000a0  52 45 41 54 4f 52 3a 20  67 64 2d 6a 70 65 67 20  |REATOR: gd-jpeg |

000000b0  76 31 2e 30 20 28 75 73  69 6e 67 20 49 4a 47 20  |v1.0 (using IJG |

000000c0  4a 50 45 47 20 76 36 32  29 2c 20 71 75 61 6c 69  |JPEG v62), quali|

000000d0  74 79 20 3d 20 31 30 30  0a ff db 00 43 00 01 01  |ty = 100....C...|

000000e0  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|