音频的压缩与播放.doc_第1页
音频的压缩与播放.doc_第2页
音频的压缩与播放.doc_第3页
音频的压缩与播放.doc_第4页
音频的压缩与播放.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

音频的压缩与播放作者:刘加成 班级:2008111 学号:20082387摘要:一、 音频的压缩adpcm压缩算法。1、Adpcm音频压缩算法简介2、Adpcm压缩源代码3、当今音频压缩格式简介二、音频的播放在VB中利用API函数实现媒体音频的播放。1) 使用对象链接与嵌入技术OLE(Object Linked and Embedded,目标链接与嵌入)。2) 使用 MCI(Media Control Interface, 媒体控制接口),MCI 是多媒体设备和多媒体应用软件之间进行与设备无关的沟通桥梁。3) 通过调用API函数实现媒体音频播放。Windows 的 API 函数按不同类别多达几千个, 其中有一组与多媒体相关的函数,使用 API 设计多媒体应用程序就是通过调用这一组函数来实现的。一、音频的压缩1、ADPCM(自适应差分PCM)类型:Audio 制定者:ITU-T 所需频宽:32Kbps 特性:ADPCM(adaptive difference pulse code modulation)综合了APCM的自适应特性和DPCM系统的差分特性,是一种性能比较好的波形编码。它的核心想法是: 利用自适应的思想改变量化阶的大小,即使用小的量化阶(step-size)去编码小的差值,使用大的量化阶去编码大的差值; 使用过去的样本值估算下一个输入样本的预测值,使实际样本值和预测值之间的差值总是最小。 优点:算法复杂度低,压缩比小(CD音质400kbps),编解码延时最短(相对其它技术) 缺点:声音质量一般 ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一种针对16bit (或者更高) 声音波形数据的一种有损压缩算法, 它将声音流中每次采样的 16bit 数据以 4bit 存储, 所以压缩比1:4. 而压缩/解压缩算法非常的简单, 所以是一种低空间消耗,高质量声音获得的好途径。8bits采样的声音人耳是可以勉强接受的,而 16bit 采样的声音可以算是高音质了。ADPCM 算法却可以将每次采样得到的 16bit 数据压缩到 4bit 。需要注意的是,如果要压缩/解压缩得是立体声信号,采样时,声音信号是放在一起的,需要将两个声道分别处理。2、adpcm音频压缩算法:#include #ifndef _STDC_#define signed#endifstruct adpcm_stateshort valprev; /* Previous output value */char index; /* Index into stepsize table */;/* Intel ADPCM step variation table */static int indexTable16 = -1, -1, -1, -1, 2, 4, 6, 8,-1, -1, -1, -1, 2, 4, 6, 8,;static int stepsizeTable89 = 7, 8, 9, 10, 11, 12, 13, 14, 16, 17,19, 21, 23, 25, 28, 31, 34, 37, 41, 45,50, 55, 60, 66, 73, 80, 88, 97, 107, 118,130, 143, 157, 173, 190, 209, 230, 253, 279, 307,337, 371, 408, 449, 494, 544, 598, 658, 724, 796,876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066,2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358,5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899,15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767;/*-adpcm_ecoder-*/voidadpcm_coder(indata, outdata, len, state)short indata;char outdata;int len;struct adpcm_state *state;short *inp; /* Input buffer pointer */signed char *outp; /* output buffer pointer */int val; /* Current input sample value */int sign; /* Current adpcm sign bit */int delta; /* Current adpcm output value */int diff; /* Difference between val and valprev */int step; /* Stepsize */int valpred; /* Predicted output value */int vpdiff; /* Current change to valpred */int index; /* Current step change index */int outputbuffer; /* place to keep previous 4-bit value */int bufferstep; /* toggle between outputbuffer/output */outp = (signed char *)outdata;inp = indata;valpred = state-valprev;index = state-index;step = stepsizeTableindex;bufferstep = 1;for ( ; len 0 ; len- ) val = *inp+;/* Step 1 - compute difference with previous value */diff = val - valpred;sign = (diff 3);if ( diff = step ) delta = 4;diff -= step;vpdiff += step;step = 1;if ( diff = step ) delta |= 2;diff -= step;vpdiff += step;step = 1;if ( diff = step ) delta |= 1;vpdiff += step;/* Step 3 - Update previous value */if ( sign )valpred -= vpdiff;elsevalpred += vpdiff;/* Step 4 - Clamp previous value to 16 bits */if ( valpred 32767 )valpred = 32767;else if ( valpred -32768 )valpred = -32768;/* Step 5 - Assemble value, update index and step values */delta |= sign;index += indexTabledelta;if ( index 88 ) index = 88;step = stepsizeTableindex;/* Step 6 - Output value */if ( bufferstep ) outputbuffer = (delta valprev = valpred;state-index = index;/*-adpcm_decoder-*/voidadpcm_decoder(indata, outdata, len, state)char indata;short outdata;int len;struct adpcm_state *state;signed char *inp; /* Input buffer pointer */short *outp; /* output buffer pointer */int sign; /* Current adpcm sign bit */int delta; /* Current adpcm output value */int step; /* Stepsize */int valpred; /* Predicted value */int vpdiff; /* Current change to valpred */int index; /* Current step change index */int inputbuffer; /* place to keep next 4-bit value */int bufferstep; /* toggle between inputbuffer/input */outp = outdata;inp = (signed char *)indata;valpred = state-valprev;index = state-index;step = stepsizeTableindex;bufferstep = 0;for ( ; len 0 ; len- ) /* Step 1 - get the delta value */if ( bufferstep ) delta = inputbuffer & 0xf; else inputbuffer = *inp+;delta = (inputbuffer 4) & 0xf;bufferstep = !bufferstep;/* Step 2 - Find new index value (for later) */index += indexTabledelta;if ( index 88 ) index = 88;/* Step 3 - Separate sign and magnitude */sign = delta & 8;delta = delta & 7;/* Step 4 - Compute difference and new predicted value */* Computes vpdiff = (delta+0.5)*step/4, but see comment* in adpcm_coder.*/vpdiff = step 3;if ( delta & 4 ) vpdiff += step;if ( delta & 2 ) vpdiff += step1;if ( delta & 1 ) vpdiff += step2;if ( sign )valpred -= vpdiff;elsevalpred += vpdiff;/* Step 5 - clamp output value */if ( valpred 32767 )valpred = 32767;else if ( valpred valprev = valpred;state-index = index;基本信息:Adpcm是自适应差分脉冲编码调制的简称,最早使用于数字通信系统中。该算法利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用了自适应预测和自适应量化,在32kbps8khz速率上能够给出网络等级话音质量。现在我们使用的是IMA ADPCM算法,该算法中对量化步长的调整使用了简单的映射方法,对于一个输入的PCM值X(n),将其与前一时刻的X(n-1)预测值做差值 得到d(n),然后根据当前的量化步长对d(n)进行编码,再用此sample点的编码值调整量化步长,同时还要得到当前sample点的预测值供下一sample点编码使用。通过此算法可将样点编码成4bit的码流,一个符号位和三个幅度位。该算法较简单,通过映射简化了运算。对于编码后的数据我们采用了wav文件格式,该格式对编码后的数据流进行了包装,由文件头和数据码流组成,文件头中指出了音频数据所采用格式、采样率、比特率、块长度、比特数及声道数等信息。数据码流以块为单位,块头指出了该块起始的预测值和index值,码流中每byte的高四位和低四位分别对应一个PCM。当前该算法以其简单实用的特点广泛应用到数字音乐盒和数字录音笔中。 3、音频压缩格式一览:经典的WAVE:WAVE文件作为最经典的Windows多媒体音频格式,应用非常广泛,它使用三个参数来表示声音:采样位数、采样频率和声道数。 声道有单声道和立体声之分,采样频率一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种。WAVE文件所占容量=(采样频率采样位数声道)时间/8(1字节=8bit)。 传统的MOD:MOD是一种类似波表的音乐格式,但它的结构却类似 MIDI,使用真实采样,体积很小,在以前的DOS年代,MOD经常被作为游戏的背景音乐。现在的MOD可以包含很多音轨,而且格式众多,如S3M、NST、669、MTM、XM、IT、XT和RT等。 电脑音乐MIDI:MIDI是Musical Instrument Data Interface的简称,它采用数字方式对乐器所奏出来的声音进行记录(每个音符记录为一个数字),然后,播放时再对这些记录通过FM或波表合成:FM合成是通过多个频率的声音混合来模拟乐器的声音;波表合成是将乐器的声音样本存储在声卡波形表中,播放时从波形表中取出产生声音。 龙头老大MP3:MP3可谓是大名鼎鼎,它采用MPEG Audio Layer 3 技术,将声音用 110 甚至 112 的压缩率压缩,采样率为44kHz、比特率为112kbit/s。 MP3音乐是以数字方式储存的音乐,如果要播放,就必须有相应的数字解码播放系统,一般通过专门的软件进行MP3数字音乐的解码,再还原成波形声音信号播放输出,这种软件就称为MP3播放器,如Winamp等。 网上霸主RA系列 RA、RAM和RM都是Real公司成熟的网络音频格式,采用了“音频流”技术,所以非常适合网络广播。在制作时可以加入版权、演唱者、制作者、Mail 和歌曲的Title等信息。 RA可以称为互联网上多媒体传播的霸主,适合于网络上进行实时播放,是目前在线收听网络音乐最好的一种格式。 高压缩比的VQF:VQF即TwinVQ是由Nippon Telegraph and Telephone同YAMAHA公司开发的一种音频压缩技术。 VQF的音频压缩率比标准的MPEG音频压缩率高出近一倍,可以达到118左右甚至更高。而像MP3、RA这些广为流行的压缩格式一般只有112左右。但仍然不会影响音质,当VQF以44kHz-80kbit/s的音频采样率压缩音乐时,它的音质会优于44kHz-128kbit/s的MP3,以44kHz-96kbit/s压缩时,音乐接近44kHz-256kbit/s的MP3。 迷你光盘MD:MD(即MiniDisc)是SONY公司于1992年推出的一种完整的便携音乐格式,它所采用的压缩算法就是ATRAC技术(压缩比是15)。MD又分为可录型MD(Recordable,有磁头和激光头两个头)和单放型MD(Pre-recorded,只有激光头)。 强大的编辑功能是MD的强项,可以快速选曲、曲目移动、合并、分割、删除和曲名编辑等多项功能,比CD更具个性化,随时可以拥有一张属于自己的MD专辑。MD的产品包括MD随身听、MD床头音响、MD汽车音响、MD录音卡座、MD摄像枪和MD驱动器等。 音乐CD:即CD唱片,一张CD可以播放74分钟左右的声音文件,Windows系统中自带了一个CD播放机,另外多数声卡所附带的软件都提供了CD播放功能,甚至有一些光驱脱离电脑,只要接通电源就可以作为一个独立的CD播放机使用。 潜力无限的WMA 微软在开发自己的网络多媒体服务平台上主推ASF(Audio Steaming format),这是一个开放支持在各种各样的网络和协议上的数据传输的标准。它支持音频、视频以及其他一系列的多媒体类型。而WMA是Windows Media Audio的缩写,相当于只包含音频的ASF文件。 WMA文件在80kbps、44kHz的模式下压缩比可达118,基本上和VQF相同。而且压缩速度比MP3提高一倍。所以它应该比VQF更具有竞争力。 免费音乐格式Vorbis 为了防止MP3音乐公司收取的专利费用上升,GMGI的iCast公司的程序员开发了一种新的免费音乐格式Vorbis,其音质可以与MP3相媲美,甚至优于MP3。并且将通过网络发布,可以免费自由下载,不必担心会涉及侵权问题。但MP3在网上已经非常流行,微软的Windows Media技术也开始普及,Vorbis的前景还是不容乐观。 其它音频格式:AIF/AIFF:苹果公司开发的一种声音文件格式,支持MAC平台,支持16位44.1kHz立体声。 AU:SUN的AU压缩声音文件格式,只支持8位的声音,,是互连网上常用到的声音文件格式,多由SUN工作站创建。 CDA:CD音轨文件。 CMF:CREATIVE 公司开发的一种类似MIDI的声音文件。 DSP:Digital Signal Processing(数字信号处理)的简称。通过提高信号处理方法,音质会极大地改善,歌曲会更悦耳动听。 二、音频的播放在VB中利用API函数实现媒体音频的播放:在多媒体程序设计中,音频的加入使程序变得“有声有色”。而多媒体中,音频是最基本的形式,信息量大而且以不同格式保存在文件中。这些信息的表达方式和输入、输出的要求也各不相同。用Visual Basic编制这类程序时,关键是对多媒体设备的控制和使用。在VB中实现对音频媒体设备的控制主要有三种方法:1) 使用对象链接与嵌入技术OLE(Object Linked and Embedded,目标链接与嵌入)。2) 使用 MCI(Media Control Interface, 媒体控制接口),MCI 是多媒体设备和多媒体应用软件之间进行与设备无关的沟通桥梁。3) 通过调用API函数实现媒体音频播放。Windows 的 API 函数按不同类别多达几千个, 其中有一组与多媒体相关的函数,使用 API 设计多媒体应用程序就是通过调用这一组函数来实现的。在VB中利用API函数设计一个CD播放播放器。这个播放器的界面如图。本播放器用到两个API函数MciSendString() MciGetErrorString();使用API函数必须首先进行声明,用户可以自己输入API函数的声明,但是由于API函数比较复杂,自己声明容易出错,VB提供了一种更简单的方法,就是使用API浏览器工具。从开始菜单选择“开始/程序/MicrosoftVisualBasic6.0中文版/MicrosoftVisualBasic6.0中文版工具/API文本浏览器”,从而运行API文本浏览器,在菜单拦的“文件”选项下选择“加载文本文件(I)”,打开Win32api.txt,选择Declares(声明),找到所需函数并选中,单击Add(添加)按钮,再单击Copy(复制)按钮,然后将其粘贴到工程里即可,这样做方便而且不容易出错3。它们声明如下:Declare Function mciSendString Lib winmm.dll Alias mciSendStringA (ByVal lpstrCommand As String, ByVallpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long功能是传送文字信息给应用程序。参数lpstrReturnString指向接收文字信息的缓冲区,uReturnLength表示缓冲区的大小,hwndCallback是与信息有关的句柄,它设为0,若函数执行出错,则返回一非0错误代码,可将错误代码交给mciGetErrorString()处理。Declare Function mciGetErrorString Lib winmm.dll Alias mciGetErrorStringA (ByVal dwError As Long, ByVal lpstrBufferAs String, ByVal uLength As Long) As Long功能用来解释MCI错误代码的含义,参数dwError错误代码,来自mciSendString函数的返回值,lpstrBuffer描述错误字符串,uLength是参数lpstrBuffer的字符串长度,若函数调用成功,则返回非0,否则返回0值。使用MciSendString() MciGetErrorString()函数进行播放CD的主要源代码。Dim S As StringS = String(256, Chr(0)mciSendString status cdaudio number of tracks, S, Len(S), 0ret = mciSendString(open cdaudia alias CD, 0&, 0, 0) 初始化驱动mciSendString play CD from & Left(S, 8), 0&, 0, 0 播放音轨mciGetErrorString ret, S, Len(S) 显示错误代码mciSendString stop CD, 0&, 0, 0 停止mciSendString close CD, 0&, 0, 0 关闭Dim CurTrack As IntegermciSendString status CD current track, S, Len(S), 0CurTrack = Val(S)If CurTrack 1 ThenmciSendString status CD position track & CurTrack-1, S, Len(S), 0mciSendString play CD from & Left(S, 8), 0&, 0, 0 播放上一曲End IfIf CurTrack Tracks ThenmciSendString status CD position track & CurTrack + 1, S, Len(S), 0mciSendString play CD from & Left(S, 8), 0&, 0, 0 播放下一曲End IfEnd SubAPI函数虽然使用起来比较复杂,但有其独特的优势:使用MCI开发多媒体程序虽然简单、快捷、方便,但在实际程序设计中, 常会碰到一些利用MCI不好解决的问题, 例如, 有些语言就不包含语音支持、I/O 端口访问以及位图操作,此时就要通过调用API 函数来实现,它对媒体的控制比MCI更加全面、灵活;OLE的特点是简单方便,不必了解MCI、API 等内容就能使用音像媒体,但是,其运行环境一般涉及多个应用软件,系统环境维护较复杂,而且频繁的磁盘访问降低了整个软件的运行效率1。因此,想使用VB本身的函数那样方便实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论