|
数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。
) h2 v, |* A: s( c* i4 L5 WWAVE文件是计算机领域最常用的数字化声音文件格式之一,它是微软专门为Windows系统定义的波形文件格式(Waveform Audio),由于其扩展名为"*.wav"。
+ Q2 N: I9 a, Z, NWAVE是录音时用的标准的WINDOWS文件格式,文件的扩展名为“WAV”,数据本身的格式为PCM或压缩型。
: ]. \; r0 q5 ]; i. K9 kWAV文件格式是一种由微软和IBM联合开发的用于音频数字存储的标准,它采用RIFF文件格式结构,非常接近于AIFF和IFF格式。符合 PIFF Resource Interchange File Format规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。* `3 A0 e [6 @% o1 n
: e* g; Z& }: z
' o, T, l" B0 M" j" D! C4 [WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。
, r! H T2 _7 m" ]& r7 H多媒体应用中使用了多种数据,包括位图、音频数据、视频数据以及外围设备控制信息等。RIFF为存储这些类型的数据提供了一种方法,RIFF文件所包含的数据类型由该文件的扩展名来标识,能以RIFF文件存储的数据包括:& M: k5 V1 J! L0 {( J
音频视频交错格式数据(.AVI) 、波形格式数据(.WAV) 、位图格式数据(.RDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动画光标(.ANI) 、其它RIFF文件(.BND)。
% {+ L; K' }# A v% j# @5 e$ hwave文件有很多不同的压缩格式,所以,正确而详细地了解各种WAVE文件的内部结构是成功完成压缩和解压缩的基础,也是生成特有音频压缩格式文件的前提。' Q+ y% X' n2 u* j
最基本的WAVE文件是PCM(脉冲编码调制)格式的,这种文件直接存储采样的声音数据没有经过任何的压缩,是声卡直接支持的数据格式,要让声卡正确播放其它被压缩的声音数据,就应该先把压缩的数据解压缩成PCM格式,然后再让声卡来播放 [1] 。5 x/ N5 Z. P2 w! b5 B
内部结构
: F. u. w2 a4 p/ }注:由于WAV格式源自Windows/Intel环境,因而采用Little-Endian字节顺序进行存储。) R0 b: u2 K* q4 S9 a0 Q- c
WAVE文件是以RIFF(Resource Interchange File Format, "资源交互文件格式")格式来组织内部结构的。2 ~; F0 F) d! h$ ]. Z6 Q& i$ c# s
RIFF文件结构可以看作是树状结构,其基本构成是称为"块"(Chunk)的单元,最顶端是一个“RIFF”块,下面的每个块有“类型块标识(可选)”、“标志符”、“数据大小”及“数据”等项所组成。块的结构如下表所示:
% M( ?$ A! r" i$ O" R3 l5 F2 Y$ S4 r
\; V8 t: O t `0 ? P, q7 `# q6 \2 x3 ?
名称
0 i6 l% J1 x. _' O" N8 i | Size
# ^7 u" |* |$ s | 备注
& a+ Y) \( u4 z! W5 A# s | 块标志符
c1 h( n& a; w V | 4
* m; `* O# ` `7 S | 4个小写字符(如 "fmt ", "fact", "data" 等)/ Z! C9 w s1 ]2 m. P
| 数据大小
' I. I& U2 A; @5 M* m% N; ?( X* y | 4
9 `# K2 @" n2 p& g! T. B$ U | DWORD类型,表示后接数据的大小(N Bytes)8 f& ~9 T9 Y5 S4 `/ q1 b" p7 P
| 数据
' l) }$ |8 L2 z2 k% `6 d2 F | N) a8 W# V0 K* t, d
| 本块中正式数据部分
0 c J5 P1 G7 t! n* I | 上面说到的“类型块标识”只在部分chunk中用到,如 "WAVE" chunk中,这时表示下面嵌套有别的chunk。& i9 w9 {, n* \; {
当使用了 "类型块标识" 时,该chunk就没有别的项(如块标志符,数据大小等),它只作为文件读取时的一个标识。先找到这个“类型块标识”,再以它为起点读取它下面嵌套的其它chunk。
& Y% a q1 ]/ F" P6 E" f每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。/ I4 H+ }3 h" A2 p
非PCM格式的文件会至少多加入一个 "fact" 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 "fact" 块一般加在 "data" 块的前面。9 l/ i2 W& {2 Y. D; p
WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下表:
5 N; ~: p6 i+ [& v, H-------------------------------------------
! s, `; x) X; M, m% q| RIFF WAVE Chunk |' z o; a. i8 G& a/ [+ O
| ID = "RIFF" |
* r, z/ s' o2 _2 e% z| RiffType = "WAVE" |
) X9 d- @2 J# Y4 u-------------------------------------------1 i" S# x6 E5 g. m) _
| Format Chunk |& j5 R9 j. k4 v2 f8 \) A9 T
| ID = "fmt " |
; z, [/ |+ O( J% L o------------------------------------------- E% |9 \' r% k( i K8 u2 z# J
| Fact Chunk(optional) |
; {/ N; Z, m% y& V. D3 v7 R| ID = "fact" |
8 y; D5 W* H2 n" B" H% v1 h r( O-------------------------------------------
$ D6 g; d, h7 S$ b- p| Data Chunk |
# F- O+ D1 q1 f: Y, G+ B| ID = "data" |
; B- Z9 U" u4 U k-------------------------------------------- x8 a0 c- v+ l5 z- C$ Q9 S
Wav格式包含Chunk示例
: e, `. k- T! N5 V* y% W N9 `Fact Chunk9 h8 }; I" I5 i) u! M
=======================================- i4 n& j+ ^# F1 n, J* S5 X
| |所占字节数|具体内容 |4 o% c6 Y" v8 |% y$ N# p0 x5 ^
=======================================
8 g8 f3 H, H" i% n l| ID | 4Bytes | "fact" |. [/ X1 E; J. I* d; i; w
---------------------------------------
K. j+ I9 {/ q8 e1 x; x| Size | 4Bytes | 4 |
# H7 A5 c& i) O$ G2 E! v---------------------------------------: I! W; P! e* e$ \, I. B: i
| data | 4Bytes |解压后的音频数据的大小(B)|( z# m4 Z& ]. c) ]7 I
" Q' s9 M) Q. l别名 字节数 类型 注释% k0 s, k6 C) h# S6 n3 h! @1 |
ckid 4 char "RIFF" 标志, 大写
; \" G) G& S- P- y5 R) }cksize 4 int32 文件长度。这个长度不包括"RIFF"标志 和文件长度 本身所占字节, 下面的 子块大小也是这样。" C3 H5 {/ S% V9 _( O8 D' Y
fcc type 4 char "WAVE" 类型块标识, 大写。
' w+ O& R( H, P. Jckid 4 char 表示"fmt" chunk的开始。此块中包括文件内部格式信息。小写, 最后一个字符是空格。
1 J) |6 m% _7 ^- Z" fcksize 4 int32 文件内部格式信息数据的大小。
$ L# e. ~8 X. HFormatTag 2 int16 音频数据的编码方式。1 表示是 PCM 编码! J! S) O X, U' _1 s
Channels 2 int16 声道数,单声道为1,双声道为2
- f; e& g/ a5 q* v) s7 YSamplesPerSec 4 int32 采样率(每秒样本数), 比如 44100 等9 Y/ V/ F5 ^- B
BytesPerSec 4 int32 音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件 利用此值可以估计缓冲区的大小。
( J+ e8 c6 p: Y. f MBlockAlign 2 int16 每次采样的大小 = 采样精度*声道数/8(单位是字节); 这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
3 h' n* ?4 t* ZBitsPerSample 2 int16 每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的。& Y4 f1 U9 W7 K
[cbsize] 2 int16 [可选]附加数据的大小。- H, q7 U, f- i& F: c) X( V$ c9 B# Q6 U
[...] x
% s: A2 a1 g% B$ y[ckid] 4 char "fact".
- m' v; y5 H) z# T4 L1 l[cksize] 4 int32 "fact" chunk data size.
! f" k# q/ h2 Y. `- v- Z[fact data] 4 int32 解压后的音频数据的大小(Bytes).( E2 r3 b: X Z% v+ m: n9 X
ckid 4 char 表示 "data" chunk的开始。此块中包含音频数据。小写。
3 K6 D, a5 g# k4 f1 R0 H) q: j2 k6 Vcksize 4 int32 音频数据的长度
. o6 V9 @% V$ ~0 j# ?* O$ S...... 文件声音信息数据(真正声音存储部分)3 k* H: {4 S! E: Y1 e$ ~6 W8 f
[......] 其它 chunk |
|