wav文件格式分析.docx
《wav文件格式分析.docx》由会员分享,可在线阅读,更多相关《wav文件格式分析.docx(26页珍藏版)》请在冰豆网上搜索。
![wav文件格式分析.docx](https://file1.bdocx.com/fileroot1/2022-10/12/cc2f1abb-fa8b-47b3-9c61-76f64e83b2f7/cc2f1abb-fa8b-47b3-9c61-76f64e83b2f71.gif)
wav文件格式分析
一.RIFF概念
在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格
式"(ResourcesInterchangeFileFormat),简称RIFF。
例如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。
RIFF可以看做是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由"辨别码">'数据大小"及"数据"所组成。
块的标志符(4BYTES)
数据大小(4BYTES)
数据
图一、块的结构示意图
辨别码由4个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也
用掉4个Byte,所以事实上一个chunk的长度为数据大小加8。
一般而言,chunk本身并不允许内部再包
含chunk,但有两种例外,分别为以"RIFF"及"L1ST"为辨别码的chunk。
而针对此两种chunk,RIFF又从
原先的"数据"中切出4个Byte。
此4个Byte称为"格式辨别码",然而RIFF又规定文件中仅能有一个以
"RIFF"为辨别码的chunk。
RIFF/LIST标志符
数据1大小
数据1
格式/列表类型
数据
图二、RIFF/LIST块结构
只要依循此一结构的文件,我们均称之为RIFF档。
此种结构提供了一种系统化的分类。
如果和MS—DOS
文件系统作比较,"RIFF"chunk就好比是一台硬盘的根目录,其格式辨别码便是此硬盘的逻辑代码(C:
或
D:
),而"L1ST"chunk即为其下的子目录,其他的chunk则为一般的文件。
至于在RIFF文件的处理方面,微软提供了相关的函数。
视窗下的各种多媒体文件格式就如同在磁盘机下规定仅能放怎样的目录,而在该目录下仅能放何种数据。
二.WAV文件格式
WAVE文件是非常简单的一种RIFF文件,它的格式类型为"WAVE"。
RIFF块包含两个子块,这两个子块
的ID分别是"fmt"和"data",其中"fmt"子块由结构PCMWAVEFORMAT所组成,其子块的大小就是sizeofof(PCMWAVEFORMAT),数据组成就是PCMWAVEFORMAT结构中的数据。
标志符(RIFF)
数据大小
格式类型("WAVE")
"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT
"data"
声音数据大小
声音数据
图三、WAVE文件结构
PCMWAVEFORMAT结构定义如下:
Typedefstruct
曰田…{
WAVEFORMATwf;/波形格式;
WORDwBitsPerSample;//WAVE文件的采样大小;
}PCMWAVEFORMAT;
//WAVEFORMAT结构定义如下:
typedefstruct
曰田…{
WORDwFormatag;//编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORDnChannls;//声道数,单声道为1,双声道为2;
DWORDnSamplesPerSec;〃采样频率;
DWORDnAvgBytesperSec;//每秒的数据量;
WORDnBlockAlign;//块对齐;
L
}WAVEFORMAT;
"data"子块包含WAVE文件的数字化波形声音数据,其存放格式依赖于"fmt"子块中wFormatTag成员指定的格式种类,在多声道WAVE文件中,样本是交替出现的。
如16bit的单声道WAVE文件和双声道WAVE文件的数据采样格式分别如图四所示:
16位单声道:
采样一
采样二
低字节
高字节
低字节
高字节
16位双声道:
采样一
左声道
右声道
低字节匸
二高字节
低字节
高字节
图四、WAVE文件数据采样格式
WAV文件格式实例分析:
O
1
23
4
5
6
7
8
9AB
C
D
E
F
OOOOOOOOH
52
49
46
46
OA
O6
O1
OO
57
4156
45
66
6D
74
2O
OOOOOO1OH
12
OO
OO
OO
O1
OO
O2
OO
44
ACOOC
O
1O
B1
O2
OO
OOOOOO2OH
O4
OO
1O
OO
OO
OO
66
61
63
74O4
OO
OO
OO
76
41
OOOOOO3OH
OO
OO
64
61
74
61
D8
O5
O1
OOOO
OO
OO
OO
FF
FF
偏移
地址
字
节
数
内容
文
OOH
4
char
“RIFF”;IFF标志
件
头
O4H
4
ong
int
0x0001060A(注意数据存储顺序);文件长度
O8H
4
char
“WAVE;WAVE标志
OCH
4
char
“fmt"fmt标志,最后一位为空
1OH
4
ong
nt
0x12;sizeof(PCMWAVEFORMAT)
14H
2
int
1(WAVE_FORMAT_PCM);格式类别,1表示为PCM形式的声音数据
16H
2
int
2;通道数,单声道为1,双声道为2
18H
2
nt
44100;采样频率(每秒样本数)
1CH
4
ong
int
Cx10B10000;每秒数据量;其值为通道数X每秒数据位数X每样本的数据位数/8。
播放软件利用此值可以估计缓冲区的大小。
2OH
2
nt
数据块的调整数(按字节算的),其值为通道数X每样本的数据位值/8。
播放软件
需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
22H
2
n
每样本的数据位数,表示每个声道中各个样本的数据位数。
如果有多个声道,对每个声道而言,样本大小都一样。
5OH
4
char
“data”数据标记符
54H
4
ong
int
0x000105D8;语音数据大小
0OOOOO4OH
00OOFEFFFEFF
OOOOOOOOFE
FFFEFFOOOO
wav文件格式分析
虽然自己是搞视频图像的,不过偶尔看看音频方面的资料也是可以调节一下的
下面就来分析一下
wav波形文件的格式。
我们先随便找一个
wav文件,查看其属性,就能得到下面的结果。
文件类塑•
波形声音Crtv)
扌T开方式:
口Tindows>editPlayi
更改©…
便B:
C:
WswrcVteVksklop
大小;
1.2&MB(1,^044宇节>|
占用空闫;
1.2$MB(1,327,104亨节》
创踽耳
2012*10月16曰・21:
42:
43
惟改时闻:
20122fl0月1&吕.21:
42:
43
访问B扌间
2012^10月W日.21:
42:
43
属性:
二只读值)二硼QD
[鬲级@)二n
厂确定「[翊]应用射
上面主要注意文件大小,声音长度与比特率。
文件占用空间就不用关心了,如果有人想知道为什么文件占用空间比文件大小要大,我在这
里也解释一下。
这和文件在硬盘中的组织方式有关系,这里的硬盘分区是以最小4096Byte为
单位的,我文件的大小是1325044Byte,那么1325044/4096=323.49,为了能把文件对齐
的放到硬盘中,所以占用的空间就要是324*4096=1327104Byte了,所以占用的空间就是
这么多了。
你也可以建立一个只写一个字母的txt文件试试,文件大小虽然为IByte,不过占
用空间也为4096Byte。
wav文件的问题。
上面说的当然和wav文件没什么关系,下面就正式说
用ultraedit打开就是下面这个样子:
Cj\Use^s^c\De$lc*op\output.•
打幵
却旦S3列豪・订
诵谴
电.冲
岡
ff日
HLm
*3
B:
€:
01
*崛瞬
i*兮Efflfc客
▲峯務輕踐日期
g
*
V
j|.
&
o
£
g
<
q
A.
f
oooooooon
52
49
46
专召
8:
匚
s?
14
37
41
5庁
佃
£6
6D
齐
50
r
aim
00000010;!
10
00
00
00
01
0D
01
co
11
ZB
00
00
22
5€
00
00
皿口□0020J1
02
00
10
QQ
61
71
61
匚d
□7
OQ
00
00
00
00
■tiA4'(
0000003011
00
oa
oo
00
oo
g
00
co
oo
oa
oo
00
oa
QQ
oo
OQ
OOQOOQt^h
•■2
oa
(JO
00
oo
go
oo
Cd
ao
00
oo
go
oo
QO
go
oa
OOOOOOS&f:
00
QQ
0Q
g
oo
00
go
00
oo
00
oo
00
QQ
QQ
oo
oo
QQQQQQG&h
go
aa
00
00
QQ
g
QQ
00
QQ
00
oo
QQ
00
oo
QQ
QQ
Q^QQQQ^rH
QQ
□o
50
00
□a
(JO
00
00
□□
oo
0D
OO
QO
oo
oo
00
OOOOOOSOh
00
00
g
00
00
00
00
cc
00
oc
00
00
03
oo
00
00
f
03000090h
eo
no
GO
od
DO
db
00
co
00
00
Ofl
09
GO
00
00
«■«■.
nOOOOOa&h
00
00
3D
00
no
00
oo
no
00
oo-
oo
oo
00
oo
00
oo
COOOOObOh
00
00
00
00
00
00
00
oc
□o
00
oo
00
oo
00
GO
oo
OOOOOOcOh
co
oo
oo
GO
oo
0D
QO
co
00
00
00
oo
oo
oo
00
oo
ODOOOOdGh
00
00
00
00
00
00
00
DC
ao
00
oo
oo
oo
oo
00
oo
OOOOOOeOh
00
00
00
00
00
00
00
co
00
00
00
0