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文档成为多媒体信息处理领域的热点。

【转】MP3文件原理及结构解析的更多相关文章

  1. boot.img格式文件拆解实例结构解析

    以msm8226为例,讲解android源码编译生成boot.img的结构.boot.img包括boot.img header.kernel以及ramdisk文件系统.下面是对boot.img的结构进 ...

  2. MP3文件的结构与编程

    有一个朋友喜欢听MP3,为了获取MP3,写了一个程序,专门从一家音乐网站上搜索下载mp3,一下子下载了有上千首.这时朋友又犯愁了,这些MP3的歌曲名字都是使用1,2,3,4,..等数字命名,挑选起来十 ...

  3. c# 解析MP3文件

    不说那么多,网上有很多关于MP3文件说明的. 该C#代码是将C\C++转化过来的,可能存在问题. 如有需要的朋友可以参考. 项目中的文件路径大家自己修改. 下载地址

  4. 浅谈如何使用代码为MP3文件写入ID3Tags

    作者:郑童宇 GitHub:https://github.com/CrazyZty 1.前言 做了三年左右的Android开发,一直没写过博客,最近正好打算换工作,算是闲一些,就将以前开发所遇到的一些 ...

  5. 【转】QQ传输文件原理参考(来自互联网)

    QQ的文件发送是怎样的过程呢?通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话.随即,发送计 ...

  6. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  7. Hyperledger Fabric 账本结构解析

    前言 现在很多人都在从事区块链方面的研究,作者也一直在基于Hyperledger Fabric做一些开发工作.为了方便后来人更快的入门,本着“开源”的精神,在本文中向大家讲解一下Hyperledger ...

  8. C#读取MP3文件的专辑图片和ID3V2Tag信息(带代码)

    第二次更新,后面的代码有问题,有些专辑图片读取不到.发现是PNG图片的问题.在读取的过程中调试发现,图片帧前10个字节包含了图片的格式,在有些歌曲写着JPEG的格式,数据却是PNG的.先说下思路. j ...

  9. NO21 Llinux的文件种类与扩展名--文件权限--软硬链接--Linux删除文件原理

    Linux的文件种类与扩展名 一.文件种类:1.普通文件(regular file)第一个字符为[ - ]包括:①纯文本档(ASCII):这是Linux系统中最多的一种文件类型,称为纯文本档.是因为内 ...

随机推荐

  1. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  2. 安装django 提示ImportError: No module named setuptools

    安装django前要先安装setuptools 先安装一些必要的包,否则会报错:Python build finished, but the necessary bits to build these ...

  3. Dojo初探

    Dojo 是一个由 Dojo 基金会开发的 Javascript 工具包, 据说受到 IBM 的永久支持,其包括四个部分: dojo, dijit, dojox, util dojo: 有时也被称作 ...

  4. Hibernate使用详解(一)

    一.前言 这些天都在为公司框架重构做准备,浏览了一下代码,挑了几个不熟或者没接触过的知识点进行攻坚,hibernate是其中之一.其实接触hibernate是在大学期间,应该是在2012年,已经201 ...

  5. 如何设计好的RESTful API之安全性

    保证RESTful API的安全性,主要包括三大方面: a) 对客户端做身份认证 b) 对敏感的数据做加密,并且防止篡改 c) 身份认证之后的授权 1.对客户端做身份认证,有几种常见的做法: 1)在请 ...

  6. springBoot @Enable*注解的工作原理

    使用注解实现异步 RunnableDemo类 package com.boot.enable.bootenable; import org.springframework.scheduling.ann ...

  7. RT-thread内核之事件

    一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...

  8. BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...

  9. mac, xcode 6.1 安装command line tools 支持,autoconf,automake等

    以下软件包 都去我的环境库找到 1 先安装 tcl库 2 安装macports /opt/local/bin/port 一般装到这里 安装autoconf时提示: Warning: The Xcode ...

  10. Service学习

    一.采用startService方式开启服务 1.写一个服务类 public class PhoneService extends Service { private static final Str ...