现在的位置: 首页 > 综合 > 正文

MP3文件的格式分析

2018年05月13日 ⁄ 综合 ⁄ 共 11795字 ⁄ 字号 评论关闭

因为要对音频进行处理,实现截取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 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。

二.整个MP3 文件结构:
MP3 文件大体分为三部分:TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)

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

Frame:一系列的帧,个数由文件大小和帧长决定
每个FRAME 的长度可能不固定,也可能固定,由位率bitrate 决定
每个FRAME 又分为帧头和数据实体两部分
帧头记录了mp3 的位率,采样率,版本等信息,每个帧之间相互独立

ID3V1:包含了作者,作曲,专辑等信息,长度为128BYTE。我们一般读取MP3的信息时都是读取ID3V1和ID3V2。

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

FRAMERHERDER          CRC                    MAIN_DATA

    4 BYTE                    0OR2                   长度由帧头计算得出
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        Version2.5

                                                                                           01 - reserved

                                                                                           10 -                                                                                           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

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
 11 CCIT       J.17                                                               10 - reserved


 

有些东西是需要知道的:                                                                                      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

2.MAIN_DATA:
MAIN_DATA 部分长度是否变化决定于FRAMEHEADER 的bitrate 是否变化,一首MP3 歌曲,它有三个版
本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps。Kbps(比特位速率),表明了音乐每秒的数据量,
Kbps 值越高,音质越好,文件也越大,MP3 标准规定,不变的bitrate 的MP3 文件称作CBR,大多数MP3
文件都是CBR 的,而变化的bitrate 的MP3 文件称作VBR,每个FRAME 的长度都可能是变化的。下面是CBR
和VBR 的不同点:
1)CBR:固定位率的FRAME 的大小也是固定的(公式如上所述),只要知道文件总长度,和帧长即可由播
放每帧需26ms 计算得出mp3 播放的总时间,也可通过计数帧的个数控制快进、快退慢放等操作。
2)VBR:VBR 是XING 公司推出的算法,所以在MP3 的FRAME 里会有“XING"这个关键字(现在很多流行的
小软件也可以进行VBR 压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个
有效FRAME 里,它标识了这个MP3 文件是VBR 的。同时第一个FRAME 里存放了MP3 文件的FRAME 的总个数,
这就很容易获得了播放总时间,同时还有100 个字节存放了播放总时间的100 个时间分段的FRAME 的INDEX,
假设4 分钟的MP3 歌曲,240S,分成100 段,每两个相邻INDEX 的时间差就是2.4S,所以通过这个INDEX,
只要前后处理少数的FRAME,就能快速找出我们需要快进的FRAME 头

四.ID3v1
ID3V1 比较简单,它是存放在MP3 文件的末尾,用16 进制的编辑器打开一个MP3 文件,查看其末尾
的128 个顺序存放字节,数据结构定义如下:
typedef struct tagID3V1
{
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; /*类型*/
}ID3V1,*pID3V1;

五.ID3V2
ID3V2 到现在一共有4 个版本,但流行的播放软件一般只支持第3 版,既ID3v2.3。由于ID3V1 记录
在MP3 文件的末尾,ID3V2 就只好记录在MP3 文件的首部了(如果有一天发布ID3V3,真不知道该记录在哪
里)。也正是由于这个原因,对ID3V2 的操作比ID3V1 要慢。而且ID3V2 结构比ID3V1 的结构要复杂得多,
但比前者全面且可以伸缩和扩展。
下面就介绍一下ID3V2.3。
每个ID3V2.3 的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者
等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签
头和标签帧一起顺序存放在MP3 文件的首部。
1

1、标签头
在文件的首部顺序记录10 个字节的ID3V2.3 的头部。数据结构如下:
char Header[3]; /*必须为"ID3"否则认为标签不存在*/
char Ver; /*版本号ID3V2.3 就记录3*/
char Revision; /*副版本号此版本记录为0*/
char Flag; /*存放标志的字节,这个版本只定义了三位,稍后详细解说*/
char Size[4]; /*标签大小,包括标签头的10 个字节和所有的标签帧的大小*/
1).标志字节
标志字节一般为0,定义如下:
abc00000
a -- 表示是否使用Unsynchronisation(这个单词不知道是什么意思,字典里也没有找到,一般不设置)
b -- 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置
c -- 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)

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)
2、标签帧
每个标签帧都有一个10 个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件
中,和标签头和其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中的到内容大
小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
帧头的定义如下:
char FrameID[4]; /*用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表*/
char Size[4]; /*帧内容的大小,不包括帧头,不得小于1*/
char Flags[2]; /*存放标志,只定义了6 位,稍后详细解说*/
1).帧标识
用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2=标题 表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨 格式:N/M 其中N 为专集中的第N 首,M 为专集中共M 首,N 和M 为ASCII 码表示的数字
TYER=年代 是用ASCII 码表示的数字
TCON=类型 直接用字符串表示
COMM=备注 格式:"eng/0 备注内容",其中eng 表示备注所使用的自然语言
2).大小
这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]*0x100000000
+Size[1]*0x10000
+Size[2]*0x100
+Size[3];
3).标志
只定义了6 位,另外的10 位为0,但大部分的情况下16 位都为0 就可以了。格式如下:
abc00000 ijk00000
a -- 标签保护标志,设置时认为此帧作废
b -- 文件保护标志,设置时认为此帧作废
c -- 只读标志,设置时认为此帧不能修改(但我没有找到一个软件理会这个标志)
i -- 压缩标志,设置时一个字节存放两个BCD 码表示数字
j -- 加密标志(没有见过哪个MP3 文件的标签用了加密)
k -- 组标志,设置时说明此帧和其他的某帧是一组
值得一提的是winamp 在保存和读取帧内容的时候会在内容前面加个'/0',并把这个字节计算在帧内容的
大小中。

如果你读取音频的信息,就要把ID3V1和ID3V2的结构分析清楚,然后读取相应的信息,然后实现快进等功能。明天我会用一系列的博文来分析如何用JAVA实现对MP3的截取。如何在程序中实现对MP3格式的分析。

 

抱歉!评论已关闭.