分类: 嵌入式
2013-05-22 16:42:53
AGENDA
* MP3简介
* MP3文件结构
——Tag_v2(ID3v2)标签帧
——数据帧
——Tag_v1(ID3v1)标签帧
*MP3编解码流程
*MP3文件的播放流程
一、MP3简介:
MP3全称MPEG 1 audio layer 3,其中MPEG(Moving Picture Experts Group)标准包括视频和音频
标准,其中音频标准已制定出 MPEG-1、MPEG-2、MPEG-2 AAC和MPEG-4。
MPEG-1和MPEG-2标准使用同一个音频编码解码族—— Layer1、Layer 2、Layer3。 它根据压缩质量
和编码复杂程度进行划分的,分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层
次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高
MPEG-2一个新特点是采用低采样率扩展降低数据流量,另一特点是多通道扩展,将主声道增加为5个。
MPEG Audio Layer 1、Layer2、Layer3三个层使用相同的滤波器组、位流结构和头信息,采样频率为
32KHz、44.1KHz、48KHz。
Layer 1是为数字压缩磁带DCC(Digital Compact Cassette)设计的,数据流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还使用了与MPEG Video
类似的平均信息量编码(Entropy Coding),减少了冗余信息。MP3绝大部分使用的是MPEG-1标准。
MP3的音频质量取决于它的Bitrate和Sampling frequency,以及编码器质量。MP3的典型速度介于
每秒128到320kb之间(此处有问题)。采样频率也有32,44.1,48 kHz三种频率,比较常见的是采用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]; /* 字符串 "ID3" */
char Ver; /* 版本号ID3V2.3 就记录3 */
char Revision; /* 副版本号此版本记录为0 */
char Flag; /* 存放标志的字节,这个版本只定义了三位,很少用到,可以忽略 */
char Size[4]; /* 标签大小,除了标签头的10 个字节的标签帧的大小 */标签大小为四个字节,但每个字节只用低7位,最高位不使用,恒为0,其格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
——标签帧
每个标签帧都有一个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表示所使用的语言
帧大小为四个字节所表示的整数大小。
2.数据帧
数据帧往往有多个,至于有多少,由文件大小和帧大小来决定。每个帧 都有一个帧头HEADER,长度是4BYTE(32bit),帧头后面可能有两个字节的CRC 校验,这两个字节的是否存在决定于HEADER 信息的第16bit, 为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,紧跟在HEADER 后面,接着就是帧的实体数据 ,也就是MAIN_DATA了,格式如下:
HEADER
CRC(free)
MAIN_DATA
4 BYTE
0 OR 2 BYTE
----帧头HEADER的详细结构为:
-----MAIN_DATA:
MAIN_DATA 部分长度是否变化决定于HEADER 的bitrate是否变化,一首MP3 歌曲,它有三个版本:96Kbps(96 千比特位每秒)、128Kbps 和192Kbps。Kbps (比特位速率), 表明了音乐每秒的数据量,Kbps 值越高,音质越好,文件也越大,MP3标准规定,不变的bitrate 的MP3 文件称作CBR,大多数MP3 文件都是CBR 的,而变化的bitrate 的MP3 文件称作VBR, 每个 的长度都可能是变化的。
———— C,LAME标签帧
当你真的打开一个MP3文件的时候,你会发现第一帧并不是真正的数据帧,而是LAME编码的标志帧。
这里牵涉到两个概念:CBR和VBR。它还存放了MP3文件里帧的总个数,和100个字节的播放总时间分段的帧的INDEX,还有其他一些参数;
1)CBR:表示比特率不变,也就是每帧的长度是一致的,它以字符串“INFO”为标记。只要知道文件总长度
和帧长,即可由播放每帧需26ms 计算得出mp3 播放的总时间,也可通过计数帧的个数控制快进、快退
慢放等操作。
2)VBR:VBR是 Variable BitRate的简称,也就是每帧的比特率和帧的长度是变化的,是XING 公司推出的
算法,所以在MP3 的 里会有“XING"这个关键字(现在很多流行的小软件也可以进行VBR 压缩,它们
是否遵守这个约定,那就不得而知了),它存放在MP3 文件中的第一个有效帧里,它标识了这个MP3
文件是VBR 的。同时第一个 里存放了MP3 文件的 帧的总个数,这就很容易获得了播放总时间,同时
还有100 个字节存放了播放总时间的100 个时间分段的帧的INDEX,假设4 分钟的MP3 歌曲,
240S, 分成100 段,每两个相邻INDEX 的时间差就是2.4S, 所以通过这个INDEX,只要前后处理少
数的,就能快速找出我们需要快进的 头。除了INDEX,还有其他的一些参数,这被称为Zone A,传统
Xing VBR标签数据,共120个字节。 在二进制文本编辑器里我们还可看到一个字符串“LAME”,并且
后面清楚地跟着版本号。这就是20个字节的Zone B初始LAME信息,表示该文件是用LAME编码技术。
接下来一直到该帧结束就是Zone C-LAME标签。
长度由帧头计算得出 :
1)每帧的播放时间:无论帧长是多少,每帧的播放时间都是26ms;
2)数据帧大小:
Size = (((MpegVersion == MPEG1 ? 144 : 72) * Bitrate) / SamplingRate) + PaddingBit
例如: Bitrate = 128000, a SamplingRate =44100, and PaddingBit = 1
Size = (144 * 128000) / 44100 + 1 = 417 bytes
3.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文件中抓取信息以及修改文件名了。但是,如果真的想写一个播放软件,还是需要读它的数据帧,并进行解码。
三.MP3编码与解码流程
MP3音频压缩包含编码和解码两个部分。编码是将WAV文件中的数据转换成高压缩率的位流形式,解码是接受位流并将其重建到WAV文件中。MP3 采用了感知音频编码(Perceptual Audio Coding)这一失真算法。人耳感受声音的频率范围是20Hz-20kHz,MP3截掉了大量的冗余信号和无关的信号,编码器通过混合滤波器组将原始声 音变换到频率域,利用心理声学模型,估算刚好能被察觉到的噪声水平,再经过量化,转换成Huffman编码,形成MP3位流。解码器要简单得多,它的任务 是从编码后的谱线成分中,经过反量化和逆变换,提取出声音信号。
MP3的解码总体上可分为9个过程:比特流分析,霍夫曼编码,逆量化处理,立体声处理,频谱重排列,抗锯齿处理,IMDCT变换,子带合成,PCM输出。
简要描述一下MP3的压缩流程:声音是一个模拟信号,对声音进行采样,量化,编码将得到PCM数据。PCM又称为脉冲调制数据,是计算机可以播放的最原始数据,也是mp3压缩的源,为了达到更大的数据压缩率,MPEG表针采用了子带编码技将PCM数据分成32个子带,每个子带都是独立编码的,然后将数据变换到频域下分析,MPEG采用的是改进的离散余弦变换,也可以使用傅里叶变换,再下来为了重建立体声进行了频域按特定规则的排列,随后立体声处理,处理后的数据按照协议定义进行量化。为了达到更大的压缩,再进行霍夫曼编码。最后将一些系数与主信息融合形成MP3文件。
解码是编码的反过程大概如下:
所谓比特流分解是指将mp3文件以二进制方式打开,然后根据其压缩格式的定义,依次从这个mp3文件中取出头信息,边信息,比例因子信息等。这些信息都是后面的解码过程中需要的。霍夫曼编码是一种无损压缩编码,属于熵编码[平均信息量编码(Entropy Coding)]。Mp3的解码可以通过公式实时进行数据的解码,但往往采用的是通过查表法实现解码(节省了CPU时间资源)。
MP3的技术亮点--MDCT (修正的离散余弦变换):
修正的离散余弦变换(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本身并不进行数据压缩,它只是把信号映射到另一个域,量化才使数据得到压缩。在对量化后的变换样值进行比特分配时要考虑使整个量化块最小,这就成为有损压缩了。
四、MP3文件的播放流程
一个完整MP3播放机要分几个部分:中央处理器、解码器、存储设备、主机通讯端口、音频DAC和功放、显示界面和控制键。其中中央处理器和解码器是整个系统的核心。这里的中央处理器我们通常称为MCU(单片微处理器),简称单片机。它运行MP3的整个控制程序,也称为fireware(或者固件程序)。控制MP3的各个部件的工作:从存储设备读取数据送到解码器解码;与主机连接时完成与主机的数据交换;接收控制按键的操作,显示系统运行状态等任务。解码器是芯片中的一个硬件模块,或者说是硬件解码(有的MP3播放机是软件解码,由高速中央处理器完成)。它可以直接完成各种格式MP3数据流的解码操作,并输出PCM或I2S格式的数字音频信号。
存储设备是MP3播放机的重要部分,通常的MP3随身听都是采用半导体存储器(FLASH MEMORY)或者硬盘(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歌曲文件从内存中取出并读取存储器上的信号→到解码芯片对信号进行解码→通过数模转换器将解出来的数字信号转换成模拟信号→再把转换后的模拟音频放大→低通滤波后到耳机输出口,输出后就是我们所听到的音乐了。