#include <stdio.h>
typedef signed char INT8;
typedef signed short INT16;
typedef signed int INT32;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned int UINT32;
#define SWAP32(val) (UINT32)((((UINT32)(val)) & 0x000000FF)<<24| /
(((UINT32)(val)) & 0x0000FF00)<<8 | /
(((UINT32)(val)) & 0x00FF0000)>>8 | /
(((UINT32)(val)) & 0xFF000000)>>24)
typedef struct tagRIFFCHUNK
{
UINT32 fcc;
UINT32 cb;
} RIFFCHUNK, *LPRIFFCHUNK;
typedef struct tagRIFFLIST
{
UINT32 fcc;
UINT32 cb;
UINT32 fccListType;
}RIFFLIST, *LPRIFFLIST;
typedef struct
{
UINT32 fcc;
UINT32 cb;
UINT16 wFormatTag;
UINT16 nChannels;
UINT32 nSamplesPerSec;
UINT32 nAvgBytesPerSec;
UINT16 nBlockAlign;
UINT16 wBitsPerSample;
}WAVEFORM;
static void ReadWaveForm(FILE *fp, WAVEFORM *pWave)
{
fread(&(pWave->fcc), 1, 4, fp);
fread(&(pWave->cb), 1, 4, fp);
fread(&(pWave->wFormatTag), 1, 2, fp);
fread(&(pWave->nChannels), 1, 2, fp);
fread(&(pWave->nSamplesPerSec), 1, 4, fp);
fread(&(pWave->nAvgBytesPerSec), 1, 4, fp);
fread(&(pWave->nBlockAlign), 1, 2, fp);
fread(&(pWave->wBitsPerSample), 1, 2, fp);
}
UINT32 GetWaveChunk(FILE* hFile,WAVEFORM *pWave)
{
RIFFCHUNK ch;
RIFFLIST riff;
WAVEFORM wave;
int cb=0;
if(pWave==NULL)
pWave=&wave;
if(fseek(hFile,0,SEEK_SET)==-1)
return 0;
fread(&riff, 1, sizeof(RIFFLIST), hFile);
if( riff.fcc!=SWAP32(0x52494646)|| riff.fccListType!=SWAP32(0x57415645))//RIFF, WAVE
return 0;
ReadWaveForm(hFile, pWave);
if(pWave->fcc!=SWAP32(0x666d7420))//fmt
return 0;
cb=pWave->cb + sizeof(RIFFCHUNK)-sizeof(WAVEFORM);
if((cb>0) && (fseek(hFile,cb,SEEK_CUR)==-1) )
{
return 0;
}
fread(&ch, 1, sizeof(RIFFCHUNK), hFile);
while(ch.fcc!=SWAP32(0x64617461))//data
{
if(fseek(hFile,ch.cb,SEEK_CUR)!=-1)
fread(&ch, 1, sizeof(RIFFCHUNK), hFile);
else
return 0;
}
return ch.cb;
}
int main(int argc,char *argv[])
{
FILE *fp = NULL;
WAVEFORM wavChunk = {0};
if(argc<1)
return 0;
fp = fopen(argv[1], "rb");
if(fp == NULL)
return 0;
GetWaveChunk(fp, &wavChunk);
printf("fcc = %d/n", wavChunk.fcc);
printf("cb = %d/n", wavChunk.cb);
printf("nChannels = %d/n", wavChunk.nChannels);
printf("nSamplesPerSec = %d/n", wavChunk.nSamplesPerSec);
printf("nAvgBytesPerSec = %d/n", wavChunk.nAvgBytesPerSec);
printf("nBlockAlign = %d/n", wavChunk.nBlockAlign);
printf("wBitsPerSample = %d/n", wavChunk.wBitsPerSample);
fclose(fp);
return 1;
}
读取 wav文件 头信息, Read wav file information
最新推荐文章于 2022-04-27 23:17:11 发布