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; 
}