|
数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。
f, ]& e' q3 }/ ^- TWAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。9 m7 `7 t) x; d) K
WAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。* l8 w; w# N; l$ b. w
WAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。符合 PIFF Resource Interchange File Format规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。
' v2 j0 N u/ a9 H, s8 N0 E
! S7 f1 v, d7 t7 B7 ], \
3 H. N8 o1 N& t, c: J$ ]; T: ~WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。
: g' m: x/ u- q% n9 d' M# j多媒体应用中使用了多种数据,包括位图、音频数据、视频数据以及外围设备控制信息等。RIFF为存储这些类型的数据提供了一种方法,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:
+ V8 t' H4 d1 I# T T: K8 [8 x音频视频交错格式数据(.AVI) 、波形格式数据(.WAV) 、位图格式数据(.RDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动画光标(.ANI) 、其它RIFF文件(.BND)。
+ h2 v; g. X2 Y7 a* u- E( Jwave文件有很多不同的压缩格式,所以,正确而详细地了解各种WAVE文件的内部结构是成功完成压缩和解压缩的基础,也是生成特有音频压缩格式文件的前提。' P0 {- N) v! n# g; E
最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成PCM格式,然后再让声卡来播放 [1] 。
8 i. n# `4 x/ v3 C) R: }2 I内部结构
1 p( r4 r3 U1 {: W5 e注:由于WAV格式源自Windows/Intel环境,因而采用Little-Endian字节顺序进行存储。: H0 N/ K7 Y4 R& K( ?- L
WAVE文件是以RIFF(Resource Interchange File Format, "资源交互文件格式")格式来组织内部结构的。
% W* q/ {- {3 \& F+ `+ BRIFF文件结构可以看作是树状结构,其基本构成是称为"块"(Chunk)的单元,最顶端是一个“RIFF”块,下面的每个块有“类型块标识(可选)”、“标志符”、“数据大小”及“数据”等项所组成。块的结构如下表所示:
$ j' ^% j( Y4 `5 }8 I7 F# {9 |1 g* B4 e4 F
, m* e7 Z5 }% B6 @7 N" o9 Q
名称6 V( A' N/ R: Q. x
| Size3 d3 P3 {* x8 k4 ^
| 备注
* x3 D4 Q' f$ Z: J( O | 块标志符6 o7 ^) _2 L6 @( j( z4 j/ ^
| 4. {+ Q9 z" U- ~! q; f
| 4个小写字符(如 "fmt ", "fact", "data" 等)( ^" V0 C3 j) V
| 数据大小: j" D9 D3 f) N
| 4( a7 p$ B- B1 L2 Z' {* F
| DWORD类型,表示后接数据的大小(N Bytes)
- \! X3 H/ `: K% J( r; X. _ | 数据# s3 F5 S" _" p1 ^1 c& M# o& u
| N3 _1 U. Q8 u }$ R7 ]4 D/ d5 a
| 本块中正式数据部分& j+ c0 S7 D" D& c- _9 Z
| 上面说到的“类型块标识”只在部分chunk中用到,如 "WAVE" chunk中,这时表示下面嵌套有别的chunk。/ \7 u/ ?% |6 V: j+ z5 |) A
当使用了 "类型块标识" 时,该chunk就没有别的项(如块标志符,数据大小等),它只作为文件读取时的一个标识。先找到这个“类型块标识”,再以它为起点读取它下面嵌套的其它chunk。& M$ }. y( F U- J* x1 d" n* q1 h
每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。
4 @* V0 p Y a& A8 f, T) ~非PCM格式的文件会至少多加入一个 "fact" 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 "fact" 块一般加在 "data" 块的前面。
$ _9 M8 P/ Q: C# a, jWAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下表:
- c2 L1 Q4 @/ ]6 N+ @& Z-------------------------------------------$ J. c/ ~3 W# x1 n; R% Z5 z
| RIFF WAVE Chunk |
7 Y- J1 z R8 i| ID = "RIFF" |. E- L4 J5 S1 S' G
| RiffType = "WAVE" |
! T" Z7 O& L! j9 s& o-------------------------------------------
/ e0 \$ Z& C& f; E| Format Chunk |4 j9 G/ A Y$ r
| ID = "fmt " |
* ^8 C* Y2 q, m9 o0 E, ~" g-------------------------------------------
4 `4 H1 m/ ]7 |4 ^% \; N' R| Fact Chunk(optional) |
) }1 n3 f4 y- t+ b! m' E; E! i' s| ID = "fact" |
2 @# B8 f/ A$ V: V" g( @" W, f-------------------------------------------, b1 Y# t* J* H/ X+ S: F# J
| Data Chunk |8 [+ g# J9 z: Z4 q3 H$ F8 h( c
| ID = "data" |% T% E. r3 ]9 d" K% C# M
-------------------------------------------1 R+ K- d: N+ ^/ A7 Q
Wav格式包含Chunk示例# s. @9 H: e9 U4 C3 U7 g% s$ ?4 w, p
Fact Chunk
+ C. U' U: v2 G" {& N8 d% C=======================================& ?' k$ L3 ?6 M* R' E
| |所占字节数|具体内容 |
$ x* P0 \( q* O0 ]& T5 \7 Q=======================================
8 P6 m5 M1 f! q4 r$ U6 ?8 @/ H& c; a1 ]| ID | 4Bytes | "fact" |
9 i/ l$ U7 c5 I# P---------------------------------------; M7 l: {) Y( x; G: l2 S8 s5 [
| Size | 4Bytes | 4 |
) T' a( G/ c. Z( A8 r9 q6 A---------------------------------------
2 B$ L4 K' @9 ^$ t x- Y: j3 ]0 f| data | 4Bytes |解压后的音频数据的大小(B)|
. W# V. P5 Z. ~( y' G0 q/ I3 Q+ f' @8 d$ x% P; q
别名 字节数 类型 注释2 c* D( `* s* L0 P" k
ckid 4 char "RIFF" 标志, 大写
% `1 q( Z2 ~; M* _6 o scksize 4 int32 文件长度。这个长度不包括"RIFF"标志 和文件长度 本身所占字节, 下面的 子块大小也是这样。
0 H; I: K4 a& X9 Ufcc type 4 char "WAVE" 类型块标识, 大写。
8 ]3 E7 |7 v$ e2 Vckid 4 char 表示"fmt" chunk的开始。此块中包括文件内部格式信息。小写, 最后一个字符是空格。
- _( N" i4 F+ \! I7 lcksize 4 int32 文件内部格式信息数据的大小。6 ~ }7 i! `$ c. y* Z0 V0 x6 H
FormatTag 2 int16 音频数据的编码方式。1 表示是 PCM 编码: Q7 e# Q- r* G! y% o
Channels 2 int16 声道数,单声道为1,双声道为2
& d, ^5 r+ u/ t% U1 O1 |/ RSamplesPerSec 4 int32 采样率(每秒样本数), 比如 44100 等
6 ^4 d- P( {/ J; Y. {BytesPerSec 4 int32 音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件 利用此值可以估计缓冲区的大小。
0 Z V! \- |) |+ _3 ^& uBlockAlign 2 int16 每次采样的大小 = 采样精度*声道数/8(单位是字节); 这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
6 ~2 b' J0 K4 i: l) _; M. g) iBitsPerSample 2 int16 每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的。" y" [5 x1 q4 L/ p
[cbsize] 2 int16 [可选]附加数据的大小。
1 O" ^+ t" u3 K9 n9 @8 |[...] x- a) Z' Q0 ~4 I# d
[ckid] 4 char "fact".5 j/ v7 z- Q3 g$ G: u- Z* g' j
[cksize] 4 int32 "fact" chunk data size.
# Y( S. O- e5 D% C, Z' X+ O' e[fact data] 4 int32 解压后的音频数据的大小(Bytes).: Z/ J! G; o g# @
ckid 4 char 表示 "data" chunk的开始。此块中包含音频数据。小写。8 X$ g5 B2 U& y) y/ w
cksize 4 int32 音频数据的长度3 a& B$ h3 N, H# n9 Z9 f' H1 Q
...... 文件声音信息数据(真正声音存储部分)
/ P" H0 _1 t8 M[......] 其它 chunk |
|