1.概述
Waveform Audio File Format(WAVE,又或者是因为WAV后缀而被大众所知的),它采用RIFF(Resource Interchange File Format)文件格式结构。通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。
2.格式解析
WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。WAV文件一般由3个区块组成:RIFF chunk、Format chunk和Data chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk等。
本文将只介绍RIFF chunk、Format chunk和Data chunk。
2.1 RIFF区块
| 名称 | 偏移地址 | 字节数 | 端序 | 内容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'RIFF' (0x52494646) |
| Size | 0x04 | 4Byte | 小端 | fileSize - 8 |
| Type | 0x08 | 4Byte | 大端 | 'WAVE'(0x57415645) |
- 以
'RIFF'为标识 -
Size是整个文件的长度减去ID和Size的长度 -
Type是WAVE表示后面需要两个子块:Format区块和Data区块
2.2 FORMAT区块
| 名称 | 偏移地址 | 字节数 | 端序 | 内容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'fmt ' (0x666D7420) |
| Size | 0x04 | 4Byte | 小端 | 16 |
| AudioFormat | 0x08 | 2Byte | 小端 | 音频格式 |
| NumChannels | 0x0A | 2Byte | 小端 | 声道数 |
| SampleRate | 0x0C | 4Byte | 小端 | 采样率 |
| ByteRate | 0x10 | 4Byte | 小端 | 每秒数据字节数 |
| BlockAlign | 0x14 | 2Byte | 小端 | 数据块对齐 |
| BitsPerSample | 0x16 | 2Byte | 小端 | 采样位数 |
- 以
'fmt '为标识 -
Size表示该区块数据的长度(不包含ID和Size的长度) -
AudioFormat表示Data区块存储的音频数据的格式,PCM音频数据的值为1 -
NumChannels表示音频数据的声道数,1:单声道,2:双声道 -
SampleRate表示音频数据的采样率 -
ByteRate每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8 -
BlockAlign每个采样所需的字节数 = NumChannels * BitsPerSample / 8 -
BitsPerSample每个采样存储的bit数,8:8bit,16:16bit,32:32bit
2.3 DATA区块
| 名称 | 偏移地址 | 字节数 | 端序 | 内容 |
|---|---|---|---|---|
| ID | 0x00 | 4Byte | 大端 | 'data' (0x64617461) |
| Size | 0x04 | 4Byte | 小端 | N |
| Data | 0x08 | NByte | 小端 | 音频数据 |
- 以
'data'为标识 -
Size表示音频数据的长度,N = ByteRate * seconds -
Data音频数据
3. 小端存储
WAV文件以小端形式来进行数据存储。
所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
下面解释一下PCM数据在WAV文件中的bit位排列方式
| PCM数据类型 | 采样 | 采样 |
|---|---|---|
| 8Bit 单声道 | 声道0 | 声道0 |
| 8Bit 双声道 | 声道0 | 声道1 |
| 16Bit 单声道 | 声道0低位,声道0高位 | 声道0低位,声道0高位 |
| 16Bit 双声道 | 声道0低位,声道0高位 | 声道1低位,声道1高位 |