• MP3格式音频文件结构解析


     

    一、概述

    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 文件结构:

    MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)

    a). ID3V2 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1 的信息量。 

    b). 一系列的音频数据的帧,在文件的中间位置,个数由文件大小和帧长决定;

    每个帧的长度可能不固定,也可能固定,由位率bitrate决定 

    每个帧又分为帧头和数据实体两部分 

    帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立 。

    c). ID3V1在文件结尾的位置,包含了作者,作曲,专辑等信息,长度为128Byte。

    ID3V2

    包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。

    Frame

    .

    .

    .

    Frame

    一系列的帧,个数由文件大小和帧长决定

    每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定

    每个FRAME又分为帧头和数据实体两部分

    帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。

    ID3V1

    包含了作者,作曲,专辑等信息,长度为128BYTE。

    表格2.1

    1、ID3V2

    ID3V2 到现在一共有4 个版本,但流行的播放软件一般只支持第3 版, 既ID3v2.3。

    由于ID3V1 记录在MP3 文件的末尾,ID3V2就只好记录在MP3 文件的首部了(如果有一天发布ID3V3,真不知道该记录在哪里)。也正是由于这个原因,对ID3V2 的操作比ID3V1 要慢。而且ID3V2 结构比ID3V1 的结构要复杂得多,但比前者全面且可以伸缩和扩展。

    下面就介绍一下ID3V2.3:

    每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

    1、标签头(计算ID3V2大小的时候要在标签大小的基础上加上10)

    在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下:

    char Header[3]; /*必须为"ID3"否则认为标签不存在*/

    char Ver; /*版本号ID3V2.3 就记录3*/

    char Revision; /*副版本号此版本记录为0*/

    char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/

    char Size[4]; /* 标签大小,除了标签头的10 个字节的标签帧的大小 */标签大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
    0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

     

    图2.1

    蓝色部分即为ID3V2.3的头部:前4个字节就是 ID30x03(3)

    5个字节:副版本号,为0

    注:文中关于mp3文件数据截图均为“紫藤花.mp3”文件中的数据截图

    1)标志字节

    标志字节一般为0,定义如下:

    abc00000

    a -- 表示是否使用Unsynchronisation(这个单词不知道是什么意思,字典里也没有找到,一般不设置)

    b -- 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置

    c -- 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)

    6个字节:存放标志的字节,只定义了三位,这里值为0

    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)

    710字节:表示ID3标签的大小,这里为

    total_size=0x00&0x7F)*0x200000+(0x00&0x7F)*0x400+(0x2F&0x10)*0x80 +(0x76 &072)

            = 0x872 =2162

    注意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小

    2、标签帧

    每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。

    帧头的定义如下:

    char ID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/

    char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/

    char Flags[2]; /*存放标志,只定义了6 位,稍后详细解说*/

     

    图2.2

    蓝色部分是一个歌曲标题的标签帧

    1)帧标识

    用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:

    TIT2=标题表示内容为这首歌的标题,下同

    TPE1=作者

    TALB=专集

    TRCK=音轨格式:N/M 其中N 为专集中的第N 首,M为专集中共M 首,N和M 为ASCII 码表示的数字

    TYER=年代是用ASCII 码表示的数字

    TCON=类型直接用字符串表示

    COMM=备注格式:"eng备注内容",其中eng 表示备注所使用的自然语言

    注:更多的帧标识说明见附录一。

    4个字节为帧标识,这里是54 49 5432(TIT2)是标题的标签帧

    2)大小

    这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下

    xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx

    算法如下:

    int FSize;

    FSize = Size[0]*0x100000000 + Size[1]*0x10000+ Size[2]*0x100 + Size[3];

    58字节为标签帧的大小,这里为

    FSize = 0x00*0x100000000+ 0x00*0x10000 + 0x00*0x100 + 0x24 = 0x24 = 36

    注意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小

    3)标志

    只定义了6 位,另外的10 位为0,但大部分的情况下16 位都为0 就可以了。格式如下:

    abc00000ijk00000

    a -- 标签保护标志,设置时认为此帧作废

    b -- 文件保护标志,设置时认为此帧作废

    c -- 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志)

    i -- 压缩标志,设置时一个字节存放两个BCD 码表示数字

    j -- 加密标志(没有见过哪个MP3 文件的标签用了加密)

    k -- 组标志,设置时说明此帧和其他的某帧是一组

    值得一提的是winamp 在保存和读取帧内容的时候会在内容前面加个'''',并把这个字节计算在帧内容的大小中。

    910字节为标签帧的标记,如上所述,这里为00

    帧内容是歌曲标题,标题的36个字节的内容为:紫藤花☆ゞ忍音.地带[renyin.12u.cn]

    2、音频数据帧

    每个帧都有一个帧头Header,长度是4Byte(32bit),帧头后面可能有两个字节的CRC 校验值,这两个字节的是否存在决定于Header 信息的第16bit,为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,紧跟在Header 后面,接着就是帧的实体数据了,格式如下:

    MP3FRAME格式:

    每个FRAME都有一个帧头FRAMEHEADER,长度是4BYTE32bit,帧头后面可能有两个字节的CRC校验,这两个字节的是否存在决定于FRAMEHEADER信息的第16bit,为0则帧头后面无校验,为1则有校验,校验值长度为2个字节,紧跟在FRAMEHEADER后面,接着就是帧的实体数据了,格式如下:

     

    FRAMEHEADER

    CRCfree

    MAIN_DATA

    4 BYTE

    0 OR 2 BYTE

    长度由帧长度-FRAMEHEADER-CRC

     

    1.帧头FRAMEHEADER格式如下:

    AAAAAAAA AAABBCCD EEEEFFGH IIJJKLMM

    13个帧头字符的含义如下:

    Sign

    Length
    (bits)

    Position
    (bits)

    Description

    A

    11

    (31-21)

    Frame sync (all bits set)

    B

    2

    (20,19)

    MPEG Audio version
    00 - MPEG Version 2.5
    01 - reserved
    10 - MPEG Version 2
    11 - MPEG Version 1

    C

    2

    (18,17)

    Layer description
    00 - reserved
    01 - Layer III
    10 - Layer II
    11 - Layer I

    D

    1

    (16)

    Protection bit
    0 - Protected by CRC (16bit crc follows header)
    1 - Not protected

    E

    4

    (15,12)

    Bitrate index

    bits

    V1,L1

    V1,L2

    V1,L3

    V2,L1

    V2,L2

    V2,L3

    0000

    free

    free

    free

    free

    free

    free

    0001

    32

    32

    32

    32

    32

    8 (8)

    0010

    64

    48

    40

    64

    48

    16 (16)

    0011

    96

    56

    48

    96

    56

    24 (24)

    0100

    128

    64

    56

    128

    64

    32 (32)

    0101

    160

    80

    64

    160

    80

    64 (40)

    0110

    192

    96

    80

    192

    96

    80 (48)

    0111

    224

    112

    96

    224

    112

    56 (56)

    1000

    256

    128

    112

    256

    128

    64 (64)

    1001

    288

    160

    128

    288

    160

    128 (80)

    1010

    320

    192

    160

    320

    192

    160 (96)

    1011

    352

    224

    192

    352

    224

    112 (112)

    1100

    384

    256

    224

    384

    256

    128 (128)

    1101

    416

    320

    256

    416

    320

    256 (144)

    1110

    448

    384

    320

    448

    384

    320 (160)

    1111

    bad

    bad

    bad

    bad

    bad

    bad

    NOTES: All values are in kbps
    V1 - MPEG Version 1
    V2 - MPEG Version 2 and Version 2.5
    L1 - Layer I
    L2 - Layer II
    L3 - Layer III
    "free" means variable bitrate.
    "bad" means that this is not an allowed value

    The values in parentheses are from different sources which claim that those values are valid for V2,L2 and V2,L3. If anyone can confirm please let me know.

    F

    2

    (11,10)

    Sampling rate frequency index (values are in Hz)

    bits

    MPEG1

    MPEG2

    MPEG2.5

    00

    44100

    22050

    11025

    01

    48000

    24000

    12000

    10

    32000

    16000

    8000

    11

    reserv.

    reserv.

    reserv.

     

    G

    1

    (9)

    Padding bit
    0 - frame is not padded
    1 - frame is padded with one extra bit

    H

    1

    (8)

    Private bit (unknown purpose)

    I

    2

    (7,6)

    Channel Mode
    00 - Stereo
    01 - Joint stereo (Stereo)
    10 - Dual channel (Stereo)
    11 - Single channel (Mono)

    J

    2

    (5,4)

    Mode extension (Only if Joint stereo)

    value

    Intensity stereo

    MS stereo

    00

    off

    off

    01

    on

    off

    10

    off

    on

    11

    on

    on

     

    K

    1

    (3)

    Copyright
    0 - Audio is not copyrighted
    1 - Audio is copyrighted

    L

    1

    (2)

    Original
    0 - Copy of original media
    1 - Original media

    M

    2

    (1,0)

    Emphasis
    00 - none
    01 - 50/15 ms
    10 - reserved
    11 - CCIT J.17

    1)每帧的播放时间:无论帧长是多少,每帧的播放时间都是26ms

    2)数据帧大小:

    FrameSize = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit

    例如:  Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1

     FrameSize = (144 * 128000) / 44100 + 1  = 417 bytes

     

    2MAIN_DATA

    MAIN_DATA部分长度是否变化决定于FRAMEHEADERbitrate是否变化,一MP3歌曲,它有三个版本:96Kbps(96千比特位每秒)、128Kbps和192Kbps。Kbps(比特位速率),表明了音乐每秒的数据量,Kbps值越高,音质越好,文件也越大,MP3标准规定,不变的bitrateMP3文件称作CBR,大多数MP3文件都是CBR的,而变化的bitrateMP3文件称作VBR,每个FRAME的长度都可能是变化的。下面是CBRVBR的不同点:

     

    1CBR:固定位率的FRAME的大小也是固定的(公式如上所述),只要知道文件总长度,和帧长即可由播放每帧需26ms计算得出mp3播放的总时间,也可通过计数帧的个数控制快进、快退慢放等操作。

    1)计算帧长(单个Frame长度)

    我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值如下表所示

     

    MPEG 1

    MPEG 2(LSF)

    MPEG 2.5(LSF)

    Layer 1

    384

    384

    384

    Layer 2

    1152

    1152

    1152

    Layer 3

    1152

    576

    576

    帧长度是压缩每一帧的长度,包括帧头(即每一个frame长度,表格2-1,一个MP3文件有多个frame)。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。

    从头中读取比特率,采样频率和填充的值后可以进行计算,

    LyaerI使用公式:

    帧长度(字节) = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4

    LyerII和LyaerIII使用公式:

    帧长度(字节)= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充

    例:

    LayerIII 比特率 128000,采样频率 44100,填充0  =〉帧大小 417字节;

    如图 2.3中,比特率为128K,采样率为44.1K,填充0,则其帧长度为:

    (1152 / 8 * 128K)/44.1K = 417 (字节)

    2)每帧的持续时间

    每帧的持续时间可以通过计算获得,下面给出计算公式

    每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000

    如图 2.3中,其每帧时间为:

    1152 / 44.1K * 1000 = 26.12 (约等于26ms)

    如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的。

    3)CRC校验

    如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以得知该帧是否有效。

    4)帧数据

    在帧头后边是Side Info(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。通道信息后面是Scale factor(增益因子)信息。当解码器在读到上述信息后,就可以进行解码了。图 2.3中地址为0x880到0x89F(含),此处数据全为0。

    对于mp3来说现在有两种编码方式,一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是是固定的(公式如上所述),只要知道文件总长度,和从第一帧帧头读出的信息,就都可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据。另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing"这个关键字(也有用"Info"来标识的,现在很多流行的小软件也可以进行VBR压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了。不过现在有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用"Info"来做CBR的标记。

    5)VBR

    这里列出VBR的第一帧存储文件信息的头的格式。有两种格式,一种是常见的XINGHeader(头部包含字符‘Xing’),另一种是VBRIHeader(头部包含字符‘VBRI’)鉴于VBRIHeader不常见,下面只说XINGHeader:

    XING Header的起始位置,相对于第一帧帧头的位置,单位是字节

    36-39 "Xing" 文件为MPEG1并且不是单声道(大多数VBR的mp3文件都是如此)

    21-24 "Xing" 文件为MPEG1并且是单声道

    21-24 "Xing" 文件为MPEG2并且不是单声道

    13-16 "Xing" 文件为MPEG2并且是单声道

    具体的VBR头格式说明

    请见:mp3音频数据帧帧头及VBR头字节使用说明.xls

    在VBR格式的第一帧中,XING Header包括帧头一共最多只需要156个字节就够了,当然也可以在XING Header后面存储编码器的信息,比如lame在其后就是存储其版本,这需要给第一帧留足够的空间才行。

    3、ID3v1

    ID3V1标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。ID3V2是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中绝大多数MP3仍在使用ID3V1标准。ID3v1标签包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。

    ID3V1结构如下:

    AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB
    BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD
    DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE
    EFFFFFFF FFFFFFFF FFFFFFFF FFFFFGHI

     

    表3.1  ID3 V1.0文件尾说明

    字节

    长度 (字节)

    说       明

    1-3(A)

    3

    存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。

    4-33(B)

    30

    歌名

    34-63(C)

    30

    作者

    64-93(D)

    30

    专辑名

    94-97(E)

    4

    年份

    98-125(F)

    28

    附注

    126(G)

    1

    保留位

    127(H)

    1

    音轨号

    128(I)

    1

    MP3音乐类别,共147种。

    ID3V1 的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30 个字节,则使用''''填充,数据结构定义如下:

    typedef struct tagID3V1
    
    {
    
    charHeader[3];         /*标签头必须是"TAG"否则认为没有标签*/
    
    charTitle[30];          /*标题*/
    
    charArtist[30];          /*作者*/
    
    charAlbum[30];        /*专集*/
    
    charYear[4];            /*出品年代*/
    
    charComment[28];   /*备注*/
    
    charreserve;             /*保留*/
    
    chartrack;              /*音轨*/
    
    charGenre;              /*类型*/
    
    }ID3V1, *pID3V1; 

    注:流派使用原码表示说明见附录二

    附录一:帧标识的含义

    4). Declared ID3v2 frames

    Thefollowing frames are declared in this draft.

    AENCAudio encryption

    APICAttached picture

    COMMComments

    COMRCommercial

    ENCREncryption method registration

    EQUAEqualization

    ETCOEvent timing codes

    GEOBGeneral encapsulated object

    GRIDGroup identification registration

    IPLSInvolved people list

    LINKLinked information

    MCDIMusic CD identifier

    MLLT MPEGlocation lookup table

    OWNEOwnership

    PRIVPrivate

    PCNT Playcounter

    POPMPopularimeter

    POSSPosition synchronisation

    RBUFRecommended buffer size

    RVADRelative volume adjustment

    RVRBReverb

    SYLTSynchronized lyric/text

    SYTCSynchronized tempo codes

    TALBAlbum/Movie/Show title

    TBPM BPM(beats per minute)

    TCOMComposer

    TCONContent type

    TCOPCopyright message

    TDAT Date

    TDLYPlaylist delay

    TENCEncoded by

    TEXTLyricist/Text writer

    TFLT Filetype

    TIME Time

    TIT1Content group deion

    TIT2Title/songname/content deion

    TIT3Subtitle/Deion refinement

    TKEYInitial key

    TLANLanguage(s)

    TLENLength

    TMEDMedia type

    TOALOriginal album/movie/show title

    TOFNOriginal filename

    TOLYOriginal lyricist(s)/text writer(s)

    TOPEOriginal artist(s)/performer(s)

    TORYOriginal release year

    TOWN Fileowner/licensee

    TPE1 Leadperformer(s)/Soloist(s)

    TPE2Band/orchestra/accompaniment

    TPE3Conductor/performer refinement

    TPE4Interpreted, remixed, or otherwise modified by

    TPOS Partof a set

    TPUBPublisher

    TRCKTrack number/Position in set

    TRDARecording dates

    TRSNInternet radio station name

    TRSOInternet radio station owner

    TSIZ Size

    TSRC ISRC(international standard recording code)

    TSSESoftware/Hardware and settings used for encoding

    TYER Year

    TXXX Userdefined text information

    UFIDUnique file identifier

    USERTerms of use

    USLTUnsychronized lyric/text tranion

    WCOMCommercial information

    WCOPCopyright/Legal information

    WOAFOfficial audio file webpage

    WOAROfficial artist/performer webpage

    WOASOfficial audio source webpage

    WORSOfficial internet radio station homepage

    WPAYPayment

    WPUBPublishers official webpage

    WXXX Userdefined URL link

    附录二:流派使用原码表

    /* Standard genres */
    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";
    
    Winamp扩充了这个表
    
    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";

    其他任何的数值都认为是“unknown

    文章来源:

    http://blog.csdn.net/jmxuan/article/details/59827

    http://blog.csdn.net/fulinwsuafcie/article/details/8972346

    http://blog.csdn.net/wlsfling/article/details/5875959

  • 相关阅读:
    [原]openstack-kilo--issue(二) openstack auth error
    [原]关闭selinux
    [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
    [转]Understanding OpenStack Authentication: Keystone PKI
    第七节:Core SignalR中的重连机制和心跳监测机制详解
    第八节:SQLServer函数大全(一)--字符串函数、数学函数
    第四节:SQLServer数据类型详解
    第三节:从多个角度分析顺序表和链表区别和特点
    第二节:线性表→顺序表→链表 逐个击破
    第一节:时间复杂度和空间复杂度
  • 原文地址:https://www.cnblogs.com/labi/p/3580325.html
Copyright © 2020-2023  润新知