AGENDA
* MP3简介
* MP3文件结构
——Tag_v2(ID3v2)标签帧
——数据帧
——Tag_v1(ID3v1)标签帧
*MP3编解码流程
*MP3文件的播放流程
一、MP3简介:
MP3全称MPEG 1 audio layer 3,其中MPEG(Moving Picture ExpertsGroup)标准包括视频和音频标准,其中音频标准已制定出 MPEG-1、MPEG-2、MPEG-2AAC和MPEG-4。
MPEG-1和MPEG-2标准使用同一个音频编码解码族—— Layer1、Layer2、Layer3。 它根据压缩质量和编码复杂程度进行划分的,分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高
MPEG-2一个新特点是采用低采样率扩展降低数据流量,另一特点是多通道扩展,将主声道增加为5个。
MPEG Audio Layer1、Layer2、Layer3三个层使用相同的滤波器组、位流结构和头信息,采样频率为32KHz、44.1KHz、48KHz。
Layer 1是为数字压缩磁带DCC(Digital CompactCassette)设计的,数据流384kbps;压缩率4:1;
Layer 2在复杂性和性能间作了权衡,数据流量下降到256kbps-192kbps;压缩率6:1-8:1;
Layer 3一开始就为低数据流量而设计,数据流量在128kbps-112kbps,压缩率高达10:1-12:1;
Layer 3增加了MDCT变换,使其频率分辨能力是Layer 2的18倍,Layer 3还使用了与MPEGVideo类似的平均信息量编码(Entropy Coding),减少了冗余信息。MP3绝大部分使用的是MPEG-1标准。
MP3的音频质量取决于它的Bitrate和Samplingfrequency,以及编码器质量。MP3的典型速度介于每秒128到320kb之间(此处有问题)。采样频率也有32,44.1,48kHz三种频率,比较常见的是采用CD采样频率——44.1kHz。常用的编码器是LAME,它完全遵循LGPL的MP3编码器,有着良好的速度和音质。
MP3对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“感官编码技术”,即它丢掉脉冲编码调制(PCM)音频数据中对人类听觉不重要得数据,从而达到了较高的压缩比,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。
二.整个MP3 文件结构:
MP3文件是由帧(frame)构成,帧是MP3文件的最小组成单位。每帧都包含帧头,并可以计算帧的长度。根据帧的性质不同,文件主要分为三个部分,TAG_V2(ID3V2)标签帧,数据帧和TAG_V1(ID3V1)标签帧。并非每个MP3文件都有ID3v2,但是数据帧和ID3v1帧是必须的。ID3v2在文件头,以字符串“ID3”为标志,包含了演唱者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。ID3v1在文件结尾,以字符串“TAG”为标记,其长度是固定的128个字节,包含了演唱者、歌名、专辑、年份等信息。
1. ID3V2 标签
ID3V2到现在一共有四个版本,但流行的播放软件一般只支持第三版,既ID3V2.3。每个ID3V2.3的标签都有一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。
标签头
长度为10个字节,位于文件首部,其数据结构如下:
char Header[3];
charVer;
char Revision;
char Flag;
char Size[4]; 标签大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
——标签帧
每个标签帧都有一个10字节的帧头和至少一个字节的不固定长度的内容组成。它们是顺序存放在文件中,由各自特定的标签帧头来标记帧的开始。其帧的结构如下:
char FrameID[4];
char Size[4];
char Flags[2];
常用帧标识:
TIT2:标题
TPE1:作者
TALB:专辑
TRCK: 音轨,格式:N/M,N表示专辑中第几首,M为专辑中歌曲总数
TYER:年份
TCON:类型
COMM:备注,格式:“eng/0备注内容”,其中eng表示所使用的语言
帧大小为四个字节所表示的整数大小。
2.数据帧
数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧都有一个帧头HEADER,长度是4BYTE(32bit),帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于HEADER信息的第16bit, 为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,紧跟在HEADER 后面,接着就是帧的实体数据,也就是MAIN_DATA了,格式如下:
HEADER
CRC(free)
MAIN_DATA
4BYTE
0 OR 2 BYTE
----帧头HEADER的详细结构为:
表1 MP3帧头字节使用说明
名称 |
位长 |
说 明 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
同步信息 | 11 | 第1、2字节 | 所有位均为1,第1字节恒为FF。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版本 | 2 | 00-MPEG2.5 01-未定义 10-MPEG2 11-MPEG 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
层 | 2 | 00-未定义 01-Layer 3 10-Layer2 11-Layer 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CRC校验 | 1 | 0-校验 1-不校验 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
位率 | 4 | 第3字节 | 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。
V1 - MPEG1 V2 - MPEG 2and MPEG 2.5 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
采样频率 | 2 | 采样频率,对于MPEG-1: 00-44.1kHz 01-48kHz 10-32kHz 11-未定义 对于MPEG-2: 00-22.05kHz 01-24kHz 10-16kHz 11-未定义 对于MPEG-2.5: 00-11.025kHz 01-12kHz 10-8kHz 11-未定义 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
帧长调节 | 1 | 用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
保留字 | 1 | 没有使用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
声道模式 | 2 | 第4字节 | 表示声道, 00-立体声Stereo 01-JointStereo 10-双声道 11-单声道 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
扩充模式 | 2 | 当声道模式为01是才使用。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权 | 1 | 文件是否合法,0-不合法 1-合法 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
原版标志 | 1 | 是否原版, 0-非原版 1-原版 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
强调方式 | 2 | 用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。 00-未定义 01-50/15ms 10-保留 11-CCITT J.17 |
本: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 头。
表2 VBR文件第一帧结构
字节 | 说 明 | |
1-4 | 与CBR相同的标准声音帧头 | |
5-40 | 存放VBR文件标识“Xing”(58 69 6E67),此标识具体位置视采用的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规模,用于位率变动 |
除了INDEX,还有其他的一些参数,这被称为Zone A,传统Xing VBR标签数据,共120个字节。在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且后面清楚地跟着版本号。这就是20个字节的ZoneB初始LAME信息,表示该文件是用LAME编码技术。
接下来一直到该帧结束就是Zone C-LAME标签。
长度由帧头计算得出 :
1)每帧的播放时间:无论帧长是多少,每帧的播放时间都是26ms;
2)数据帧大小: Size = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) /SamplingRate) + PaddingBit
例如: Bitrate = 128000, aSamplingRate =44100, and PaddingBit = 1
Size = (144 * 128000) / 44100 + 1 = 417 bytes
3.ID3V1
其数据结构如下:
charHeader[3];
charTitle[30];
charArtist[30];
charAlbum[30];
charYear[4];
charComment[28];
charreserve;
chartrack;
charGenre;
其实,关于最后31个字节还存在另外一个版本,就是30个字节的Comment和一个字节的Genre.
有了上述的这些信息,我们就可以自己写代码,从MP3文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
三.MP3编码与解码流程
MP3音频压缩包含编码和解码两个部分。编码是将WAV文件中的数据转换成高压缩率的位流形式,解码是接受位流并将其重建到WAV文件中。MP3采用了感知音频编码(Perceptual AudioCoding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。
MP3的解码总体上可分为9个过程:比特流分析,霍夫曼编码,逆量化处理,立体声处理,频谱重排列,抗锯齿处理,IMDCT变换,子带合成,PCM输出。
简要描述一下MP3的压缩流程:声音是一个模拟信号,对声音进行采样,量化,编码将得到PCM数据。PCM又称为脉冲调制数据,是计算机可以播放的最原始数据,也是mp3压缩的源,为了达到更大的数据压缩率,MPEG表针采用了子带编码技将PCM数据分成32个子带,每个子带都是独立编码的,然后将数据变换到频域下分析,MPEG采用的是改进的离散余弦变换,也可以使用傅里叶变换,再下来为了重建立体声进行了频域按特定规则的排列,随后立体声处理,处理后的数据按照协议定义进行量化。为了达到更大的压缩,再进行霍夫曼编码。最后将一些系数与主信息融合形成MP3文件。
解码是编码的反过程大概如下:
所谓比特流分解是指将mp3文件以二进制方式打开,然后根据其压缩格式的定义,依次从这个mp3文件中取出头信息,边信息,比例因子信息等。这些信息都是后面的解码过程中需要的。霍夫曼编码是一种无损压缩编码,属于熵编码[平均信息量编码(EntropyCoding)]。Mp3的解码可以通过公式实时进行数据的解码,但往往采用的是通过查表法实现解码(节省了CPU时间资源)。
MP3的技术亮点--MDCT (修正的离散余弦变换):
修正的离散余弦变换(MDCT)是指将一组时域数据转换成频域数据,以得知时域变化情况。MDCT是对DCT算法的改进。早期的快速算法是快速付立叶变换(FFT),但FFT有复数运算,MDCT都是实数运算,便于编程。
在 压缩音频数据时,先将原始声音数据分成固定的分块,然后做顺向MDCT(ForwardMDCT)将每块的值转换为512个MDCT系数,解压时,经反向MDCT(InverseMDCT)将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本身并不进行数据压缩,它只是把信号映射到另一个域,量化才使数据得到压缩。在对量化后的变换样值进行比特分配时要考虑使整个量化块最小,这就成为有损压缩了。
四、MP3文件的播放流程
一个完整MP3播放机要分几个部分:中央处理器、解码器、存储设备、主机通讯端口、音频DAC和功放、显示界面和控制键。其中中央处理器和解码器是整个系统的核心。这里的中央处理器我们通常称为MCU(单片微处理器),简称单片机。它运行MP3的整个控制程序,也称为fireware(或者固件程序)。控制MP3的各个部件的工作:从存储设备读取数据送到解码器解码;与主机连接时完成与主机的数据交换;接收控制按键的操作,显示系统运行状态等任务。解码器是芯片中的一个硬件模块,或者说是硬件解码(有的MP3播放机是软件解码,由高速中央处理器完成)。它可以直接完成各种格式MP3数据流的解码操作,并输出PCM或I2S格式的数字音频信号。
存储设备是MP3播放机的重要部分,通常的MP3随身听都是采用半导体存储器(FLASHMEMORY)或者硬盘(HDD)作为储存设备的。它通过接受储存主机通讯端口传来的数据(通常以文件形式),回放的时候MCU读取存储器中的数据并送到解码器。数据的存储是要有一定格式的,众所周知,PC管理磁盘数据是以文件形式,MP3也不例外,最常用的办法就是直接利用PC的文件系统来管理存储器,微软操作系统采用的是FAT文件系统,这也是最广泛使用的一种。播放机其中一个任务就是要实现FAT文件系统,即可以从FAT文件系统的磁盘中按文件名访问并读出其中的数据。
主机通讯端口是MP3播放机与PC机交换数据的途径,PC通过该端口操作MP3播放机存储设备中的数据,拷贝、删除、复制文件等操作。目前最广泛使用的是USB总线,并且遵循微软定义的大容量移动存储协议规范,将MP3播放机作为主机的一个移动存储设备。这里需要遵循几个规范:USB通信协议、大容量移动存储器规范和SCSI协议。
音频DAC是将数字音频信号转换成模拟音频信号,以推动耳机、功放等模拟音响设备。这里要介绍一下数字音频信号。数字音频信号是相对模拟音频信号来说的。我们知道声音的本质是波,人说能听到的声音的频率在20Hz到20kHz之间,称为声波。模拟信号对波的表示是连续的函数特性,基本的原理是不同频率和振幅的波叠加在一起。数字音频信号是对模拟信号的一种量化,典型方法是对时间坐标按相等的时间间隔做采样,对振幅做量化。单位时间内的采样次数称为采样频率。这样一段声波就可以被数字化后变成一串数值,每个数值对应相应抽样点的振幅值,按顺序将这些数字排列起来就是数字音频信号了。这是ADC(模拟-数字转换)过程,DAC(数字-模拟转换)过程相反,将连续的数字按采样时候的频率顺序转换成对应的电压。MP3解码器解码后的信息属于数字音频信号(数字音频信号有不同的格式,最常用的是PCM和I2S两种),需要通过DAC转换器变成模拟信号才能推动功放,被人耳所识别。
MP3播放机的显示设备通常采用LCD或者OLED等来显示系统的工作状态。控制键盘通常是按钮开关。键盘和显示设备合起来构成了MP3播放机的人机交互界面。
MP3播放机的软件结构跟硬件是相对应的,即每一个硬件部分都有相应的软件代码,这是因为大多数的硬件部分都是数字可编程控制的。
总结一下,最简化的MP3的工作原理我们可以概括如下:首先将MP3歌曲文件从内存中取出并读取存储器上的信号→到解码芯片对信号进行解码→通过数模转换器将解出来的数字信号转换成模拟信号→再把转换后的模拟音频放大→低通滤波后到耳机输出口,输出后就是我们所听到的音乐了。