一、WAV格式的概念
定义
WAV为微软公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。RIFF格式
RIFF即“资源互换文件格式”,基本构成单位为chunk,每个chunk由辨别码(4字节)、数据大小(4字节)及数据所组成。WAV格式
WAVE文件由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。
每个Chunk的开头就是它的ID,占4个字节。随后是Chunk的Size,同样占4个字节,且Size的大小是文件本身大小减去ID和Size所占8字节之后的大小。
RIFF WAVE Chunk | Format Chunk | Fact Chunk | Data Chunk | |
---|---|---|---|---|
ID | RIFF | fmt | fact | data |
RiffType | WAVE |
- RIFF WAVE Chunk
1.结构体
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};
2.具体组成
地址 | 内容 | 字节数 | 具体内容 |
---|---|---|---|
00H-03H | ID | 4字节 | ‘RIFF’标识符 |
04H-07H | Size | 4字节 | WAVE文件大小-8字节 |
08H-0BH | Type | 4字节 | 格式辨别码’WAVE’ |
- Format Chunk
1.结构体
struct WAVE_FORMAT
{
WORD wFormatTag;
WORD wChannels;
DWORD dwSamplesPerSec;
DWORD dwAvgBytesPerSec;
WORD wBlockAlign;
WORD wBitsPerSample;
};
struct FMT_BLOCK
{
char szFmtID[4]; // 'f','m','t',' '
DWORD dwFmtSize;
WAVE_FORMAT wavFormat;
};
2.具体组成
地址 | 内容 | 字节数 | 具体内容 |
---|---|---|---|
0CH-0FH | ID | 4字节 | ‘fmt’标识符 |
10H-13H | Size | 4字节 | 数值为16或18,18则最后又附加信息 |
14H-15H | FormatTag | 2字节 | 编码方式,一般为0x0001 |
16H-17H | Channels | 2字节 | 声道数目,1-单声道;2-双声道 |
18H-1BH | SamplesPerSec | 4字节 | 采样频率 |
1CH-1FH | AvgBytesPerSec | 4字节 | 每秒所需字节数 |
10H-21H | BlockAlign | 2字节 | 数据块对齐单位 |
22H-23H | BitsPerSample | 2字节 | 每个采样需要的bit数 |
24H-25H | 2字节 | 附加信息,可选 |
- Format Chunk
结构体
struct FACT_BLOCK
{
char szFactID[4]; // 'f','a','c','t'
DWORD dwFactSize;
};
- Data Chunk
结构体
struct DATA_BLOCK
{
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};
二、课后问题
8比特和16比特样值的二进制编码表示一样吗?
- 8比特量化单声道
- 8比特量化双声道
- 16比特量化单声道
- 16比特量化双声道
- 8比特量化单声道
现有的WAV支持哪几种音频压缩方法?
FormatTag可取十个值分别对应十种编码算法
FormatTag 编码方式 0001H PCM/uncompressed 0002H Microsoft ADPCM 0006H ITU G.711 a-law 0007H ITU G.711 µ-law 0011H IMA ADPCM 0016H ITU G.723 ADPCM (Yamaha) 0031H GSM 6.10 0040H ITU G.721 ADPCM 0050H MPEG FFFFH Experimental