基于Matlab的MP3播放器1.概述MP3的全称为MPEG1(MovingPictureExpertsGroup)Layer–3音频文件。它根据压缩质量和编码复杂程度划为三层,Layer–1、Layer–2、Layer–3,且分别对应MP1、MP2\MP3这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG音频的层次越高,编码器越复杂,压缩率也越高,MP3的压缩率则高达10:1–12:1。MATLAB是国际上公认的最优秀的科技应用软件,它在数据分析和处理功能都是很强大,利用它可以灵活方便地处理音频信号。本文将使用matlab对MP3进行解码,做一个简易的MP3播放器。2.MP3文件格式MP3文件大体分为三部分:TAG_V2(ID3V2),frame,TAG_V1(ID3V1)ID3V2包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量Frame一系列的帧,个数由文件大小和帧长决定每个FRAME的长度可能不固定,由位率bitrate决定每个FRAME又分为帧头和数据实体两部分帧头记录了mp3的位率,采样率版本等信息,每个帧之间相互独立ID3V1包含了作者,作曲,专辑等信息,长度为128BYTE一个MPEG音频文件是许多的称为帧的较小部分组成的,通常,帧是独立的组成部分,每个帧都拥有之间的头和音频信息,没有文件头。所以我们可以剪切MPEG文件的任何部分并且能够正常播放。但在LayerIII中就并不总是正确的。2.1、帧头格式下面是一个头内容图示,使用字符A到M表示不同的区域AAAAAAAAAAABBCCDEEEEFFGHIIJJKLMMA表示帧同步,都为1,长度为11;B表示MPEG音频版本ID(00–MPEG2.5;01–保留;10–MPEG2;11–MPEG1);C表示Layer描述,(00–保留;01-LayerIII;10–LayerII;11-LayerI);D表示校验位(0有跟16位CRC校验位;1无校验位);E位率索引,长度为4,对不同的版本,不同层索引值表示不同的位率;单位KbitMPEG1LayerIMPEG1LayerIIMPEG1LayerIIIMPEG2,2.5LayerILayerII&LayerIII0000FREE000132323232800106448404816001196564856240100128645664320101160806480400110192968096480111224112961125610002561281121286410012881601281448010103201921601609610113522241921761121100384256224192128110141632025622414411104483843202561601111F采样频率,单位:HzBitsMPEG1MPEG2MPEG2.50044100220501102501480002400012000103200016000800011保留G填充位(0–无填充;1–额外的填充)H私有bit,用做特殊应用I声道(00–立体声;01–联合立体声;10–双声道;11–单声道);J扩展模式,仅在联合立体声有效K版权(0–无版权;1–有版权);L原创(0–拷贝;1–原创);M强调(00–无;01–50/15ms;10–保留;11–CCITJ.17);2、2CRC校验如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以知道该帧是否有效。2、3帧数据在帧头后边是SideInfo(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。通道信息后面是Scalefactor(增益因子)信息。当解码器在读到上述信息后,就可以进行解码了。当MP3文件被打开后,播放器首先试图对帧进行同步,然后分别读取通道信息及增益因子等数据,再进行霍夫曼解码,至此我们已经获得解压后的数据。但这些数据仍然不能进行播放,它们还处于频域,要想听到歌曲还要将它由频域通过特定的手段转换到时域。接下来的处理分别为立体化处理;抗锯齿处理;IMDCT变换;IDCT变换及窗口化滑动处理。2、4ID3v1ID3v1标签用来描述MPEG音频文件。包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。结构如下:AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFG符号长度(bytes)位置(bytes)描述A30–2标签标志,‘TAG’B303–32标题C3033–62艺术家D3063–92唱片集E493–96年代F3097–126注释G1127流派2、5ID3v2每个ID3V2.3的标签都一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。ID3V2的操作比ID3V1要慢。而且ID3V2结构比ID3V1的结构要复杂得多,但比前者全面且可以伸缩和扩展。2、6lame编码器LAME是最好的MP3编码器,编码高品质MP3的最好也是唯一的选择。LAME本身是DOS下的文件,需要加外壳程序才比较容易使用,也可以在别的软件(比如EAC)中间调用。是一款出色的MP3压缩程序,它使用了独创的人体听音心理学模型和声学模型,改变了人们对MP3高音发哑、低音发破的音质的印象。LAME分DLL和EXE两种版本,DLL版本做为一个方便的接口程序在大多数抓轨软件中都能看到(比如AltoMP3Maker),但由于可控性差,与具备丰富调节参数的EXE版相比,其压缩出来的MP3效果稍逊一筹。VBR(VariableBitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方式,推荐编码模式;ABR(AverageBitrate)平均比特率,是VBR的一种插值参数。LAME针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR在指定的文件大小内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量,可以做为VBR和CBR的一种折衷选择。CBR(ConstantBitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,而且音质相对于VBR和ABR不会有明显的提高。本文将使用lameexe作为mp3的编解码器。3.Matlab声音播放MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平Matlab语言本身就是一种对线性系统进行分析和仿真的方便工具,他特别适用于对电子系统进行计算机仿真。其对声音处理主要有以下几个函数:Sound函数,播放声音,格式如下:Sound(y,fs)或sound(y)或sound(y,fs,bits)Wavwrite函数,将声音数据按指定格式存入wav文件中,格式如下:Wavwrite(k,fs,nbits,file)Wavread函数,从wav文件中读取声音信号,格式如下:[y,fs]=Wavread(file)6.0以上版本提供更好的声音处理函数;Audioplayer函数,用来播放wav文件,可以暂停,停止,格式如下:Y=audioplayer(y,fs,nbits)Y=audioplayer(y,fs)Y必须定义成全局函数,它是一个audioplayer对象。Matlab并没有mp3播放函数,因此要自己写M函数来播放mp3文件,函数如下:[Y,FS,NBITS,OPTS]=mp3read(FILE,N,MONO,DOWNSAMP,DELAY)FILE表示mp3文件名;N表示读到第N个采样帧,若N为[n1,n2],则表示从n1到n2;MONO表示读文件的通道:1表示单声道,0表示立体声DOWNSAMP表示采样频率,默认为1,若为2或4,则FS为22050或11025DELAY是为了适应mpg123-0.59,控制开始读文件的延迟时间,在1.9版本以后就不需要,默认为0;Y表示读出的数据FS采样频率NBITS采样位数OPTS可选项4.流程图5.运行结果运行环境:windows7,cpuinteli32.4G主频,内存2G。本人在另一台机子上(windowsxp,cpuintelCeleron3.2G主频,1G内存)运行,速度有点慢,因为播放的mp3文件比较大,在matlab上运行速度不快。5、1主界面:5、2功能如下:播放列表,可以添加(open),删除(delete)mp3文件.显示格式为:艺术家–音乐名。添加时只能一个个添加,但删除可以批量删除,这跟open中uigetfile有关系。播放(play)mp3文件,暂停(pause),停止(stop),若mp3未播放,使用暂停,停止,将有错误提示。和普通的mp3播放器一样,要先等该文件播放完才播放下个文件,或按stop再选择播放列表想要播放的文件,再按play。关闭(close),将清空列表,关闭mp3播放器。音量控制(volume),因为其值最大为1,所以只能减小音量,不能对其原声音进行放大。另一方面,其声音控制并不是以中断的方式进行的,所以,只能等该文件播放完后,进行下个声音播放时,才能显现出声音的控制。音频信息(Info),对播放的音频信息进行显示,要先等到音乐全都加载完才能显示。5、3结果分析从功能上基本实现mp3的播放,能够暂停,停止,有播放列表,选择播放,但仍然存在一些bug和一些需要改进的地方,总结如下:首先,关于播放列表在第一次增加和删除,没问题,在第一次完全清空后,再增加一个文件,就会出现第一行为空,文件从第二行开始添加,若删除第一个没问题,若删除第二个就会出现警告。Warning:multi-selectionlistboxcontrolrequiresthatValuebeanintegerwithinStringrangeControlwillnotberendereduntilallofitsparametervaluesarevalid.其次,matlab的多线程能力比较差,本人有考虑使用timer定时器来实现一些功能,但效果不佳,不知道问题出现在哪里。使用定时器就可以实现音量的随时改变,还有播放时间显示,甚至可以控制播放的进程,这是个很大的问题。在网上,书上,定时器的例子都比较少,看不出个所以然。接着,不能实现播放完该文件顺序播放下个文件,不够人性化。当数据读入,正在播放中,关闭播放器,界面没有了,但仍在播放。要先按close才能实现真正的关闭。最后是速度慢,对一首《夜曲》进行分析,歌曲时间长度为4:24,数据量为11638784*2,要花3.6秒的时间,这是不能接受的。并可以得到以下mp3信息:位率为128KHz;版本为1;层数为III;声道模式为联合立体声;采样位数为16位;时间可以计算出来。但其并不能读出ID3V1和ID3V2的一些信息。[m,n]=size(X);dt=1/SampleRate;t=(0:m-1)*dt;TimeTota