C语音读取WAV文件,头文件中DataID为空,求大神帮忙看看
c语言写的一个读取wav音频文件的小程序,调试发现DataID内容为空,但应该为'data',不知道原因,音频文件为一首wav的歌曲,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include <STRING.H>
#include<math.h>
typedef short DWORD;
struct WavHead
{
char ChunkID[4]; //ChunkID is "RIFF'
DWORD Chunksize; //RIFF WAVE Chunk 大小
char ChunkType[4]; //Yype is 'WAVE'
//char Format[4];
char FormatID[4]; //FORmatID IS 'fmt'
int dwFmtlen;
int Formattag;//编码方式,一般为0x0001
short ChannelNum; //声道数目,1--单声道;2--双声道
long SamplePersec; //采样频率
long AveBytePersec; //每秒平均字节数
short BitsperSample;//每个采样点的bit
char FactID[4]; //FactID is 'fact'
long Factsize;
long FactData;
char DataID[4];//DataId is 'data'
long DataSize;
long WavData;
long SubChun2Size;
//long SampleNum;
};
//void wave_generator(FILE *fpwav, wav_pcm_header44 *phwav);
int main()
{
FILE *fpwav = NULL;
struct WavHead hWAV;
fpwav = fopen("test.wav","rb");
if(fpwav == NULL)
{
printf("fail to open file");
return -1;
}
printf("open ok\n");
fread(&hWAV, sizeof(WavHead), 1, fpwav);
printf("fread head ok\n");
printf("%s\n",hWAV.DataID);
if ((0 == memcmp(hWAV.ChunkID,"RIFF",4))&&(0 == memcmp(hWAV.FormatID,"fmt",4),4)&&(0 == memcmp(hWAV.DataID,"data",4)))
{
printf("wave audio data format:\n");
printf("Channel num:%d\n",hWAV.ChannelNum);
printf("SampleRate:%dHz\n",hWAV.SamplePersec);
printf("BitesperSample:%d bits\n",hWAV.AveBytePersec);
//printf("audio data size : %d",)
}
fclose(fpwav);
fpwav = NULL;
return 0;
} c语言 wave audio 头文件 Chunk
[解决办法]
定义结构体之前配置:
#pragma pack(1)
就是紧凑模式,这样字段就会一个一个的挨着放。
否则的话,编译器会在一些字段后面插入空的字节,用来对齐,以实现较高的处理效率。
[解决办法]
wav由若干个块组成,不一定马上就是fmt,也不一定有fact,分析应该时循序读入4byte块名+4byte块的大小,然后推敲出下一个块的位置,多声道的话fmt块也不是你列出的那种格式,所以先找格式规范看看先...