typedef unsigned int uint32_t;
typedef unsigned short uint16_t;
//RIFF块
typedef struct
{
uint32_t ChunkID; //chunk id;这里固定为"RIFF",即0X46464952
uint32_t ChunkSize ; //集合大小;文件总大小-8
uint32_t Format; //格式;WAVE,即0X45564157
}ChunkRIFF ;
//fmt块
typedef struct
{
uint32_t ChunkID; //chunk id;这里固定为"fmt ",即0X20746D66
uint32_t ChunkSize ; //子集合大小(不包括ID和Size);这里为:20.
uint16_t AudioFormat; //音频格式;0X01,表示线性PCM;0X11表示IMA ADPCM
uint16_t NumOfChannels; //通道数量;1,表示单声道;2,表示双声道;
uint32_t SampleRate; //采样率 每秒钟有多少个字节的数据送到DAC上
uint32_t ByteRate; //字节速率;通道数*DAC精度
uint16_t BlockAlign; //块对齐(字节);
uint16_t BitsPerSample; //单个采样数据大小 就是DAC需要的精度
// uint16_t ByteExtraData; //附加的数据字节;2个; 线性PCM,没有这个参数
}ChunkFMT;
int main()
{
char Wave[]="ykzzldx.wav";
ChunkRIFF Riff;
ChunkFMT Fmt;
FILE *Wavefil;
Wavefil=fopen(Wave,"r+");
if(Wavefil==NULL)
{
printf("da kai wen jian shi bai\n");
return 0;
}
fread(&Riff,sizeof(Riff),1,Wavefil);
fread(&Fmt,sizeof(Fmt),1,Wavefil);
if(Riff.ChunkID==0X46464952)
{
printf("zhe shi wav wen jian \n");
printf("zheng ge wen jian de da xiao wei: %dKB\n",(Riff.ChunkSize+8)>>10);
if(Fmt.ChunkID==0X20746D66);
{
printf("Wav wen jian !\n");
if(Fmt.AudioFormat==0x01)
{
printf("zhe shi xian xing PCM ge shi \n");
}
printf("tong dao shu liang wei %d\n",Fmt.NumOfChannels);
printf("cai yang su lv wei: %dHz\n",Fmt.SampleRate);
printf("zi jie su lv wei :%dHz\n",Fmt.ByteRate);
printf("dan ge cai yang shu ju da xiao wei:\t%d\n",Fmt.BitsPerSample);
}
}
else
{
printf("zhe bu shi WAV wen jian \n");
return 0;
}
fclose(Wavefil);
return 0;
}
|