wav数据分析-pcm-adpcm

一直想自己写个 能播放 WAV,MP3,MDI,OGG等格式的类库,但技术太差 总没写成功,先记录下 自己搜罗的资料

在用DirectSound播放wav声音文件时,能正常读取声音数据,但是发现不无法读取ADPCM的WAV文件,好像是要把ADPCM数据解码成PCM才行,但是用win api sndPlay()及DirectMusic可以直接播放,下面为WAV数据格式分析

/************************************************************************/
/*  PCM WAVE 文件大致结构
__________________________  字节数
| -RIFF WAVE Chunk-        | 
|   groupID  = 'RIFF'      | 4    //'R','I','F','F'
|   riff_szie              | 4
|   riffType = 'WAVE'      | 4    //'W','A','V','E'
|    __________________    | 
|   | -Format Chunk-   |   | 
|   | ckID = 'fmt '    |   | 4    //'f' 'm' 't' ' ' 
|   | size             |   | 4
|   | wFormatTag       |   | 2    //编码方式-一般为PCM=0x0001
|   | wChannels        |   | 2    //声道数目,1--单声道,2--双声道
|   | dwSamplesPerSec  |   | 4    //采样频率
|   | dwAvgBytesPerSec |   | 4    //每秒所需字节数
|   | wBlockAlign      |   | 2    // 数据块对齐单位
|   | wBitsPerSample   |   | 2    //每个采样需要的bit数
|   |__________________|   | 
|    __________________    | 
|   | -FACT Chunk-     |   | 
|   | ckID = 'fact'    |   | 4   //'f' 'a' 'c' 't'
|   | size             |   | 4
|   |__________________|   | 
|    __________________    | 
|   | -Data Chunk -    |   | 
|   | ckID = 'data'    |   | 4
|   | size             |   | 4
|   |__________________|   | 
|__________________________| 

*/
/************************************************************************/
//RIFF WAVE Chunk 文件格式标记
struct RIFF_HEADER
{
	char szRiff[4];       //'R','I','F','F'
	DWORD dwRiffSize;
	char szRiffFormat[4]; //'W','A','V','E'
};
struct WAVE_FORMAT//PCM WAV格式说明
{
	WORD  wFormatTag;          //编码方式-一般为PCM=0x0001,-------其他压缩编码如ADPCM 见后面说明
	WORD  wChannels;           //声道数目,1--单声道,2--双声道
	DWORD dwSamplesPerSec;     //采样频率
	DWORD dwAvgBytesPerSec;    //每秒所需字节数
	WORD  wBlockAlign;         // 数据块对其单位
	WORD  wBitsPerSample;      //每个采样需要的bit数
	//WORD  wAppend;           //附加信息(可选,通过Size来判断有无)PCM中忽略此值
};
//Format Chunk 
struct FMT_BLOCK
{
	char  szFmtID[4];          //'f' 'm' 't' ' ' 
	DWORD Size;                //数值为16或18,18则最后又附加信息
	WAVE_FORMAT wavFormat; 
};
//FACT Chunk 可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk
struct FACT_BLOCK
{
	char szFactID[4];         //'f' 'a' 'c' 't'
	DWORD dwFactSize;
};
//Data Chunk 
struct DATA_BLOCK
{
	char szDataID[4];         //'d' 'a' 't' 'a'
	DWORD dwDataSize;
};

/************************************************************************/
/*      ADPCM WAVE    http://tieba.baidu.com/f?kz=386282260
nSamplesPerSec x Channels       nBlockAlign 
                8k              256 
                11k             256 
                22k             512 
                44k             1024

typedef struct ADPCM_COED_TAG
{
int  nCoef1;
int  nCoef2;
}ADPCMCOEFSET;

typedef struct ADPCM_WAVEFORMAT_TAG
{
WAVE_FORMAT wfxx;
WORD wSamplesPerBlock;
WORD wNumCoef;
ADPCMCOEFSET aCoeff[wNumCoef];
}ADPCMWAVEFORMAT;

*/
/************************************************************************/


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值