MP3文件格式解析

1, MP3简介

MP3是今天一种常见的音乐格式,但恐怕除了工作要求之外,有兴趣对此进行研究的人恐怕不多。所以,当我打算做MP3解码方面的工作时,在找资料时也颇费了一番周折,同时也觉得很有趣。所以想在这里分享一下自己的心得,做一个总结性的介绍。这样有兴趣的同志也可以对此有一个大概了解,尽快入门。

MP3
是MPEG-1 Audio Layer 3的简称,是当今比较流行的一种数字音频编码和有损压缩格式(有Layer 3,也必然有Layer1和Layer2,也就是MP1和MP2,但不在本文讨论范围之内)。MP3技术的应该可以用来大幅度的降低音频文件存储所需要的空间。它丢掉脉冲编码调制(PCM)音频数据中对人类听觉不重要得数据,从而达到了较高的压缩比(高达12:1-10:1)。简单地说,MP3在编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成有较高压缩比的MP3文件,并使压缩后的文件在回放时也能够达到比较接近原音源的效果。

MP3
的音频质量取决于它的Bitrate和Sampling frequency,以及编码器质量。MP3的典型速度介于每秒128到320kb之间。采样频率也有44.1,48和32 kHz三种频率,比较常见的是采用CD采样频率——44.1kHz。常用的编码器是LAME,它完全遵循LGPL的MP3编码器,有着良好的速度和音质。

 

2,      MP3文件格式

用一个二进制查看器(比如Ultra-Edit)打开一个MP3文件,就能看到一大堆看似杂乱无序的数据。但只要用心了解就会知道,其实,这一切都是有规律可循的。

MP3
文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,ID3v2标签帧,数据帧和ID3v1标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。

I, ID3V2

ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

标签头

长度为10个字节,位于文件首部,其数据结构如下:

char Header[3]; /* 字符串 "ID3" */

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

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

char Flag;     /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */

char Size[4]; /* 标签大小,除了标签头的10 个字节的标签帧的大小 */

标签大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx

计算公式如下:

ID3V2_frame_size = (int)(Size[0] & 0x7F) << 21
                 | (int)(Size[1] & 0x7F) << 14
                  | (int)(Size[2] & 0x7F) << 7
                  | (int)(Size[3] & 0x7F) + 10;


标签帧

每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签头来标记帧的开始。其帧的结构如下:

char FrameID[4];   /*用四个字符标识一个帧,说明其内容 */

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

char Flags[2];     /* 存放标志,只定义了6 位,此处不再说明 */

常用帧标识:

TIT2:标题
TPE1
:作者
TALB
:专辑
TRCK
: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数
TYER
:年份
TCON
:类型
COMM
:备注,格式:“eng/0备注内容”,其中eng表示所使用的语言
帧大小为四个字节所表示的整数大小。


II, ID3V1

其数据结构如下:

char Header[3];    /* 标签头必须是"TAG"否则认为没有标签 */
char Title[30];    /*
标题 */
char Artist[30];   /*
作者 */
char Album[30];    /*
专集 */
char Year[4];      /*
出品年代 */
char Comment[28]; /*
备注 */
char reserve;      /*
保留 */
char track;;       /*
音轨 */
char Genre;        /*
类型 */

其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.

有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。


III,
数据帧

数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个四字节长的帧头,接下来可能有两个字节的CRC校验,其存在由帧头中的具体信息决定。接着就是帧的实体数据,也就是MAIN_DATA了。

A,帧头结构如下:

位置     长度     描述
(BIT)  (BITS)
————————————————————————————
31
-19   12       Frame sync(0xFFF)
18/17    2        Layer, 00 – reserved, 01 – Layer III
                         10 – Layer II, 11
- Layer I
16       1         protection_bit, 0
意味着受CRC保护,帧头后面跟16位的CRC。
15-12    4        bitrate_index,
比特率
11-10    2        sampling_frequency,    00 – 44.1KHz, 01 – 48KHz
                                         10 – 32 KHz,  11 –
保留
9        1        padding_bit,1
意味着帧里包含padding位,仅当采样频率为44.1KHz时发生。
8        1        private_bit
7
-6     2        mode,    00-stereo,        01-joint stereo(intensity stereo and/or ms_stereo)
                           11- dual_channel, 11 – single_channel
5-4      2        mode_extension,
在Layer III中表示使用了哪一种joint stereo编码方式。
                            Intensity_stereo   ms_stereo
                   00            off                off
                   01            on                 off
                   10            off                on
                   11            on                 on
3        1        copyright,1
表示受版权保护。
2        1        original
,0表示该bitstream是一个copy,1表示是original.
1-0      2        emphasis
,表示会使用哪一种de-emphasis。
                   00
- no emphasis,     01 – 50/15 microsec. Emphasis
                   10 – reserved,        11 – CCITT J.17

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

2)      数据帧大小:

FrameSize = 144 * Bitrate / SamplingRate + PaddingBit
当144 * Bitrate / SamplingRate不能被8整除,则加上相应的paddingBit.

B,MAIN_DATA:

MP3的granule包含18 * 32个subband采样。每个数据帧含有两个granule的数据,其内容结如下:
       - main_data_end pointer
       - side info for both granules (scfsi)
       - side info granule 1
       - side info granule 2
       - scalefactors and Huffman code data granule 1
       - scalefactors and Huffman code data granule 2

主要数据里包含了scalefactors, Huffman encoded data和ancillary information。其内容不再详叙,可以参考MP3 SPEC-IS0 11172-3 AUDIO PART。我们一般用的都是立体声,scfsi的长度为32个字节。

这里要解释的一个概念就是位流――bitstream。我们平常接触到的数据都是整数,最小的单位就是byte后者char。虽然我们也会用一个字节里的不同位来表示不同的含义,但总的来说,我们在出来数据的时候还是把它当作一个个字节看待。但对MP3这种数据格式来说,这是行不通的。在解码时,它的数据输入就是一个个比特流。其中一个或几个比特会是你的采样数据或者信息编码。你需要从整个MAIN_DATA里提取你所需要的以BIT为单位的参数和输入信号,从而进行解码。所以我们需要一个子程序,getbit(n),也就是从缓冲中提取所需要的位,并形成一个新的整数,作为我们的输出。

C,LAME标签帧

可是,当你真的打开一个MP3文件的时候,你会发现,很奇怪,很多时候第一个数据帧的帧头后面的32个字节居然都为0,这是为什么呢,这么奇怪的解码信息该如何解释?找到MP3 INFO TAG REV SPECIFICATION的网站,我才明白,原来第一帧并不是真正的数据帧,而是LAME编码的标志帧。

这里又要牵涉到两个概念:CBR和VBR。CBR表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。VBR是Variable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,它以字符串“Xing”为标记。同时,它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。

在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。接下来一直到该帧结束就是Zone C-LAME标签。

3,      相关资料

× Mp3 Info Tag rev 1 specifications - draft 0

× MP3 文件格式

× MP3 SPEC -IS0 11172-3 AUDIO PART 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
解析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~17Layer描述 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文件使用使用所谓比特变换,也就是说每一帧的比特率依照具体内容变化。这时就需要你每一帧都解析
### 回答1: MP3格式是一种音频文件格式,可以在各种设备上播放,如电脑、MP3音乐播放器、智能手机等。MP3文件格式包含音频数据和元数据,封装和解析工具是用于创建和解码MP3文件的软件程序。封装工具将音频数据和元数据组装在一起,以便与音频播放器兼容。解析工具将MP3文件读取为音频数据和元数据,以便播放器软件能够对其进行解码和播放。 封装工具主要将音频数据压缩为MP3格式,并添加元数据,如歌曲标题、歌手名、专辑名称、曲目编号等。这些元数据可以让播放器软件在播放时显示相关信息。另外,封装工具还可以调整音频文件的音量、剪辑音频、去除背景噪音等。 解析工具则负责读取MP3文件并将其解码为音频数据。解析工具需要支持多种编码格式,包括CBR和VBR。CBR是恒定比特率编码,VBR是可变比特率编码。CBR编码可以生成一致的文件大小,但音质会受到限制;VBR编码可以提供更好的音质,在相同的文件大小下,更少的空间被使用。 总之,封装和解析工具是MP3格式媒体文件的制作和播放的重要工具,它们能够帮助我们创建和播放高质量的音频文件。 ### 回答2: MP3格式封装解析工具是一种软件工具,用于处理MP3文件的封装和解封装操作。MP3音乐文件是由多个数据帧组成的,而封装就是将这些数据帧打包成一个容器内,以便于读取和管理。解封装则是将这些数据帧从容器中分离出来,以便于进行音频处理或播放。MP3格式封装解析工具能够处理MP3文件的封装格式,常见的有ID3v1、ID3v2和APE等格式。 MP3格式封装解析工具的主要功能包括:读取MP3文件的格式信息,解析MP3文件中的元数据信息,提取MP3音频数据,支持多种MP3封装格式的读取、编辑和修改,以及支持多种音频格式的转换和处理。 通常,MP3格式封装解析工具用于制作、编辑、转换MP3文件以及管理音频库等场合。在音乐制作过程中,制作人可以使用MP3格式封装解析工具对MP3文件进行编码、压缩、合并等操作。在音频处理过程中,音频工程师可以使用MP3格式封装解析工具对MP3文件进行剪切、重采样、加速、降噪等处理。在音频库管理过程中,MP3格式封装解析工具可以帮助管理人员对音频文件进行分类、过滤、批量处理等操作,从而提高工作效率、优化操作流程。 总之,MP3格式封装解析工具是一种必备的工具,既方便了MP3文件的处理和管理,又提高了工作效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值