【轉】MP3文件頭格式

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)代替。
流派使用原碼錶示,爲下列數字之一:

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)

(二)、標籤幀

每個標籤幀都有一個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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章