MP3文件格式解析

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。

MP3格式始于80年代中期,德国Erlangen的Fraunhofer研究所致力于高质 量、低数据率的声音编码。让我们来看一个例子:你想对你喜欢的一首长约4分钟的歌曲采样,将其存储在磁盘上,以CD音质的WAV格式抽样,抽样率为 44.1kHz,即每秒钟接收44100个值,立体声,每次抽样数据为16位(2字节),则这首歌占的空间为:

44100x2声道x2字节x60秒x4分钟=40.4MB

如果从Internet上下载这首歌,假设传输率为56kbps,则下载时间为:

40.4x106x8/56x103x60=96分钟

即使是1M的宽带网也需5分钟以上,由此可见,音频压缩对减少音频数据的存储空间显得尤为重要。

    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

音频帧

原文连接:MP3音频文件格式详细解析 - 山野莽夫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值