Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536994
  • 博文数量: 70
  • 博客积分: 3162
  • 博客等级: 中校
  • 技术积分: 850
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-23 13:30
文章分类
文章存档

2013年(1)

2012年(4)

2011年(1)

2010年(7)

2009年(9)

2008年(20)

2007年(3)

2006年(25)

分类:

2006-11-21 18:06:11

   

1.引言
文件压缩技术的日新月异使得MP3成为时下最烫手的音乐格式,优质的音乐随着0与1的排列迅速散布到世界各地,撼动人心。何谓MP3?MP3的全称是MPEG Audio Layer 3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.MP3的文件,基本保持原文件的音质。MP3是 ISO/MPEG标准的一部分,ISO/MPEG标准描述了使用高性能感知编码方案的音频压缩,此标准一直在不断更新以满足“质高量小”的追求,现已形成 MPEG Layer 1、Layer 2、Layer 3三个音频编码解码方案。MPEG Layer 3压缩率可达1:10至1:12,1M的MP3文件可播放1分钟,而1分钟CD音质的WAV文件(44100Hz,16bit,双声道,60秒)要占用 10M空间,这样算来,一张650M的MP3光盘播放时间应在10小时以上,而同样容量的一张CD盘播放时间在70分钟左右。MP3的优势是CD难以比拟的。
2 MP3原理浅析
2.1 MPEG Audio标准
MPEG(Moving Picture Experts Group)是ISO下的一个动态图象专家组,它制定的MPEG标准广泛应用于各种多媒体中。MPEG标准包括视频和音频标准,其中音频标准已制定出 MPEG-1、MPEG-2、MPEG-2 AAC和MPEG-4。
MPEG-1和MPEG-2标准使用同一个音频编码解码族—Layer1、 2、3。MPEG-2一个新特点是采用低采样率扩展降低数据流量,另一特点是多通道扩展,将主声道增加为5个。MPEG-2 AAC(MPEG-2 Advanced Audio Coding)标准是Fraunhofer IIS同AT&T公司于1997年推出的,旨在显著减少数据流量,MPEG-2 AAC采用的MDCT(Modified Discrete Cosine Transform)算法,采样率可在8KHz到96KHz之间,声道数可在1-48之间。
MPEG Audio Layer 1、2、3三个层使用相同的滤波器组、位流结构和头信息,采样频率为32KHz、44.1KHz或48KHz。Layer 1是为数字压缩磁带DCC(Digital Compact Cassette)设计的,数据流量为384kbps,Layer 2在复杂性和性能间作了权衡,数据流量下降到256kbps-192kbps。Layer 3一开始就为低数据流量而设计,数据流量在128kbps-112kbps,Layer 3增加了MDCT变换,使其频率分辨能力是Layer 2的18倍,Layer 3还使用了与MPEG Video类似的平均信息量编码(Entropy Coding),减少了冗余信息。MP3绝大部分使用的是MPEG-1标准。
2.2 音频压缩的目的
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分钟以上,由此可见,音频压缩对减少音频数据的存储空间显得尤为重要。
2.3 MP3编码与解码
MP3音频压缩包含编码和解码两个部分。编码是将WAV文件中的数据转换成高压缩率的位流形式,解码是接受位流并将其重建到WAV文件中。
MP3 采用了感知音频编码(Perceptual Audio Coding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。MP3编码和解码流程如图1所示。
2.4 修正的离散余弦变换
修正的离散余弦变换(MDCT)是指将一组时域数据转换成频域数据,以得知时域变化情况。MDCT是对DCT算法的改进,。早期的快速算法是快速付立叶变换(FFT),但FFT有复数运算,MDCT都是实数运算,便于编程。
在压缩音频数据时,先将原始声音数据分成固定的分块,然后做顺向MDCT(Forward MDCT)将每块的值转换为512个MDCT系数,解压时,经反向MDCT(Inverse MDCT)将512个系数还原成原始声音数据,前后的原始声音数据是不一致的,因为在压缩过程中,去掉了冗余和不相关数据。FMDCT变换公式为:
k=0,1,…,N/2-1
式中N是转换视窗长度,即每块样本点数,N=8,16,…,1024,2048。
n0=(N/2+1)/2,X(n)为时域值,X(k)为频域值。若N取1024点,则转换成512个频域值。
IMDCT变换公式为:

n=0,1,…,N-1
MDCT本身并不进行数据压缩,它只是把信号映射到另一个域,量化才使数据得到压缩。在对量化后的变换样值进行比特分配时要考虑使整个量化块最小,这就成为有损压缩了。
3 MP3文件格式分析
MP3文件数据由多个帧组成,帧是MP3文件最小组成单位。每个帧又由帧头、附加信息和声音数据组成。每个帧播放时间是0.026秒,其长度随位率的不同而不等。有些MP3文件末尾有些额外字节存放非声音数据的说明信息。MP3文件结构如图2所。


3.1 帧头格式
帧头长4字节,对于固定位率的MP3文件,所有帧的帧头格式一样其数据结构如下:
typedef FrameHeader{
unsigned int sync:11;//同步信息
unsigned int version:2;//版本
unsigned int layer:2;//层
unsigned int protection:1;// CRC校验
unsigned int bitrate:4;//位率
unsigned int 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字节使用说明见表1。
表1 MP3帧头字节使用说明
名称 长度(位) 说 明
同步
信息 11 第1、2字节 所有位均为1,第1字节恒为FF。
版本 2 00-MPEG 2.5 01-未定义
10-MPEG 2 11-MPEG 1
层 2 00-未定义 01-Layer 3
10-Layer 2 11-Layer 1
CRC
校验 1 0-校验 1-不校验
位率 4 第3字节 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。
频率 2 采样频率,对于MPEG-1:
00-44.1kHz 01-48kHz
10-32kHz 11-未定义
帧长
调节 1 用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。
保留字 1 没有使用。
声道
模式 2 第4字节 表示声道,
00-立体声 01-Joint Stereo
10-双声道 11-单声道
扩充
模式 2 当声道模式为01是才使用。
版权 1 文件是否合法,0-不合法 1-合法
原版
标志 1 是否原版, 0-非原版 1-原版
强调
方式 2 用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。
00-未定义 01-50/15ms
10-保留 11-CCITT J.17
MP3帧长取决于位率和频率,计算公式为:
帧长= 144×bitrate∕frequency+padding
例如:位率为64kbps,频率为44.1kHz,padding为1时,帧长为210字节。帧头后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。
对于固定位率(CBR,Constant Bitrate)的MP3文件,并不是所有的帧都是等长的,有的帧可能多一个或几个字节。还有一种可变位率(VBR, Variable Bitrate)的MP3文件,是为了使MP3文件长度最小同时又保证声音质量,与CBR文件相比,除了第一帧不同外,其余的都一样。VBR的第一帧不包含声音数据,其长度是156个字节,用来存放标准的声音帧头(4字节)、VBR文件标识、帧数、文件字节数等信息,具体结构说明见表2。
表2 VBR文件第一帧结构
字 节 说 明
1-4 与CBR相同的标准声音帧头
5-40 存放VBR文件标识“Xing”(58 69 6E 67),此标识具体位置视采用的MPEG标准和声道模式而定。标识的前后字节没有使用。
36-39 MPEG-1和非单声道(常见)
21-24 MPEG-1和单声道
21-24 MPEG-2和非单声道
13-16 MPEG-2和单声道
41-44 标志,说明是否存储了帧数、文件长度、目录表和VBR规模信息,如果存储了,则01 02 04 08。
45-48 帧数(包括第一帧)
49-52 文件长度
53-152 目录表,用来按时间进行字节定位。
153-156 VBR规模,用于位率变动


3.2 ID3标准
MP3 帧头中除了存储一些象private、copyright、original的简单音乐说明信息以外,没有考虑存放歌名、作者、专辑名、年份等复杂信息,而这些信息在MP3应用中非常必要。1996年,FricKemp在“Studio 3”项目中提出了在MP3文件尾增加一块用于存放歌曲的说明信息,形成了ID3标准,至今已制定出ID3 V1.0,V1.1,V2.0,V2.3和V2.4标准。版本越高,记录的相关信息就越丰富详尽。
ID3 V1.0标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。V2.0是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中真正实现的却极少。绝大多数MP3仍使用ID3 V1.0标准。此标准是将MP3文件尾的最后128个字节用来存放ID3信息,这128个字节使用说明见表3。
表3 ID3 V1.0文件尾说明
字节 长度
(字节) 说 明
1-3 3 存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。
4-33 30 歌名
34-63 30 作者
64-93 30 专辑名
94-97 4 年份
98-127 30 附注
128 1 MP3音乐类别,共147种。

3.3 文件实例
在VC++中打开一个名为test.mp3文件,其内容如下:
000000 FF FB 52 8C 00 00 01 49 09 C5 05 24 60 00 2A C1
000010 19 40 A6 00 00 05 96 41 34 18 20 80 08 26 48 29
000020 83 04 00 01 61 41 40 50 10 04 00 C1 21 41 50 64
……
0000D0 FE FF FB 52 8C 11 80 01 EE 90 65 6E 08 20 02 30
0000E0 32 0C CD C0 04 00 46 16 41 89 B8 01 00 08 36 48
0000F0 33 B7 00 00 01 02 FF FF FF F4 E1 2F FF FF FF FF
……
0001A0 DF FF FF FB 52 8C 12 00 01 FE 90 58 6E 09 A0 02
0001B0 33 B0 CA 85 E1 50 01 45 F6 19 61 BC 26 80 28 7C
0001C0 05 AC B4 20 28 94 FF FF FF FF FF FF FF FF FF FF
……
001390 7F FF FF FF FD 4E 00 54 41 47 54 45 53 54 00 00
0013A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
……
0013F0 00 00 00 00 04 19 14 03 00 00 00 00 00 00 00 00
001400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001410 00 00 00 00 00 00 4E
该文件长度1416H(5.142K),帧头为:FF FB 52 8C,转换成二进制为:
11111111 11111011
01010010 10001100
对照表1可知,test.mp3帧头信息见表4。
表4 test.mp3文件帧头信息
名称 位值 说 明
同步信息 11111111111 第1字节恒为FF,11位均为1。
版本 11 MPEG 1
层 01 Layer 3
CRC校验 1 不校验
位率 0101 64kbps
频率 00 44.1kHz
帧长调节 1 调整,帧长是210字节。
保留字 0 没有使用。
声道模式 10 双声道
扩充模式 00 未使用。
版权 1 合法
原版标志 1 原版
强调方式 00 未定义

第1397H开始的三个字节是54 41 47,存放的是字符“TAG”,表示此文件有ID3 V1.0信息。
139AH开始的30个字节存放歌名,前4个非00字节是54 45 53 54,表示“TEST”;
13F4H开始的4个字节是04 19 14 03,存放年份“04/25/2003”;
最后1个字节是4E,表示音乐类别,代号为78,即“Rock&Roll”;
其它字节均为00,未存储信息。
4 结束语
声音作为一类重要的多媒体数据,人们总是在不断寻求更高效率的压缩方法和新的声音文件格式。MP3文件中使用了MDCT变换,它是一种结构简单、易于编程的准最佳变换,,避免了最佳变换(K-L)难以求解协方差矩阵特征值及特征向量的困扰。通过对MP3文件格式的分析,不难发现它的欠缺。MP3文件每个帧都有4字节的相同帧头,对于一个含有大量帧的MP3文件来说,需要一定的空间开销。ID3存放音乐说明信息,帧头中的private、copyright等信息也是说明信息,音乐的说明信息有些零乱的感觉。
无论如何,MP3的发展势不可挡,MP3已成为公认的声音数据格式,MP3正与JPEG图像、PDF文档成为多媒体信息处理领域的热点。

阅读(10486) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-02-15 18:13:31

谢谢

qwdu2009-06-03 17:48:43

多谢您的建议,如果转载了此篇文章误导了大家,我对此表示深深的歉意! 对于mp3header的解析,如果有什么疑问可以留言,大家相互交流! mp3header的解析的主要可讨论部分是vbr格式的文件准确确定总时间的问题,我对此的做法是开始扫描完整个文件的所有帧,然后计算出总时间,如果大家有其他好方法,欢迎讨论

chinaunix网友2009-04-23 15:21:57

此篇文章我再CSDN上面看过,而且经过我的仔细验证,发现除了固定的东西是正确的外,其余的地方有很大的漏洞!希望楼主在链接这些文章时最好自己验证是否编程能通过,否则对初学者是一个误导

chinaunix网友2008-12-22 18:33:04

此标准是将MP3文件尾的最后128个字节用来存放ID3信息,这128个字节使用说明见表3。 表3 ID3 V1.0文件尾说明 字节 长度 (字节) 说 明 1-3 3 存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。 4-33 30 歌名 34-63 30 作者 64-93 30 专辑名 94-97 4 年份 98-127 30 附注 128 1 MP3音乐类别,共147种。