一直想自己写个 能播放 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;
*/
/************************************************************************/