wave文件格式与解析

常见的声音文件主要有两种,分别对应于单声道(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,AC 44 =44100
unsigned long  dwAvgBytesPerSec;  // bytes number per second, 2* AC 44*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;



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
wav文件是一种常见的音频文件格式,它是由Microsoft和IBM共同定义的。下面是对wav文件格式的详解: 1. 文件头(Header):wav文件的前44个字节是文件头,包含了文件的基本信息。文件头的结构如下: - ChunkID(4字节):文件标识,通常为"RIFF"。 - ChunkSize(4字节):文件大小,即整个文件的大小减去8个字节(ChunkID和ChunkSize本身的大小)。 - Format(4字节):文件格式,通常为"WAVE"。 - Subchunk1ID(4字节):子块标识,通常为"fmt "。 - Subchunk1Size(4字节):子块大小,即除去Subchunk1ID和Subchunk1Size本身的大小。 - AudioFormat(2字节):音频格式,常见值为1表示PCM(脉冲编码调制)。 - NumChannels(2字节):声道数,常见值为1表示单声道,2表示立体声。 - SampleRate(4字节):采样率,即每秒采样的样本数。 - ByteRate(4字节):数据传输速率,即每秒传输的字节数。 - BlockAlign(2字节):数据块对齐,即每个采样的字节数。 - BitsPerSample(2字节):样本位数,即每个采样的位数。 2. 数据块(Data Chunk):文件头之后的部分是音频数据块,包含了实际的音频采样数据。数据块的结构如下: - Subchunk2ID(4字节):子块标识,通常为"data"。 - Subchunk2Size(4字节):子块大小,即音频数据的大小。 - Data(变长):音频数据,以二进制形式存储。 在wav文件中,音频数据以采样点的形式存储,每个采样点的值表示音频信号在该时间点上的幅度。采样点的位数(BitsPerSample)决定了每个采样点的精度,位数越高,精度越高,音频质量也越好。 总结起来,wav文件格式通过文件头和数据块来存储音频数据,其中文件头包含了文件的基本信息,数据块存储了实际的音频采样数据。通过解析文件头和读取数据块中的采样数据,可以对wav文件进行分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值