www.pudn.com > ReadAudio.rar > audioTest.cpp
#include#include #include //注意包含该文件,以及文件顺序,原因不清楚 //#include struct RIFF_HEADER { char szRiffID[4]; // 'R','I','F','F' DWORD dwRiffSize; char szRiffFormat[4]; // 'W','A','V','E' };//wav头格式定义,12字节,第一个chunk struct WAVE_FORMAT { WORD wFormatTag; WORD wChannels; DWORD dwSamplesPerSec; DWORD dwAvgBytesPerSec; WORD wBlockAlign; WORD wBitsPerSample; };//第二chunk的一个结构 struct FMT_BLOCK { char szFmtID[4]; // 'f','m','t',' ' DWORD dwFmtSize; WAVE_FORMAT wavFormat; };//第二个chunk /*对比于windows定义的(定义在Mmsystem.h中) 多了char 和 DWORD共八个字节,而且PCMWAVEFORMAT结构将WAVE_FORMAT的 wBitsPerSample单独为第二个元素,其他的作为另外一个WAVEFORMAT,详见Mmsystem.h*/ struct FACT_BLOCK { char szFactID[4]; // 'f','a','c','t' DWORD dwFactSize; DWORD data; };//第三个chunk,该结构信息不是每个wav均有,只有为其他格式转换为wav的具有该结构 struct DATA_BLOCK { char szDataID[4]; // 'd','a','t','a' DWORD dwDataSize; };//实际数据开始部分(数据头) int main() { FILE *fp; //格式大小,非转换文件28字节后为真正数据 printf("%d,%d,,%d,%d\n",sizeof(RIFF_HEADER),sizeof(WAVE_FORMAT),sizeof(FMT_BLOCK),sizeof(FACT_BLOCK)); fp=fopen("fact.wav","rb"); if(fp==NULL) { printf("Open file failure!\n"); } else printf("Now open the audio file!\n"); //读取第一个chunk RIFF_HEADER filehead; fread(&filehead,1,sizeof(RIFF_HEADER),fp); if(filehead.szRiffID[0]!='R'||filehead.szRiffID[1]!='I'||filehead.szRiffID[2]!='F'||filehead.szRiffID[3]!='F') {//是否为RIFF printf("Not a RIFF file!\n"); } else printf("We get a RIFF file!\n"); if(filehead.szRiffFormat[0]!='W'||filehead.szRiffFormat[1]!='A'||filehead.szRiffFormat[2]!='V'||filehead.szRiffFormat[3]!='E') {//是否为WAVE printf("Not a WAVE file!\n"); } else printf("We get a WAVE file!\n"); //读取第二个chunk FMT_BLOCK fmtpart; fread(&fmtpart,1,sizeof(FMT_BLOCK),fp); printf("The addtional information ID in FMT_BLOCK is %d!\n",fmtpart.dwFmtSize); if(fmtpart.dwFmtSize==18) {//根据该信息判断是否含有第三个chunk printf("Have FACT_BLOCK!\n"); //读取第三个chunk char addtional[2]; fread(addtional,1,2,fp); FACT_BLOCK filefact; fread(&filefact,1,sizeof(FACT_BLOCK),fp); if(filefact.szFactID[0]=='f'&&filefact.szFactID[1]=='a'&&filefact.szFactID[2]=='c'&&filefact.szFactID[3]=='t') {//确定是否有FACT_BLOCK,注意大小写 printf("This is the FACT_BLOCK!\n"); printf("The FACT_BLOCK size is %d!\n",filefact.dwFactSize); printf("%d\n",filefact.data); } else { printf("This will never happen!\n"); } } //读取数据头 DATA_BLOCK datahead; fread(&datahead,1,sizeof(DATA_BLOCK),fp); if(datahead.szDataID[0]=='d'&&datahead.szDataID[1]=='a'&&datahead.szDataID[2]=='t'&&datahead.szDataID[3]=='a') {//确定读取了DATA_BLOCK printf("Here is the data!\n"); } char *data=new char[datahead.dwDataSize]; fread(data,1,datahead.dwDataSize,fp);//读取数据 return 0; }