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音频文件格式详细解析 - 山野莽夫

解析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 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。 名词解释: 比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送的数据越大。 比特率比特率表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,而比特就是二进制里面最小的单位,要么是0,要么是1。比特率与音、视频压缩的关系,简单的说就是比特率越高,音、视频的质量就越好,但编码后的文件就越大;如果比特率越少则情况刚好相反。 采样率(也称为采样速度或者采样频率)定义了每秒从连续信号中提取并组成离散信号的采样个数,单位用赫兹(Hz)来表示。采样频率的倒数是采样周期(也称为采样时间),它表示采样之间的时间间隔。这里要注意不要将采样率与位速相混淆。 二、MP3文件整体结构 MP3文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1) ID3V2标签帧 ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。 音频数据帧 一系列的帧,个数由文件大小和帧长决定,每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定,每个FRAME又分为帧头和数据实体两部分,帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立 ID3V1标签帧 ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。 三、MP3结构具体分析 1.ID3V2标签 每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。 标签头 在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下: char Header[3]; /*必须为"ID3"否则认为标签不存在*/ char Ver; /*版本号ID3V2.3 就记录3*/ char Revision; /*副版本号此版本记录为0*/ char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/ char Size[4]; /*标签大小,包括标签头的10 个字节和所有的标签帧的大小*/ 注:最后4个字节表示ID3V2标签的大小,在实际寻找首帧的过程中,我发现大部分的mp3文件的标签大小是包含标签头的,但有的又是不包含的,可能是某些mp3编码器写标签的BUG,所以为了兼容只好认为其是包含的,如果按大小找不到,再向后搜索,直到找到首帧为止。 计算ID3V2标签帧的大小: 最后四个字节表示,但每个字节只用7 位,最高位不使用恒为0。所以格式如下: 0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx 计算大小时要将0 去掉,得到一个28 位的二进制数,就是标签大小(不懂为什么要这样做),计算公式如 下: int ID3V2_Size; ID3V2_Size = (Size[0]&0x7F;)*0x200000 +(Size[1]&0x7F;)*0x4000 +(Size[2]&0x7F;)*0x80 +(Size[3]&0x7F;) (2) 标签帧 每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。 一般我们从标签头中获取信息计算出整个ID3V2标签的大小即可,对于ID3V2的标签帧就不再仔细分析。 2.音频数据 数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。 (1)音频数据帧的帧头 格式如下: AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM 符号 长度(bit) 位置(bit) 描述 A 11 (31~21) 帧同步(所有位置1) B 2 (20~19) MPEG 音频版本ID 00 – MPEG 2.5 01 – 保留 10 – MPEG 2 (ISO/IEC 13818-3) 11 – MPEG 1 (ISO/IEC 11172-3) C 2 (18~17) Layer描述 00 - 保留 01 - Layer III 10 - Layer II 11 - Layer I D 1 (16) 校验位(0 - 紧跟帧头后有16位即2个字节用作CRC校验1 - 没有校验) E 4 (15~12) 比特率(位率)(见比特率索引表) F 2 (11~10) 采样率(见采样率索引表) G 1 (9) 填充位(填充用来达到正确的比特率。) 0 – 没有填充 1 – 填充了一个额外的空位 H 1 (8) 私有bit,可以用来做特殊应用。例如可以用来触发应用程序的特殊事件。 I 2 (7~6) 声道 00 立体声 01 联合立体声(立体声) 10 双声道(立体声) 11 单声道(单声) J 2 (5~4) 扩展模式(仅在联合立体声时有效) 扩展模式用来连接对立体声效果无用的信息,来减少所需的资源。这两个位在联合立体声模式下有编码器动态指定。 K 1 (3) 版权 0无版权 1有版权 L 1 (2) 原创 0 原创拷贝 1 原创 M 2 (1) 强调 00 - 无 01 - 50/15 ms 10 - 保留 11 - CCIT J.17 【帧头信息表】 索引值 MPEG1 MPEG2&MPEG2;.5 Layer1 Layer2 Layer3 Layer1 Layer2&3 0000 Free 0001 32 32 32 32 8 0010 64 48 40 48 16 0011 96 56 48 56 24 0100 128 64 56 64 32 0101 160 80 64 80 40 0110 192 96 80 96 48 0111 224 112 96 112 56 1000 256 128 112 128 64 1001 288 160 128 144 80 1010 320 192 160 160 96 1011 352 224 192 176 112 1100 384 256 224 192 128 1101 416 320 256 224 144 1110 448 384 320 256 160 1111 Bad 【比特率索引表】 Bits MPEG1 MPEG2 MPEG3 00 44100 22050 11025 01 48000 24000 12000 10 32000 16000 8000 11 保留 【采样率索引表】 (2)如何计算音频数据帧长度 我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值入下表所示 MPEG1 MPEG2 MPEG2.5 Layer1 384 384 384 Layer2 1152 1152 1152 Layer3 1152 576 576 【每帧采【每帧采样数表】 帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。 注意:因为有填充和比特率变换,帧长度可能变化。 从头中读取比特率,采样频率和填充, LyaerI使用公式: 帧长度(字节) = 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 +填充 * 4 LyerII和LyaerIII使用公式: 帧长度(字节)= 每帧采样数 / 采样频率(HZ) * 比特率(bps)/ 8 + 填充 例: LayerIII 比特率 128000,采样频率 44100,填充0 =〉帧大小 417字节 (3)计算每帧的持续时间 之前看了一些文章都说mp3的一帧的持续时间是26ms,结果在实际程序的编写中发现无法正确按时间定位到帧,然后又查了一些文章才知道,所谓26ms一帧只是针对MPEG1 Layer III而且采样率为44.1KHz来说是对的,但mp3文件并不都是如此,其实这个时间也是可以通过计算来获得,下面给出计算公式 每帧持续时间(秒) = 每帧采样数 / 采样频率(HZ) 可以这么理解:每帧采用数就是要采取的总数,采样率就是采取的速度,相除 就得到时间。 这样通过计算可知 MPEG1 Layer III 采样率为44.1KHz的一帧持续时间为26.12...不是整数,不过我们权且认为它就是26毫秒吧。 如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的,当然可以按MPEG版本,层数和采样率来建一个表,这样直接查表就可以知道时间了。 3.ID3V1标签 ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。以最后128个字节的头三个字节为“TAG”作为有ID3V1的判断依据。 结构如下: AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFG 符号 长度(byte) 位置 描述 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) 流派 有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。 四、解析方法 当你想读取MPEG文件的信息时,解析前三个字节,判断是否有ID3V2标签,有则根据上面的方法算出ID3V2标签的总大小,这样就找到了音频数据帧的第一帧,读取它的头信息,获取比特率、采样率、MPEG版本号、Layer描述号等信息,根据上面提供的方法算出每帧的长度和每帧持续时间,对于定比特率的其它帧是相同的,也就是说解析第一帧就达到了目的。但这也不是所有情况。变比特率的MPEG文件使用使用所谓比特变换,也就是说每一帧的比特率依照具体内容变化。这时就需要你每一帧都解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值