欢迎来到天天文库
浏览记录
ID:40805379
大小:97.50 KB
页数:9页
时间:2019-08-07
《ADPCM格式说明》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ADPCMWAVE文件的压缩与解压缩[原创]分类: 程序设计:经典算法与技术赏析2005-10-1321:15 8342人阅读 评论(8) 收藏 举报一、概述: 本文叙述了如何通过IMA-ADPCM压缩和解压缩算法来完成从IMA-ADPCM文件转换为PCM文件的过程。主要包括的内容有:PCM和IMA-ADPCM WAVE文件内部结构的介绍,IMA-ADPCM压缩与解压缩算法,以及如何生成特有的音频压缩格式文件等三方面的内容。二、WAVE文件的认识 WAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Wa
2、veformAudio),由于其扩展名为"*.wav"。wave文件有很多不同的压缩格式,而且现在一些程序生成的wave文件都或多或少地含有一些错误。这些错误的产生不是因为单个数据压缩和解压缩算法的问题,而是因为在压缩和解压缩后没有正确地组织好文件的内部结构。所以,正确而详细地了解各种WAVE文件的内部结构是成功完成压缩和解压缩的基础,也是生成特有音频压缩格式文件的前提。最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成
3、PCM格式,然后再让声卡来播放。1.Wave文件的内部结构 WAVE文件是以RIFF(ResourceInterchangeFileFormat,"资源交互文件格式")格式来组织内部结构的。RIFF文件结构可以看作是树状结构,其基本构成是称为"块"(Chunk)的单元,最顶端是一个“RIFF”块,下面的每个块有“类型块标识(可选)”、“标志符”、“数据大小”及“数据”等项所组成,块的结构如表1所示: 上面说到的“类型块标识”只在部分chunk中用到,如“WAVE”chunk中,这时表示下面嵌套有别的chunk,当使用了“类型块标识”时,该c
4、hunk就没有别的项(如块标志符,数据大小等),它只作为文件读取时的一个标识。先找到这个“类型块标识”,再以它为起来读取它下面嵌套的其它chunk。每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从表2中可以看出它的结构:非PCM格式的文件会至少多加入一个“fact”块,它用来记录数据解压缩后的大小。(注意是数据而不是文件)这个“fact”块一般加在“data”块的前面。 2.WAVEFORMAT结构的认识PCM和非PCM的主要区别是声音数据的组织不同,这些区别可以通过两者的WAVEFORMAT结构来区分。下面以PCM和IMA-ADPCM来进行对比
5、:WAVE的基本结构WAVEFORMATEX结构定义如下:typedefstruct{WORDwFormatag; //编码格式,包括WAVE_FORMAT_PCM,//WAVEFORMAT_ADPCM等WORD nChannls; //声道数,单声道为1,双声道为2;DWORDnSamplesPerSec;//采样频率;DWORDnAvgBytesperSec;//每秒的数据量;WORD nBlockAlign;//块对齐;WORD wBitsPerSample;//WAVE文件的采样大小;WORD sbSize; //PC
6、M中忽略此值}WAVEFORMATEX; PCM的结构就是基本结构; IMAADPCMWAVEFORMAT结构定义如下:Typedefstruct{ WAVEFORMATEXwfmt; WORDnSamplesPerBlock;}IMAADPCMWAVEFORMAT; IMA-ADPCM的wfmt->cbsize不能忽略,一般取值为2,表示此类型的WAVEFORMAT比一般的WAVEFORMAT多出2个字节。这两个字符也就是nSamplesPerBlock。 3.“fact”chunk的内部组织 在非PCM格式的文件中,一般会在WAVEFORMAT结
7、构后面加入一个“fact”chunk,结构如下:typedefstruct{ char[4]; //“fact”字符串 DWORDchunksize; DWORDdatafactsize; //数据转换为PCM格式后的大小。}factchunk;datafactsize是这个chunk中最重要的数据,如果这是某种压缩格式的声音文件,那么从这里就可以知道他解压缩后的大小。对于解压时的计算会有很大的好处! 4.“data”chunk的内部组织从“data”chunk的第9个字节开始,存储的就是声音信息的数据了,(
8、前八个字节存储的是标志符
此文档下载收益归作者所有