Mp3 文件结构全解析 (一)
MP3 文件是由帧(frame)构成的,帧是 MP3 文件最小的组成单位。MP3 的全称应为 MPEG1 Layer-3 音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG 音频文件是 MPEG1 标准中的声音部分,也叫 MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer2、Layer3, 且分别对应 MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和 MP2 的压缩率分别为 4:1 和 6:1-8:1,而 MP3 的压缩率则高达 10:1-12:1,也就是说,一分钟 CD 音质的音乐,未经压缩需要 10MB 的存储空间,而经过 MP3 压缩编码后只有 1MB 左右。不过 MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3 采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的 MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。
整体结构
MP3 文件大体分为四部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1),其他说明信息
ID3V2 包含了作者,作曲,专辑等信息,长度不固定,扩展了 ID3V1 的信息量。
Frame 一系列的帧,个数由文件大小和帧长决定,每个 FRAME 的长度可能不固定,也可能固定,由位率 bitrate 决定, 每个 FRAME 又分为帧头和数据实体两部分,帧头记录了 mp3 的位率,采样率,版本等信息,每个帧之间相互独立
ID3V1 包含了作者,作曲,专辑等信息,长度为 128BYTE。
其他说明信息(不重要)
ID3V2 解析
ID3V2 一共有四个版本,ID3V2.1/2.2/2.3/2.4,目前流行的播放软件一般只支持第三版即 ID3V2.3,由于 ID3V1 记录在文件的末尾处,ID3V2 就只能记录在文件的首部了,也是因为这个原因,对 ID3V2 的操作比 ID3V1 要慢,而且 ID3V2 的结构比 ID3V1 的结构复杂的多,但是 ID3V2 可以记录更多的信息,长度可变
ID3V2 主要有四个版本,现在主流的是 ID3V2.3,ID3V3.4, 2.2,2.1 与后面版本差异较大:2.2 的 Frame head id 是三个字节,而 2.3,2.4 是四个字节.
ID3V2.3 由一个标签头和若干个标签帧或者一个扩展标签头组成,至少要有一个标签帧,每一个标签帧记录一种信息,例如作曲、标题等
ID3V2.4 Overall tag structure:
标签头
位于文件开始处,长度为 10 字节,结构如下:
char Header[3]; /*必须为“ID3”否则认为标签不存在*/
char Ver; /*版本号ID3V2.3 就记录3*/
char Revision; /*副版本号此版本记录为0*/
char Flag; /*标志字节,只使用高三位,其它位为0 */
char Size[4]; /*标签大小*/
注:标签大小,不能确定具体包括哪些内容,解析歌曲文件后,发现没有哪些字节之和会等于该值,详见下面的实例分析
标志字节一般为 0,定义如下(abc000000B)
a:表示是否使用 Unsynchronisation
b:表示是否有扩展头部,一般没有,所以一般也不设置
c:表示是否为测试标签,99.99%的标签都不是测试标签,不设置
标签大小共四个字节,每个字节只使用低 7 位,最高位不使用恒为 0,计算时将最高位去掉,得到 28bit 的数据,计算公式如下:Size=(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x4000+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)<font color=red>注意:很多文章这里面写的是 Size[1]&0x7F)*0x4000,左移 14 位是乘以 0x4000,很多文章抄来抄去,源头出问题了,所有的都会出问题</font>
以《胡广生.mp3》为例,使用 UltraEdit 工具打开如下,读者可自己对照上述结构,本章结束会给出详细的结构分析
标签帧
每个标签帧都有 10 个字节的帧头(和标签头不是一个东西,虽然他们刚好都是 10 字节,标签头只有一个,每个标签帧都有一个帧头)和至少一个字节的内容构成,标签帧与标签头/其他标签帧无特殊字节分割,只能通过帧头信息来确定帧内容的大小。
帧头长度 10 字节,定义如下:
char ID[4]; /*标识帧,说明其内容,例如作者/标题等*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
char Flags[2]; /*标志帧,只定义了6 位*/
标识帧,常见的内容如下:
TIT2=标题
TPE1=作者
TALB=专集
TRCK=音轨格式:N/M 其中 N 为专集中的第 N 首,M 为专集中共 M 首,N 和 M 为 ASCII 码表示的数字
TYER=年代是用 ASCII 码表示的数字
TCON=类型直接用字符串表示
COMM=备注格式:"eng\0 备注内容",其中 eng 表示备注所使用的自然语言
ID3V2.4 中,帧内容大小,计算公式如下:
很多文章是这样的:
其实是有问题的.标志帧,使用每个字节的高三位,其他位均为 0(abc00000B xyz00000B)
a -- 标签保护标志,设置时认为此帧作废
b -- 文件保护标志,设置时认为此帧作废
c -- 只读标志,设置时认为此帧不能修改
x -- 压缩标志,设置时一个字节存放两个 BCD 码表示数字
y-- 加密标志
z-- 组标志,设置时说明此帧和其他的某帧是一组
ID3V1 解析
ID3 V1.0 标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。V2.0 是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少。绝大多数 MP3 仍使用 ID3 V1.0 标准。此标准是将 MP3 文件尾的最后 128 个字节用来存放 ID3 信息
实例分析
歌曲信息
<<胡广生.mp3>>
结构解析
标签头
标签头:10 字节,00H-09H
(Size[0]&0x7F)*0x200000+(Size[1]&0x7F)*0x400+(Size[2]&0x7F)*0x80+(Size[3]&0x7F)= (0x00&0x7F)*0x200000 + (0x03&0x7f)*0x4000 + (0x10&0x7f)*0x80 + (0x27&0x7f)= 0x00 + 0xc000 + 0x800 + 0x27 = 0xc824 = 51239 个字节
(0x00&0x7F)<<21 + (0x03&0x7f)<<14 + (0x10&0x7f)*<<7 + (0x27&0x7f)= 0x0 + 0xC000 + 0x800 + 0x27
TIT2 标签帧
TALB 标签帧
TPE1 标签帧
APIC 标签帧
This frame contains a picture directly related to the audio file. Image format is the MIME type and subtype for the image. In the event that the MIME media type name is omitted, "image/" will be implied. The "image/png" or "image/jpeg" picture format should be used when interoperability is wanted. Description is a short description of the picture, represented as a terminated textstring. The description has a maximum length of 64 characters, but may be empty. There may be several pictures attached to one file, each in their individual "APIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type 02 respectively. There is the possibility to put only a link to the image file by using the 'MIME type' "-->" and having a complete URL instead of picture data. The use of linked files should however be used sparingly since there is the risk of separation of files.
Picture type:
省略
Size = Size[0]*0x00000000 + Size[1]*0x10000+ Size[2]*0x100 +Size[3]
=0x010x10000+0x430x100+0x65
=0x10000+0x4300+0x65
=0x14365=82789
82789 / 16 = 5174 = 0x143682789 % 16 = 6
0x1436 + 0x2 = 0x14383 + 6 = 9
实现一个 MP3 解析器之标签解析
根据上面分析,先要读取标签头,先读取十个字节的标签头,定义一个结构体:
读取十个字节:
计算标签大小:
接下来遍历读取每一个标签帧,每个标签帧又有十个字节的标签帧头,同样定义一个结构体:
接下来循环读取标签帧头:
计算到标签 body 大小后,读取标签大小内容,并且转换成可读内容:
到此为止,已经可以把所有的标签内容读取成功并打印了.详细代码参考:https://github.com/qingkouwei/mp3parser
Mp3 格式定义参考官网:http://id3.org/id3v2.4.0-structure
附录
帧标识
AENC:Audioencryption
APIC:Attached picture
COMM:Comments
COMR:Commercial
ENCR:Encryptionmethod registration
EQUA:Equalization
ETCO:Event timingcodes
GEOB:Generalencapsulated object
GRID:Groupidentification registration
IPLS:Involvedpeople list
LINK:Linkedinformation
MCDI:Music CDidentifier
MLLT:MPEGlocationlookup table
OWNE:Ownership
PRIV:Private
PCNT:Playcounter
POPM:Popularimeter
POSS:Positionsynchronisation
RBUF:Recommendedbuffer size
RVAD:Relativevolume adjustment
RVRB:Reverb
SYLT:Synchronizedlyric/text
SYTC:Synchronizedtempo codes
TALB:Album/Movie/Showtitle
TBPM:BPM(beats perminute)
TCOM:Composer
TCON:Content type
TCOP:Copyrightmessage
TDAT:Date
TDLY:Playlistdelay
TENC:Encoded by
TEXT:Lyricist/Textwriter
TFLT:Filetype
TIME:Time
TIT1:Content groupdeion
TIT2:Title/songname/contentdeion
TIT3:Subtitle/Deionrefinement
TKEY:Initial key
TLAN:Language(s)
TLEN:Length
TMED:Media type
TOAL:Originalalbum/movie/show title
TOFN:Originalfilename
TOLY:Originallyricist(s)/text writer(s)
TOPE:Originalartist(s)/performer(s)
TORY:Originalrelease year
TOWN:Fileowner/licensee
TPE1:Leadperformer(s)/Soloist(s)
TPE2:Band/orchestra/accompaniment
TPE3:Conductor/performerrefinement
TPE4:Interpreted,remixed, or otherwise modified by
TPOS:Partof a set
TPUB:Publisher
TRCK:Tracknumber/Position in set
TRDA:Recordingdates
TRSN:Internetradio station name
TRSO:Internetradio station owner
TSIZ:Size
TSRC:ISRC(internationalstandard recording code)
TSSE:Software/Hardwareand settings used for encoding
TYER:Year
TXXX:Userdefinedtext information
UFID:Unique fileidentifier
USER:Terms of use
USLT:Unsychronizedlyric/text tranion
WCOM:Commercialinformation
WCOP:Copyright/Legalinformation
WOAF:Officialaudio file webpage
WOAR:Officialartist/performer webpage
WOAS:Officialaudio source webpage
WORS:Officialinternet radio station homepage
WPAY:Payment
WPUB:Publishersofficial webpage
WXXX:UserdefinedURL link
音乐类型
0="Blues";
1="ClassicRock";
2="Country";
3="Dance";
4="Disco";
5="Funk";
6="Grunge";
7="Hip-Hop";
8="Jazz";
9="Metal";
10="NewAge";
11="Oldies";
12="Other";
13="Pop";
14="R&B";
15="Rap";
16="Reggae";
17="Rock";
18="Techno";
19="Industrial";
20="Alternative";
21="Ska";
22="Deathl";
23="Pranks";
24="Soundtrack";
25="Euro-Techno";
26="Ambient";
27="Trip-Hop";
28="Vocal";
29="Jazz+Funk";
30="Fusion";
31="Trance";
32="Classical";
33="Instrumental";
34="Acid";
35="House";
36="Game";
37="SoundClip";
38="Gospel";
39="Noise";
40="AlternRock";
41="Bass";
42="Soul";
43="Punk";
44="Space";
45="Meditative";
46="InstrumentalPop";
47="InstrumentalRock";
48="Ethnic";
49="Gothic";
50="Darkwave";
51="Techno-Industrial";
52="Electronic";
53="Pop-Folk";
54="Eurodance";
55="Dream";
56="SouthernRock";
57="Comedy";
58="Cult";
59="Gangsta";
60="Top40";
61="ChristianRap";
62="Pop/Funk";
63="Jungle";
64="NativeAmerican";
65="Cabaret";
66="NewWave";
67="Psychadelic";
68="Rave";
69="Showtunes";
70="Trailer";
71="Lo-Fi";
72="Tribal";
73="AcidPunk";
74="AcidJazz";
75="Polka";
76="Retro";
77="Musical";
78="Rock&Roll";
79="HardRock";
80="Folk";
81="Folk-Rock";
82="NationalFolk";
83="Swing";
84="FastFusion";
85="Bebob";
86="Latin";
87="Revival";
88="Celtic";
89="Bluegrass";
90="Avantgarde";
91="GothicRock";
92="ProgessiveRock";
93="PsychedelicRock";
94="SymphonicRock";
95="SlowRock";
96="BigBand";
97="Chorus";
98="EasyListening";
99="Acoustic";
100="Humour";
101="Speech";
102="Chanson";
103="Opera";
104="ChamberMusic";
105="Sonata";
106="Symphony";
107="BootyBass";
108="Primus";
109="PornGroove";
110="Satire";
111="SlowJam";
112="Club";
113="Tango";
114="Samba";
115="Folklore";
116="Ballad";
117="PowerBallad";
118="RhythmicSoul";
119="Freestyle";
120="Duet";
121="PunkRock";
122="DrumSolo";
123="Acapella";
124="Euro-House";
125="DanceHall";
126="Goa";
127="Drum&Bass";
128="Club-House";
129="Hardcore";
130="Terror";
131="Indie";
132="BritPop";
133="Negerpunk";
134="PolskPunk";
135="Beat";
136="ChristianGangstaRap";
137="Heavyl";
138="Blackl";
139="Crossover";
140="ContemporaryChristian";
141="ChristianRock";
142="Merengue";
143="Salsa";
144="Trashl";
145="Anime";
146="JPop";
147="Synthpop";
参考
下篇 Mp3文件结构全解析(二)接着分析 MP3 文件的音频内容解析示例代码地址:git@github.com:qingkouwei/mp3parser.git
版权声明: 本文为 InfoQ 作者【轻口味】的原创文章。
原文链接:【http://xie.infoq.cn/article/693163a28436ae33b044d8b86】。文章转载请联系作者。
评论