MP3文件格式简介
1、概述
Moving Picture Experts Group Audio Layer III(MPEG-1 Audio Layer 3,动态图像专家压缩标准音频层面3),经常称为MP3,是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户的听觉感受来说,重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年,由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。
MP3是一个数据压缩格式。它舍弃脉冲编码调制(PCM)音频数据中,对人类听觉不重要的数据(类似于JPEG是一个有损图像压缩),从而达到了压缩成小得多的文件大小。MP3中使用了许多技术,其中包括心理声学,以确定音频的哪一部分可以丢弃。MP3音频可以按照不同的比特率进行压缩,提供了权衡数据大小和音质之间的依据。
MP3格式使用了混合的转换机制将时域信号转换成频域信号:
1)32波段多相积分滤波器(PQF)
2)36或者12 tap 改良离散余弦滤波器(MDCT);每个子波段大小可以在0...1和2...31之间独立选择
3)混叠衰减后处理
根据MPEG规范的说法,尽管有许多创造和推广其他格式的重要努力,MPEG-4标准中的AAC(Advanced Audio Coding)将是MP3格式的接棒者。然而,由于MP3的空前的流通,在目前来说,其他格式并未能威胁其地位。MP3不仅有广泛的用户端软体支持,也有很多的硬件支持,比如便携式数位音频播放器(泛指MP3播放器)、DVD和CD播放器。
因为MP3是一种有损压缩格式,它提供了多种不同“比特率”(bit rate)的选项—也就是用来表示每秒音频所需的编码数据位数。典型的速度介于128kbps和320kbps(kbit/s)之间。与此对照的是,CD上未经压缩的音频比特率是1411.2 kbps(16 位/采样点 × 44100 采样点/秒 × 2 通道)。
Fraunhofer Gesellschaft(FhG)在他们的官方网站上,公布了下面的MPEG-1 Layer 1/2/3的压缩率和数据速率用于比较:
1) Layer 1: 384 kbit/s,压缩率 4:1
2)Layer 2: 192 - 256 kbit/s,压缩率 8:1-6:1
3)Layer 3: 112 - 128 kbit/s,压缩率 12:1-10:1
不同层面之间的差别是因为它们使用了不同的心理声学模型导致的。
2、MP3文件结构
MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)
2.1 ID3V2
包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。
2.2 Frame
一系列的帧,个数由文件大小和帧长决定
每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定
每个FRAME又分为帧头和数据实体两部分
帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立
2.3 ID3V1
包含了作者,作曲,专辑等信息,长度为128BYTE。
3. MP3帧格式
3.1 帧头格式
帧头长4字节(若Protection bit为1,则还要帧头最后添加16bits的校验位),对于固定位率的MP3文件,所有帧的帧头格式一样其数据结构如下:
typedef FrameHeader {
unsigned int sync: 11; //同步信息
unsigned int version: 2; //版本
unsigned int layer: 2; //层
unsigned int error protection: 1; // CRC校验
unsigned int bitrate_index: 4; //位率
unsigned int sampling_frequency: 2; //采样频率
unsigned int padding: 1; //帧长调节
unsigned int private: 1; //保留字
unsigned int mode: 2; //声道模式
unsigned int mode extension: 2; //扩充模式
unsigned int copyright: 1; // 版权
unsigned int original: 1; //原版标志
unsigned int emphasis: 2; //强调模式
}HEADER, *LPHEADER;
MP3帧长取决于位率和频率,计算公式为:
. mpeg1.0 layer1 : 帧长= (48000*bitrate)/sampling_freq + padding
layer2&3: 帧长= (144000*bitrate)/sampling_freq + padding
. mpeg2.0 layer1 : 帧长= (24000*bitrate)/sampling_freq + padding
layer2&3 : 帧长= (72000*bitrate)/sampling_freq + padding
名称
|
位长
|
说 明
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
同步信息
|
11
|
第1、2字节
|
所有位均为1,第1字节恒为FF。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版本
|
2
|
00-MPEG 2.5 01-未定义 10-MPEG 2 11-MPEG 1
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
层
|
2
|
00-未定义 01-Layer 3 10-Layer 2 11-Layer 1
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CRC校验
|
1
|
0-校验 1-不校验
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
位率
|
4
|
第3字节
|
取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。
V1 - MPEG 1 V2 - MPEG 2 and MPEG 2.5
L1 - Layer 1 L2 - Layer 2 L3 - Layer 3 "free" 表示位率可变 "bad" 表示不允许值 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样频率
|
2
|
采样频率,对于MPEG-1: 00-44.1kHz 01-48kHz 10-32kHz 11-未定义
对于MPEG-2: 00-22.05kHz 01-24kHz 10-16kHz 11-未定义
对于MPEG-2.5: 00-11.025kHz 01-12kHz 10-8kHz 11-未定义
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
帧长调节
|
1
|
用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保留字
|
1
|
没有使用。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
声道模式
|
2
|
第4字节
|
表示声道, 00-立体声Stereo 01-Joint Stereo 10-双声道 11-单声道
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
扩充模式
|
2
|
当声道模式为01是才使用。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权
|
1
|
文件是否合法,0-不合法 1-合法
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
原版标志
|
1
|
是否原版, 0-非原版 1-原版
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
强调方式
|
2
|
用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。
00-未定义 01-50/15ms 10-保留 11-CCITT J.17
|
3.2 MAIN_DATA
MAIN_DATA 部分长度是否变化决定于 FRAMEHEADER 的 bitrate 是否变化,一首 MP3 歌曲,它有三个版本:96Kbps(96 千比特位每秒)、128Kbps 和 192Kbps。Kbps(比特位速率),表明了音乐每秒的数据量,Kbps 值越高,音质越好,文件也越大,MP3 标准规定,不变的 bitrate 的 MP3 文件称作 CBR,大多数 MP3文件都是 CBR 的,而变化的 bitrate 的 MP3 文件称作 VBR,每个 FRAME 的长度都可能是变化的。下面是 CBR和 VBR 的不同点:
1)CBR:固定位率的 FRAME 的大小是固定的(公式如上所述),只要知道文件总长度,和帧长即可由播放每帧需 26ms 计算得出 mp3 播放的总时间,也可通过计数帧的个数控制快进、快退慢放等操作。注:有些时候,并不是所有的帧都是等长的,有的帧可能多一个或几个字节。
2)VBR:VBR 是 XING 公司推出的算法,所以在 MP3 的 FRAME 里会有“XING"这个关键字,它存放在 MP3 文件中的第一个有效 FRAME 里,它标识了这个 MP3 文件是 VBR 的。同时第一个 FRAME 里存放了 MP3 文件的 FRAME 的总个数,这就很容易获得了播放总时间,同时还有 100 个字节存放了播放总时间的 100 个时间分段的 FRAME 的 INDEX,假设 4 分钟的 MP3 歌曲,240S,分成 100 段,每两个相邻 INDEX 的时间差就是 2.4S,所以通过这个 INDEX,只要前后处理少数的 FRAME,就能快速找出我们需要快进的 FRAME 头。
Position |
Length |
Meaning |
Example |
0 |
4 |
VBR header ID in 4 ASCII chars, either 'Xing' or 'Info', not NULL-terminated |
“Xing” |
4 |
4 |
Flags which indicate what fields are present, flags are combined with a logical OR. Field is mandatory. 0x00000001 - Frames field is present |
0x0007 |
8 |
4 |
Number of Frames as Big-Endian DWORD (optional) |
7344 |
8 or 12 |
4 |
Number of Bytes in file as Big-Endian DWORD (optional) |
45000 |
8, 12 or 16 |
100 |
100 TOC entries for seeking as integral BYTE (optional) |
|
8, 12, 16, 108, 112 or 116 |
4 |
Quality indicator as Big-Endian DWORD |
0 |
4、ID3标准
MP3帧头中除了存储一些象private、copyright、original的简单音乐说明信息以外,没有考虑存放歌名、作者、专辑名、年份等复杂信息,而这些信息在MP3应用中非常必要。1996年,FricKemp在“Studio 3”项目中提出了在MP3文件尾增加一块用于存放歌曲的说明信息,形成了ID3标准,至今已制定出ID3 V1.0,V1.1,V2.0,V2.3和V2.4标准。版本越高,记录的相关信息就越丰富详尽。
4.1 ID3V1
ID3 V1.0标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。V2.0是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少。绝大多数MP3仍使用ID3 V1.0标准。此标准是将MP3文件尾的最后128个字节用来存放ID3信息,这128个字节使用说明见表3。
字节
|
长度 (字节)
|
说 明
|
1-3
|
3
|
存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。
|
4-33
|
30
|
歌名
|
34-63
|
30
|
作者
|
64-93
|
30
|
专辑名
|
94-97
|
4
|
年份
|
98-127
|
30
|
附注
|
128
|
1
|
MP3音乐类别,共147种。
|
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'
|
|
|
|
|
|
|
|
|
80
|
Folk
|
81
|
Folk/Rock
|
82
|
National Folk
|
83
|
Swing
|
84
|
Fast-Fusion
|
85
|
Bebob
|
86
|
Latin
|
87
|
Revival
|
88
|
Celtic
|
89
|
Bluegrass
|
90
|
Advantgarde
|
91
|
Gothic Rock
|
92
|
Progressive Rock
|
93
|
Psychadelic Rock
|
94
|
Symphonic Rock
|
95
|
Slow Rock
|
96
|
Big Band
|
97
|
Chorus
|
98
|
Easy Listening
|
99
|
Acoustic
|
100
|
Humour
|
101
|
Speech
|
102
|
Chanson
|
103
|
Opera
|
104
|
Chamber Music
|
105
|
Sonata
|
106
|
Symphony
|
107
|
Booty Bass
|
108
|
Primus
|
109
|
Porn Groove
|
110
|
Satire
|
111
|
Slow Jam
|
112
|
Club
|
113
|
Tango
|
114
|
Samba
|
115
|
Folklore
|
Any other value should be considered as 'Unknown'
|
4.2 ID3V2
ID3V2 到现在一共有 4 个版本,但流行的播放软件一般只支持第 3 版,既 ID3v2.3。每个 ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在 MP3 文件的首部。
4.2.1 标签头
在文件的首部顺序记录 10 个字节的 ID3V2.3 的头部。数据结构如下:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
char Ver; /*版本号 ID3V2.3 就记录 3*/
char Revision; /*副版本号此版本记录为 0*/
char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/
char Size[4]; /*标签大小,包括标签头的 10 个字节和所有的标签帧的大小*/
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)*0x400
+(Size[2]&0x7F)*0x80
+(Size[3]&0x7F)
4.2.2 标签帧
每个标签帧都有一个 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
算法如下:
nt 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 -- 加密标志
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
节摘自http://blog.csdn.net/sunshine1314/article/details/2514322和