标签:style blog http io ar color os 使用 sp
WAVE 文件作为Windows多媒体中使用的声音波形文件格式之一,它是以RIFF(Resource Interchange File Format)格式为标准的。这里不针对RIFF文件格式做介绍,不太了解的可以参考“RIFF格式简介”一文。
每个WAVE文件的头四个字节便是“RIFF”。WAVE 文件由文件头和数据体两大部分组成。其中文件头又分为 RIFF/WAV 文件标识段和声音数据格式说明段两部分。相对于RIFF文件,只是将“RIFF”chunk的form id替换为“WAVE”。下表是一个典型的WAVE文件各部分构成及其长度字段。注意所有数据采用windows默认的小端存储。(FOURCC是一个特殊的四字节码,判断时按照字符顺序判断即可。)
域 | 长度 | 内容说明 | |
---|---|---|---|
chunkID | 4 | Chunk ID: "RIFF",FOURCC四字节码 | |
chunksize | 4 | Chunk size: 4+n | |
WAVEID | 4 | WAVE ID: "WAVE",FOURCC四字节码 | |
WAVE chunks | n | Wave chunks包含格式信息和音频采样数据,分为“format” chunk和“data”chunk两部分。 |
Format chunk用于说明data chunk中PCM数据的格式。主要三种不同的format chunk格式(不同的格式码)。如下表:
域 | 长度 | 内容说明 | |
---|---|---|---|
ckID | 4 | Chunk ID: "fmt ",FOURCC四字节码,注意最后一个填充是空格。 | |
cksize | 4 | Chunk size: 16 or 18 or 40 | |
wFormatTag | 2 | Format code,格式码 | |
nChannels | 2 | Number of interleaved channels,采样声道数(交织存储) | |
nSamplesPerSec | 4 | Sampling rate (blocks per second),音频采样率 | |
nAvgBytesPerSec | 4 | Data rate,音频码率 | |
nBlockAlign | 2 | Data block size (bytes),音频数据块大小(单位字节) | |
wBitsPerSample | 2 | Bits per sample,量化位数(比如8bits、16bits、32bits) | |
cbSize | 2 | Size of the extension (0 or 22),扩展字段长度 | |
wValidBitsPerSample | 2 | Number of valid bits,有效的位长度 | |
dwChannelMask | 4 | Speaker position mask,声道描述掩码,比如左声道、右声道等 | |
SubFormat | 16 | GUID, including the data format code,数据格式码 |
标准中定义的wFormatTag(Format code)可取值范围如下表:
Format Code | PreProcessor Symbol | Data |
---|---|---|
0x0001 | WAVE_FORMAT_PCM | PCM |
0x0003 | WAVE_FORMAT_IEEE_FLOAT | IEEE float,[-1.0f,1.0f] |
0x0006 | WAVE_FORMAT_ALAW | 8-bit ITU-T G.711 A-law |
0x0007 | WAVE_FORMAT_MULAW | 8-bit ITU-T G.711 µ-law |
0xFFFE | WAVE_FORMAT_EXTENSIBLE | Determined by SubFormat |
当wFormatTag为0x0001时,表示WAVE文件中存储的是PCM格式的音频数据。
在数据域中除了单声道-量化位数为8音频数据之外PCM存储格式按照补码的形式存放。对于单声道、量化位数为8的情况,使用offset binary(偏移二进制码),有兴趣的可以查看下对应的标准。
对于非PCM格式的数据,使用扩展字段,扩展字段长度由cbSize指定。需要说明以下几点:
当FormatTag为WAVE_FORMAT_EXTENSIBLE(0xFFFE)时,表示format chunk有扩展字段,其中包括有效量化位数(wValidBitsPerSample)、声道位置掩码、以及额外的GUID(SubFormat)。
在以下几种情况下必须使用WAVE_FORMAT_EXTENSIBLE格式:
通常PCM数据是不压缩的,对于所有压缩的非PCM格式都需要有FACT chunk。具体可参考:WAVE update (Revision: 3.0), 1994-04-15: Multimedia Registration Kit Revision 3.0 (Q120253))。FACT chunk至少定义一个字段,实际采样数dwSampleLength。
关于FACT chunk可以了解,但是很少用到,如果有这种格式的wav文件,建议参考上述标准解析。
data chunk中包含采样数据。格式如下:
域 | 长度 | 内容说明 | |
---|---|---|---|
ckID | 4 | Chunk ID: "data" | |
cksize | 4 | Chunk size: n | |
sampled data | n | Samples,音频采样数据,交织存储 | |
pad byte | 0 or 1 | Padding byte if n is odd,填充字节 |
由于微软将多媒体输入输出函数废弃了(Using Multimedia File I/O),这里不给出专门读写的代码,而是直接使用二进制形式分析。
先做如下假定:
PCM文件格式如下表:
Field | Length | Contents | ||
---|---|---|---|---|
ckID | 4 | Chunk ID: "RIFF" | ||
cksize | 4 | Chunk size: 4 + 24 + (8 + M * Nc * Ns + (0 or 1)) |
||
WAVEID | 4 | WAVE ID: "WAVE" | ||
ckID | 4 | Chunk ID: "fmt " | ||
cksize | 4 | Chunk size: 16 | ||
wFormatTag | 2 | WAVE_FORMAT_PCM | ||
nChannels | 2 | Nc | ||
nSamplesPerSec | 4 | F | ||
nAvgBytesPerSec | 4 | F * M * Nc | ||
nBlockAlign | 2 | M * Nc | ||
wBitsPerSample | 2 | rounds up to 8 * M | ||
ckID | 4 | Chunk ID: "data" | ||
cksize | 4 | Chunk size: M * Nc* Ns | ||
sampled data | M * Nc * Ns | Nc * Ns channel-interleaved M-byte samples | ||
pad | 0 or 1 | Padding byte if M * Nc * Ns is odd |
注意WAVE文件可能附加information chunk。所以程序解析是最好按照上述标准定义,不要认为去掉wav fmt chunk之后全是data chunk。
Extensible Format如下表:
Field | Length | Contents | ||
---|---|---|---|---|
ckID | 4 | Chunk ID: "RIFF" | ||
cksize | 4 | Chunk size: 4 + 48 + 12 + (8 + M * Nc * Ns + (0 or 1)) |
||
WAVEID | 4 | WAVE ID, "WAVE" | ||
ckID | 4 | Chunk ID: "fmt " | ||
cksize | 4 | Chunk size: 40 | ||
wFormatTag | 2 | WAVE_FORMAT_EXTENSIBLE | ||
nChannels | 2 | Nc | ||
nSamplesPerSec | 4 | F | ||
nAvgBytesPerSec | 4 | F * M * Nc | ||
nBlockAlign | 2 | M * Nc | ||
wBitsPerSample | 2 | 8 * M | ||
cbSize | 2 | Size of the extension: 22 | ||
wValidBitsPerSample | 2 | at most 8 * M | ||
dwChannelMask | 4 | Speaker position mask: 0 | ||
SubFormat | 16 | GUID (first two bytes are the data format code) | ||
ckID | 4 | Chunk ID: "fact" | ||
cksize | 4 | Chunk size: 4 | ||
dwSampleLength | 4 | Nc * Ns | ||
ckID | 4 | Chunk ID: "data" | ||
cksize | 4 | Chunk size: M * Nc * Ns | ||
sampled data | M * Nc *Ns | Nc * Ns channel-interleaved M-byte samples | ||
pad | 0 or 1 | Padding byte if M * Nc * Ns is odd |
本文主要参考:Audio File Format Specifications,相关测试wav文件及标准也从其链接下载。
写作本文的目的主要是学习下wave文件格式,并能够将音频数据解析出来。
以上介绍的内容中针对WAVE文件我们可以只关心,fmt chunk、data chunk数据,其他数据chunk可以忽略,如果你对其他chunk感兴趣,建议查看rfc2361及Microsoft提供的标准文档。
标签:style blog http io ar color os 使用 sp
原文地址:http://www.cnblogs.com/tocy/p/WAV_file-format.html