1 WAV文件格式概述
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1kHz的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!
2 WAV文件结构
WAV文件是属于RIFF结构形式的文件,这种结构是一种树状结构,其最基本的组成单元是chunk(块),而每一个chunk则由辨识码,数据大小,以及数据本身组成,其中辨识码就是RIFF四个字母的ASCII码,共占用4个字节,用十六进制表示就是52 49 46 46;辨识码之后的四个字节,表示除去文件辨识码和它自己之后剩余文件的大小,最后就是文件的数据本身了,如下表和下图所示。
chunk | 长度(字节) |
---|---|
RIFF chunk (将文件标识为WAV文件) | 4(4个ASCII码) |
Format chunk (识别采样率等参数) | 4 |
Data chunk (包含实际数据) |
- RIFF chunk
含义 | 长度(Byte) | HEX |
---|---|---|
标识符(RIFF) | 4 | 52 49 46 46 |
数据大小 | 4 | |
WAVE格式辨别码 | 4 | 57 41 56 45 |
typedef struct RIFF chunk
{
DWORD ChunkId; // 块标志
DWORD size; // 块大小
DWORD Type; // 后续跟块介绍
}RIFF chunk;
- fmt chunk
含义 | 长度(Byte) | HEX |
---|---|---|
标识符(fmt) | 4 | 66 6D 74 20 |
数据大小 | 4 | 12 00 00 00 |
数据 | 18 |
typedef struct fmt chunk
{
DWORD ChunkId; // 块标志
DWORD size; // 块大小
WORD AudioFormat; // 表明音频格式
WORD NumChannels;//表明声道数
DWORD SampleRate;//采样率
DWORD ByteRate;//每秒字节数
WORD BlockAlign;//数据块对齐
WORD BitsPerSample;//采样位数
}fmt chunk;
- data chunk
含义 | 长度(Byte) | HEX |
---|---|---|
标识符(data) | 4 | 64 61 74 61 |
波形声音值大小 | 4 | |
波形声音值 | 4 |
typedef struct data chunk
{
DWORD ChunkId; // 块标志(以data为标识)
DWORD size; // 数据块的长度
nByte Data; // 具体数据
}data chunk;
3 实例分析
1. 以十六进制数据的形式打开一个WAV文件
(1)“52 49 46 46”这个是Ascii字符“RIFF”,这部分是固定格式,表明这是一个WAVE文件头。
(2)“46 C0 FF 01”,这个是我这个WAV文件的数据大小,这个大小包括除了前面4个字节的所有字节,也就等于文件总字节数减去8。16进制的“46 C0 FF 01”对应是十进制的“1,187,053,313”。
(3)“57 41 56 45 66 6D 74 20”,也是Ascii字符“WAVEfmt”,这部分是固定格式。
以后是PCMWAVEFORMAT部分
(4)“10 00 00 00”,这是一个DWORD,对应数字18,这个对应定义中的PCMWAVEFORMAT部分的大小,可以看到后面的这个段内容正好是18个字节。一般情况下大小为16,此时最后附加信息没有,上面这个文件多了两个字节的附加信息。
(5)“01 00”,这是一个WORD,对应定义为编码格式(WAVE_FORMAT_PCM格式一般用的是这个)。
(6)“02 00”,这是一个WORD,对应数字2,表示声道数为2,是个双声道Wav。
(7)“44 AC 00 00”对应数字44100,代表的是每秒的数据量,波形音频数据传送速率,其值为:通道数×每秒样本数×每样本的数据位数/8(1采样频率16/8)。播放软件利用此值可以估计缓冲区的大小。
(8)“04 00”对应数字是4,表示块对齐的内容。数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
(9)“10 00”数值为16,采样大小为16Bits,每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
(10)“4C 49”此处为附加信息(可选),和(4)中的size对应。
(11)“53 54 1A 00” Fact是可选字段,一般当wav文件由某些软件转化而成,则包含该项,“00 00 49 4E”Fact字段的大小为4字节,“46 49 4F 53”是fact数据。
4 小结
对WAV格式影响最大的参数是编码格式。采用不同的编码的WAV格式是不同的,PCM是最常见的编码格式,其它的为压缩编码格式,一般很少使用,有的已经废弃。随着人们认识的进步可能还会有新的编码格式出现。今后对WAV文件格式的更多的研究是压缩编码格式。