MP3概述
MP3全称为MPEG Audio Layer 3,是一种高效的计算机音频编码方案,能以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件,基本保持源文件的音质,MP3是ISO/MPEG标准的一部分,ISO/MPEG标准描述了使用高性能感知编码方案的音频压缩,此标准一直在不断更新以满足“质高量小”的追求,现已形成MPEG Layer1、Layer2、Layer3三种音频编解码方案,分别对应MP1、MP2、MP3这三种声音文件。
MPEG(Moving Picture Expert Group)是ISO下的一个动态图像专家组,它指定的MPEG标准广泛的应用于各种多媒体中,MPEG标准包括视频和音频标准,其中音频标准已制定出MPEG-1、MPEG-2、MPEG-2 ACC、MPEG-4。MPEG-1和MPEG-2标准使用同一个音频编解码族Layer1、2、3,MP3绝大多数使用的是MPEG1标准。
MP3音频压缩包含编码和解码两部分,编码是将原始信号转换成电平信号的过程,解码即是逆过程,MP3采用了感知音频编码(PerceptualAudio Coding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。
MP3文件结构
MP3文件大体上分为三个部分:ID3V2 + 音频数据 + ID3V1
ID3V2
ID3V2一共有四个版本,ID3V2.1/2.2/2.3/2.4,目前流行的播放软件一般只支持第三版即ID3V2.3,由于ID3V1记录在文件的末尾处,ID3V2就只能记录在文件的首部了,也是因为这个原因,对ID3V2的操作比ID3V1要慢,而且ID3V2的结构比ID3V1的结构复杂的多,但是ID3V2可以记录更多的信息,长度可变。
ID3V2.3由一个标签头和若干个标签帧或者一个扩展标签头组成,至少要有一个标签帧,每一个标签帧记录一种信息,例如作曲、标题等。
标签头
位于文件开始处,长度为10字节,结构如下:
char szHeader[3] // 必须为“ID3”否则认为标签不存在
char cVer // 版本号ID3V2.3 就记录3
char cRevision // 副版本号此版本记录为0
char cFlag // 标志字节,只使用高三位,其它位为0
char szSize[4] // 标签大小
注:标签大小,不能确定具体包括哪些内容,解析歌曲文件后,发现没有哪些字节之和会等于该值,详见下面的实例分析
标志字节一般为0,定义如下(abc000000B)
- 表示是否使用Unsynchronisation
- 表示是否有扩展头部,一般没有,所以一般也不设置
- 表示是否为测试标签,99.99%的标签都不是测试标签,不设置
标签大小共四个字节,每个字节只使用低7位,最高位不使用恒为0,计算时将最高位去掉,得到28bit的数据,计算公式如下:
Size = (Size[0] & 0x7F) * 0x200000 + (Size[1] & 0x7F) * 0x400 + (Size[2] & 0x7F) * 0x80 + (Size[3] & 0x7F)
标签帧
每个标签帧都有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 表示备注所使用的自然语言
帧内容大小,计算公式如下:
Size = Size[0] * 0x100000000 + Size[1] * 0x10000+ Size[2] * 0x100 +Size[3]
标志帧,使用每个字节的高三位,其他位均为0(abc00000B xyz00000B)
a -- 标签保护标志,设置时认为此帧作废
b -- 文件保护标志,设置时认为此帧作废
c -- 只读标志,设置时认为此帧不能修改
x -- 压缩标志,设置时一个字节存放两个BCD 码表示数字
y -- 加密标志
z -- 组标志,设置时说明此帧和其他的某帧是一组
音频数据解析
每个帧都有一个帧头,长度是四个字节,帧后面可能有2字节的CRC校验,取决于帧头的第16位,为0则无校验,为1则有校验,后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。
数据帧帧头
帧头长4字节,结构如下:
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
帧长度与帧大小
帧长度是压缩时每一帧的长度,包括帧头的4个字节。它将填充的空位也计算在。Layer 1的一个空位长4字节,Layer 2和Layer 3的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。
计算公式如下:
Layer 1 :Len(字节) = ((每帧采样点数 / 8 * 比特率) / 采样频率) + 填充 * 4
Layer2/3:Len(字节) = ((每帧采样点数 / 8 * 比特率) / 采样频率) + 填充
例:MPEG1 Layer3 比特率128 kbps,采样率44.1 KHz,填充0,帧长度为:((1152 / 8 * 128K) / 44100 + 0 = 417 bytes
帧持续时间
计算公式:
每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000
例:1152/441000*1000=26ms
帧数据
在帧头后边是Side Info(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。当解码器在读到上述信息后,就可以进行解码了。
对于mp3来说现在有两种编码方式,一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是是固定的(公式如上所述),只要知道文件总长度,和从第一帧帧头读出的信息,就都可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据。
另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的音频帧里会有“Xing"这个关键字(也有用"Info"来标识的,现在很多流行的小软件也可以进行VBR压缩,它们是否遵守这个约定,就不得而知了),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4s,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了。不过现在有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用"Info"来做CBR的标记。
VBR头文件
ID3V1解析
ID3 V1.0标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。V2.0是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少。绝大多数MP3仍使用ID3 V1.0标准。此标准是将MP3文件尾的最后128个字节用来存放ID3信息。
附录
帧标识
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
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"
使用KMPlayer与010 Editor完成MP3格式分析
音频信息
General
Complete name : E:\CloudMusic\茅野愛衣,戸松遥,早見沙織 - secret base ~君がくれたもの~ (10 years after Ver.).mp3
Format : MPEG Audio
File size : 13.7 MiB
Duration : 5 min 52 s
Overall bit rate mode : Constant
Overall bit rate : 320 kb/s
Album : secret base~君がくれたもの~
Part/Position : 1
Track name : secret base ~君がくれたもの~ (10 years after Ver.)
Track name/Position : 1
Performer : 茅野愛衣/戸松遥/早見沙織
Writing library : LAME3.99.5
Cover : Yes
Cover type : Media
Cover MIME : image/jpeg
Comment : 163 key(Don't modify):L64FU3W4YxX3ZFTmbZ+8/fVnOQX8EmRzrUUuLKKuwDIZUPQrg+gYl3AdfKvrJl1xX6FaQtsNaZl85w72z2q/ZpVM8SiKzKQQrSFxiQ+S6HKVbmhm3lBt45D9VUn0Jrx8JnpmlhAYvhlkJYXf3MMzTEbfKcFxz8YU/eG0/iQoWPZJlA0EgsmRhm1XRPQvuX1aDRx7pTEATtMZ77ps0h1x9YZ1JMnWRmbsBZ6TGobOnfwThagKnuKtAewlJv7Tq18u6HYfTp/du5eLC2Z7R/GO2Kp9O6c9Jl095unqF1jlOlVrsw4lvVFph2zWSWHX+zmrGionXYMSuzqlEvtUoslNFUWD0oGjlF5//M8AdHDxXRSCNFeNIxxh/I7Xdcd69iEH7GtMEKzdBfkSt54XmZIMTWn+Cq6vHzl7USE2uSBR+5lzF52iLEMGUl032XnxCs1BckiEShBqcpt2A9bYno5N8D6CEV/S0iyz1abxnOCihmoH80tCzBBlJvBzHSdlRGXmk1VfZYST5zwzcsXfAZlrT+VqMvCFo6jwBPjs1Qh1HfMHpT/lGGolwjw5YMBQ3xo7+q8WM3JlYPUmmnPAftfu89B4N/WgO0InWZV8fCOBlxDYNuhNjK0mKFoFmWvoMZICK1Z36JDG51MJ+yCcyVVqTtCLiq3wZGHJvsjRFOzTWVeY3aG/neVxZdSass8EeEIxrcMlDfF1OisL7kk5hlI6jSYU8F2Jey8jHb3L4Jwy+4vJOQEdeJCMxpoEDbVcdhSQ
Audio
Format : MPEG Audio
Format version : Version 1
Format profile : Layer 3
Format settings : Joint stereo / MS Stereo
Duration : 5 min 52 s
Bit rate mode : Constant
Bit rate : 320 kb/s
Channel(s) : 2 channels
Sampling rate : 44.1 kHz
Frame rate : 38.281 FPS (1152 SPF)
Compression mode : Lossy
Stream size : 13.4 MiB (98%)
Writing library : LAME3.99.5
结构解析
标签头
标签头:10字节,00H-09H
TSSE
COMM
TALB
TIT2
TPE1
TPOS
TRCK
APIC
音频帧
参考资料
https://charleswyt.github.io/2018/09/03/mp3%E9%9F%B3%E9%A2%91%E8%A7%A3%E6%9E%90/
文章评论