wave文件格式与解析

来源:互联网 发布:淘宝子账号有风险吗 编辑:程序博客网 时间:2024/04/19 09:34
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit的采样值)和
双声道(44.1KHz采样率、16Bit的采样值)。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声
声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道
下面就是根据四个结构体写的代码,注意FACT不是必须的,可以不用写入头,不写的话就
44个字节,写的话wave的头是56个字节
1)一个wave file包括四个CHUNK,除了FACT之外,其它是必须的
2)第一个RIFF是整个文件的头,所以别名为WAV_HEADER,而不是RIFF

1. 12个字节
typedef struct RIFF_CHUNK{
char fccID[4]; // must be "RIFF"
unsigned long dwSize; // all bytes of the wave file subtracting 8, 44-8+length or 56-8 +length 
// which is the size of fccID and dwSize, dwSize = fileSize - 8 
char fccType[4]; // must be "WAVE"
}WAVE_HEADER;

2. 24个字节
typedef struct FORMAT_CHUNK{
char fccID[4]; // must be "fmt "
unsigned long dwSize; // size of this struct, subtracting 8, which   is the sizeof fccID and dwSize
                                         // 24-8=16 -->0x10, 0x12
unsigned short wFormatTag; // one of these: 1: linear,6: a law,7:u-law, FORMAT_TAG
unsigned short wChannels; // channel number
unsigned long dwSamplesPerSec; // sampling rate, SAMPLE_RATE,AC44=44100
unsigned long dwAvgBytesPerSec; // bytes number per second, 2*AC44*2=2B110
                                                  //CHANNEL_NUN * SAMPLE_RATE * BYTES_EACH_SAMPLE

unsigned short wBlockAlign; // 每样本的数据位数(按字节算), 其值为:通道,BYTES_EACH_SAMPLE
// 数*每样本的数据位值/8,播放软件需要一次处
// 理多个该值大小的字节数据, 以便将其值用于
// 缓冲区的调整每样本占几个字节
// NumChannels * uiBitsPerSample/8  2* 16/8 =4
unsigned short uiBitsPerSample; // quantization  1
}FORMAT;

3.12个字节
// The fact chunk is required for all new WAVE formats.
// and is not required for the standard WAVE_FORMAT_PCM files
// 也就是说,这个结构体目前不是必须的,一般当wav文件由某些软件转化而成,则包含该Chunk
// 但如果这里写了,则必须是如下的结构,并且在四个结构体中的位置也要放在第三
typedef struct {
char fccID[4]; // must be "fact"
unsigned long id; // must be 0x4
unsigned long dwSize; // 暂时没发现有啥用, length
}FACT;

4. 8个字节
// 数据结构
typedef struct {
char fccID[4]; // must be "data"
unsigned long dwSize; // dwSize =  fileSize - 44/56, byte_number of PCM data in byte,WAVE_HEADER.size - dwSize =  44-8 or 56-8
}DATA;



0 0