-
wav
文件格式分析详解
一、综述
WAV
E
文件作为多媒体中使用的声波文件格式之一,它是以
RIFF
格式为标准
的。
RIFF
是英文
Resource
Interchange File Format
的缩写,每个
WAVE
文件的头四个
字节便是“
RIFF
”。
p>
WAVE
文件是由若干个
Chunk
组成的。按照在文件中的出现位置包括:
RIFF
WAVE
Chunk, Format Chunk,
Fact Chunk(
可选
), Data
Chunk
。具体见下图:
------------------------------------------
------
|
RIFF WAVE Chunk
|
|
ID
= 'RIFF'
|
|
RiffType = 'WAVE'
| <
/p>
----------------------------------------
--------
|
Format Chunk
|
|
ID = 'fmt '
|
--------------
----------------------------------
|
Fact Chunk(optional)
|
|
ID = 'fact'
|
--------------------------
----------------------
|
Data Chunk
|
|
ID = 'data'
|
--------------
----------------------------------
图
1
<
/p>
Wav
格式包含
Chunk
示例
其中除了
Fact Chunk
外,<
/p>
其他三个
Chunk
是必须的。
每个
Chunk
有各自的
ID
,
位
于
Chunk
最开始位置,
作为标示,
而且均为
4
个字节。
< br>并且紧跟在
ID
后面的是
Chu
nk
大
小
(
去除
ID
和
Size
< br>所占的字节数后剩下的其他字节数目)
,
4
个字节表示,
低字节
表示
数值低位,高字节表示数值高位。下面具体介绍各个
Chunk
内容。
PS
:
所有数值表示均为低字节表示低位,高字节表示高位。
二、具体介绍
RIFF WAVE Chunk
==================================
|
|
所占字节数
|
具体内容
|
==================================
| ID
|
4
Bytes |
'RIFF'
|
----------------------------------
| Size
|
4 Bytes |
|
----------------------------------
| Type
|
4 Bytes |
'WAVE'
|
----------------------------------
图
2
RIFF WAVE Chunk
以
p>
'FIFF'
作为标示,
然后紧跟着为
p>
size
字段,
该
size
是整个
wav
文件大小减去<
/p>
ID
和
Size
所占用的字节数,即
FileLen - 8 = Size
。然后是
Type
字段,为
'WAVE
'
,表
示是
wav
文件。
结构定义如下:
struct RIFF_HEADER
{
char szRiffID[4];
// 'R','I','F','F'
DWORD dwRiffSize;
char
szRiffFormat[4]; // 'W','A','V','E'
};
Format Chunk
p>
=========================================
======================
=====
|
|
字节数
|
具体内容
|
p>
=========================================
======================
=====
|
ID
|
4 Bytes
|
'fmt '
|
---
--------------------------------------------------
---------------
| Size
|
4
Bytes
|
数值为
16
或
18
,
18
则最后又附加信息
|
p>
-----------------------------------------
---------------------------
----
| FormatTag
|
2 Bytes
|
编码方式,一般为
0x0001
|
|
---
--------------------------------------------------
---------------
|
|
Channels
|
2 Bytes
|
声道数目,
1--
单声道;
2--
双声道
|
|
---
--------------------------------------------------
---------------
|
|
SamplesPerSec |
4 Bytes
|
采样频率
|
|
p>
-----------------------------------------
---------------------------
|
|
AvgBytesPerSec|
4
Bytes
|
每秒所需字节数
|
|===>
WAVE_FORMAT
---------------------------
-----------------------------------------
|
| BlockAlign
|
2 Bytes
|
数据块对齐单位
(
每个采样需要的字节数
) |
|
---------------
--------------------------------------------------
---
|
| BitsPerSample
|
2 Bytes
|
每个采样需要的
bit
数
|
|
---------------------------
-----------------------------------------
|
|
|
2 Bytes
|
附加信息
(可选,
通过
Size
来判断有无)
|
|
---
--------------------------------------------------
---------------
----
图
3
Format Chunk
以
'fmt '
作为标示。一般情况下
Size
为
16
,此时最后附加信息没有;如果为
18
则最后多了
2
个字节的附加信息。主要由一些软件制成的
w
av
格式中含有该
2
个字
节的
附加信息。
结构定义如下:
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;
};
Fact Chunk
==================================
|
|
所占字节数
|
具体内容
|
==================================
| ID
|
4
Bytes |
'fact'
|
----------------------------------
| Size
|
4 Bytes |
数值为
4
|
----------------------------------
| data
|
4 Bytes |
|
----------------------------------
图
4
Fact Chunk
Fact Chunk
是可选字段,
一
般当
wav
文件由某些软件转化而成,
则包含该
Chunk
。
结构定义如下:
struct FACT_BLOCK
{
char
szFactID[4]; // 'f','a','c','t'
DWORD
dwFactSize;
};
Data Chunk
==================================
|
|
所占字节数
|
具体内容
|
==================================
| ID
|
4
Bytes |
'data'
|
----------------------------------
| Size
|
4 Bytes |
|
----------------------------------
| data
|
|
|
----------------------------------
图
5 Data Chunk
Data Chunk
是真正保存<
/p>
wav
数据的地方,
以
< br>'data'
作为该
Chunk
的标示。
然后是
数据的大小。
紧接着就是
wav
数据。
根据
Format Chunk
中的声道数以及采样
bit
数,
wav
数据的
bit
位置可以分成以下几种形
式:
---------------------------
------------------------------------------
|
单声道
|
取样
1
|
取样
2
|
取样
3
|
取样
4
|
|
|--------------------------
------------------------------
|
8bit
量化
|
声道
0
|
声道
0
|
声道
0
|
声道
0
|
---------------
--------------------------------------------------
----
|
双声道
|
取样
1
|
取样
2
|
|
|--------------------------
------------------------------
|
8bit
量化
|
声道
0(
左
)
|
声道
1(
右
)
|
声道
0(
左
)
|
声道
1(
右
)
|
---------------
--------------------------------------------------
----
|
|
取样
1
|
取样
2
|
|
单声道
|--------------------------
------------------------------
|
16bit
量化
|
声道
0
|
声道
0
|
声道
0
|
声道
0
|
|
|
(
低位字节
)
| (
高位字节
)
|
(
低位字节
)
| (
高位字节
)
|
---------------
--------------------------------------------------
----
|
|
取样
1
|
|
双声道
|
--------------------------------------------------
------
|
16bit
量化
|
声道
0(
左
)
|
声道
0(
左
)
|
声道
1(
右
)
|
声道
1(
右
)
|
|
|
(
低位字节
)
| (
高位字节
)
|
(
低位字节
)
| (
高位字节
)
|
---------------
--------------------------------------------------
----
图
6 w
av
数据
bit
位置安排方式