WAV文件通常采用的音频编码方式是脉冲编码调制(PCM)。因为WAV格式源自Window/Intel环境,因而采用的Little Endian字节顺序存储。
WAV文件容量=(采样频率X采样位数X声道)X时间/8(1字节=8bit)。
WAV文件由若干个帧组成。按照在文件中的出现位置包括:RIF'FWAVE帧、Format帧、Fact帧(可选)、Data帧。
RIFF WAVE Chunk ID = ‘RIFF’ Size= RiffType = ‘WAVE’ |
Format Chunk ID = ‘fmt’ ...... |
Fact Chunk(optional) ID = ‘fact’ ...... |
Data Chunk ID = ‘data’ Size= data |
除了Fact帧外,其他3个帧都是必须的。每个帧有各自的ID,位于该帧最开始位置,均为4个字节。紧跟在ID后面的是帧的大小,大小为4字节(小端方式)。
(1)RIFF WAVE帧
名称 | 长度 | 具体内容 |
ID | 4 Bytes | ‘RIFF’ |
Size | 4 Bytes | FileLen-8, 整个文件大小-8 |
Type | 4 Bytes | ‘WAVE’ |
struct RIFF_HEADER
{
U8 ID[4]; //’R’,’I’,’F’,’F’
U32 Size; //
U8 Type[4]; //’W’,’A’,’V’,’E’
}
(2)Format帧
此帧一般情况下为16字节,此时最后附加信息没有;如果为18字节,则最后,多了两个字节的附加信息。
名称 | 字节数 | 具体内容 |
ID | 4 | fmt |
Size | 4 | 16或18(数值), 18则最后有附加信息 |
FormatTag | 2 | 编码方式,一般为0x0001 |
Channels | 2 | 声道数目,1-单声道,2-双 |
SamplesPerSec | 4 | 采样频率 |
AvgBytesPerSec | 4 | 每秒所需字节数 |
BlockAlign | 2 | 数据块对齐单位(每个采样需要的字节数) |
BitsPerSample | 2 | 每个采样需要的bit数 |
附加信息 | 2 | 附加信息(可选,通过Size判断有无) |
struct WAVE_FORMAT{
U32 ID;//ID, fmt
U32 Size;
U16 FormatTag;
U16 Channels;
U32 SamplesPerSec;
U32 AvgBytesPerSec;
U16 BlockAlign;
U16 BitsPerSample;
U16 pack; //附加信息
}
(3)Fact帧
当WAV文件是由某些软件转化而成时可能包含的帧。
名称 | 所占字节数 | 具体内容 |
ID | 4 | “fact” |
Size | 4 | 数值4 |
data | 4 | “WAVE” |
struct FACT_BLOCK{
U8 szFactID[4];//’f’,’a’,’c’,’t’
U32 dwFactSize;//
U32 wavFormat;//’WAVE’
}
(4)Data帧
保存WAV音频数据的地方。
名称 | 所占字节数 | 具体内容 |
ID | 4 | “data” |
Size | 4 |
|
data |
| WAV音频数据 |
struct DATA_BLOCK{
U8 ID[4];//’d’,’a’,’t’,’a’
U32 DataSize;
}