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;
}