wav 文件格式详解

WAVE 文件规范来自微软。文件格式使用 RIFF 块,每个块由块标识符、块长度和块数据组成。

文件编码

编码包括了两方面内容,一是按一定格式存储数据,二是采用一定的算法压缩数据。WAV 格式对音频流的编码没有硬性规定,支持非压缩的 PCM(Puls Code Modulation) 脉冲编码调制格式,还支持压缩型的微软自适应分脉冲编码调制 Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、国际电报联盟 (International Telegraph Union) 制定的语音压缩标准 ITUG.711 a-law、ITU G.711-law、IMA ADPCM、ITU G.723 ADPCM (Yamaha)、GSM 6.10、ITU G.721 ADPCM 编码和其它压缩算法。MP3 编码同样也可以运用在 WAV 中,只要安装相应的 Decode, 就可以播放 WAV 中的 MP3 音乐。

PCM 格式

PCM 编码是直接存储声波采样被量化后所产生的非压缩数据,故被视为单纯的无损耗编码格式,其优点是可获得高质量的音频信号。
基于 PCM 编码的 WAV 格式是最基本的 WAV 格式,被声卡直接支持,能直接存储采样的声音数据,所存储的数据能直接通过声卡播放,还原的波形曲线与原始声音波形十分接近,播放的声音质量是一流的,在 Windows 平台下被支持得最好,常常被用作在其它编码的文件之间转换的中间文件。PCM 的缺点是文件体积过大,不适合长时间记录。正因为如此,又出现了多种在 PCM 编码的基础上经改进发展起来的编码格式,如:DPCM,ADPCM 编码等。

文件格式

WAV 文件采用的是 RIFF 格式结构,WAV 文件有一个主 RIFF 块,它包括一个 Wave 标识符,后跟一个子块。数据以低位字节顺序存储。

fmt 块指定数据的格式。采样数据的格式块有 3 种,这些不同于基本 fmt 块。

非 PCM 格式必须 fact 块。

data 块包含采样数据。

example:

如果采样数据是 PCM 格式,则通常可以省略 fact 块。

整体来说如下图概括

代码表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct WAV_HEADER {
char ChunkID[4]; // "RIFF"
unsigned int ChunkSize; // 文件长度(WAVE文件的大小, 不含前8个字节)
char Format[4]; // "WAVE"

char SubChunk1ID[4]; // "fmt "
unsigned int SubChunk1Size; // 过渡字节(不定)
unsigned short int AudioFormat; // 格式类别(10H为PCM格式的声音数据)
unsigned short int NumChannels; // 通道数(单声道为1, 双声道为2)
unsigned int SampleRate; // 采样率
unsigned int ByteRate; // 波形音频数据传输速率
unsigned short int BlockAlign; // data数据块长度、字节
unsigned short int BitsPerSample;// PCM 位宽

char SubChunk2ID[4]; // "data"
unsigned int SubChunk2Size; // data数据的长度
} WAV_HEADER;

参考资料