
WAV
WAV为微软公司(Microsoft)开发的一种声音档案格式,它符合RIFF(Resource Interchange File Format)档案规範,用于保存Windows平台的音频信息资源,被Windows平台及其应用程式所广泛支持,该格式也支持MSADPCM,CCITT A LAW等多种压缩运算法,支持多种音频数字,取样频率和声道,标準格式化的WAV档案和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音档案质量和CD相差无几! WAV打开工具是WINDOWS的媒体播放器。
通常使用三个参数来表示声音,量化位数,取样频率和採样点振幅。量化位数分为8位,16位,24位三种,声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种,不过儘管音质出色,但在压缩后的档案体积过大!相对其他音频格式而言是一个缺点,其档案大小的计算方式为:WAV格式档案所占容量(B) = (取样频率 X量化位数X 声道) X 时间 / 8 (位元组= 8bit) 每一分钟WAV格式的音频档案的大小为10MB,其大小不随音量大小及清晰度的变化而变化。
WAV是最接近无损的音乐格式,所以档案大小相对也比较大。
基本介绍
- 外文名:WAV
- 研发公司:Microsoft
- 作用:保存Windows平台的音频信息资源
- 本质:软体
剖析
WAVE是录音时用的标準的WINDOWS档案格式,档案的扩展名为“WAV”,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种。
Wav File

符合 RIFF(Resource Interchange File Format)规範。所有的WAV都有一个档案头,这个档案头音频流的编码参数。数据块的记录方式是little-endian位元组顺序,标誌符并不是字元串而是单独的符号。
表1 WAV档案的组成
偏移地址 | 大小 位元组 | 数据块 类型 | 内容 |
00H~03H | 4 | 4字元 | 资源交换档案标誌(RIFF) |
04H~07H | 4 | 长整数 | 从下个地址开始到档案尾的总位元组数 |
08H~0BH | 4 | 4字元 | WAV档案标誌(WAVE) |
0CH~0FH | 4 | 4字元 | 波形格式标誌(fmt ),最后一位空格。 |
10H~13H | 4 | 整数 | 过滤位元组(一般为00000010H),若为00000012H则说明数据头携带附加信息(见“附加信息”)。 |
14H~15H | 2 | 整数 | 格式种类(值为1时,表示数据为线性PCM编码) |
16H~17H | 2 | 整数 | 通道数,单声道为1,双声道为2 |
18H~1BH | 4 | 长整数 | 採样频率 |
1CH~1FH | 4 | 长整数 | 波形数据传输速率(每秒平均位元组数) |
20H~21H | 2 | 整数 | DATA数据块长度,位元组。 |
22H~23H | 2 | 整数 | PCM位宽 |
随后 2位元组 | 2 | 整数 | 附加信息(可选,由上方过滤位元组确定) |
随后 | ... | 不定长度字元 | “fact”,该部分是可选部分,一般当WAV档案是由某些软体转换而来时,包含该部分。 若包含该部分: (1)该部分的前4位元组为数据头,一般为4个字母。 (2)随后4个位元组表示长度,即除去头(4位元组)和长度(4位元组)之后,数据本身的长度。 (3)最后的位元组为数据本身。 例如:“66 61 73 74 04 00 00 00F8 2F 14 00” 。 “66 61 73 74”是fact栏位的数据头,“04 00 00 00”是数据本身的长度,“F8 2F 14 00”是数据本身。 (注意是little-endian位元组顺序) |
随后 4位元组 | 4 | 4字元 | 数据标誌符(data) |
随后 4位元组 | 4 | 长整型 | DATA总数据长度位元组 |
随后 | ... | DATA数据块 |
WAV档案作为最经典的Windows多媒体音频格式,套用非常广泛,它使用三个参数来表示声音:採样位数、採样频率和声道数。
Sub 写wav档案(档案名称 As String, 数据() As Integer, Optional 声道数 As Integer = 1, Optional 採样率 As Long = 44100)
档案名称 = App.Path + "./sd/" + 档案名称 + ".wav"
With 新声音
.RIFF = "RIFF" 'Riff WAVE Chunk
Wav File

.档案长度 = UBound(数据) * 2 - 8 + 58 'integer =2bytes
.档案标誌 = "WAVE"
.波形档案标誌 = "fmt "
.块长度 = &H16 '16 or 12?
.格式种类 = 1
.声道数 = 声道数 '0 = 单声道, 1 = 立体声 '2
.採样率 = 採样率 '4
.传送速率 = .採样率 * 2 * .声道数 '4 每秒所需位元组数
.DATA数据块长度 = 2 * .声道数 '2 每个採样所需位元组数
.PCM位宽 = 16 '16位
.m_ = "fact" '4 factchunk
.n = 4 '4 4
.o = 0 '150912? factchunk.data
.数据标识符 = "data"
.DATA总数据长度 = UBound(数据) * 2 '
.DATA数据块 = 数据
End With
Dim fr: fr = FreeFile()
Open 档案名称 For Binary As #fr: Put #fr, , 新声音: Close #fr
End Sub
声道
声道有单声道和立体声之分,採样频率一般有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种。WAV档案所占容量=(採样频率×採样位数×声道)×时间/8(1位元组=8bit)。
WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规範的编码都可以为WAV的音频流进行编码。
音频
音频视频交错格式数据(.AVI) 、波形格式数据(.WAV) 、点阵图格式数据(.RDI) 、MIDI格式数据(.RMI) 、调色板格式(.PAL) 、多媒体电影(.RMN) 、动画游标(.ANI) 、其它RIFF档案(.BND)。
WAVE档案可以存储大量格式的。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE档案的头四个位元组便是“RIFF”。WAVE档案由档案头和数据体两大部分组成。其中档案头又分为RIFF/WAV档案标识段和声音数据格式说明段两部分。WAVE档案各部分内容及格式见附表。
常见的声音档案主要有两种,分别对应于单声道(11.025KHz採样率、8Bit的採样值)和双声道(44.1KHz採样率、16Bit的採样值)。採样率是指:声音信号在“模→数”转换过程中单位时间内採样的次数。採样值是指每一次採样周期内声音模拟信号的积分值。
对于单声道声音档案,採样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音档案,每次採样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE档案数据块包含以脉冲编码调製(PCM)格式表示的样本。WAVE档案是由样本组织而成的。在单声道WAVE档案中,声道0代表左声道,声道1代表右声道。在多声道WAVE档案中,样本是交替出现的。
WAVE档案的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小位元组数。首先存储低有效位元组,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式。
RIFF是英文Resource Interchange File Format的缩写,每个WAVE档案的头四个
位元组便是“RIFF”。
WAVE档案是由若干个Chunk组成的。按照在档案中的出现位置包括:RIFF WAVE
Chunk,Format Chunk,Fact Chunk(可选),Data Chunk。具体见下图:
| RIFF WAVE Chunk |
| ID = 'RIFF' |
| RiffType = 'WAVE' |
| Format Chunk |
| ID = 'fmt '
| Fact Chunk(optional) |
| ID = 'fact' |
| Data Chunk |
| ID = 'data' |
图1 Wav格式包含Chunk示例
RIFF WAVE Chunk
图1

| |所占位元组数| 具体内容 |
| ID | 4 Bytes | 'RIFF' |
| Size | 4 Bytes | |
| Type | 4 Bytes | 'WAVE' |
图2 RIFF WAVE Chunk
以'RIFF'作为标示,然后紧跟着为size栏位,该size是整个wav档案大小减去ID
和Size所占用的位元组数,即FileLen - 8 = Size。然后是Type栏位,为'WAVE',表示是wav档案。
图2

结构定义如下:
struct RIFF_HEADER
{
char szRiffID[4]; // 'R','I','F','F'
DWORD dwRiffSize;
char szRiffFormat[4]; // 'W','A','V','E'
};
Format Chunk
| |位元组数 | 具体内容 |
| ID | 4 Bytes | 'fmt ' |
| Size | 4 Bytes |数值为16或18,18则最后又附加信息 |
| FormatTag | 2 Bytes | 编码方式,一般为0x0001 |
| Channels | 2 Bytes |声道数目,1--单声道;2--双声道 | |
| SamplesPerSec | 4 Bytes | 採样频率
| AvgBytesPerSec| 4 Bytes | 每秒所需位元组数 | |===> WAVE_FORMAT
| BlockAlign | 2 Bytes |数据块对齐单位(每个採样需要的位元组数) | |
| BitsPerSample | 2 Bytes | 每个採样需要的bit数 | |
| | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |
图3 Format Chunk
以'fmt '作为标示。一般情况下Size为16,此时最后附加信息没有;如果为18则最后多了2个位元组的附加信息。主要由一些软体製成的wav格式中含有该2个位元组的
图3

附加信息。
结构定义如下:
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
图4

{
char szFactID[4]; // 'f','a','c','t'
DWORD dwFactSize;
};
Data Chunk
| |所占位元组数| 具体内容 |
| ID | 4 Bytes | 'data' |
| Size | 4 Bytes | |
| data | | |
图5 Data Chunk
Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是
数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及採样bit数,
wav数据的bit位置可以分成以下几种形式:
对于8位单声道,每个样本数据由8位(bit)表示;
对于8位立体声,每个声道的数据由一个8位(bit)数据表示,且第一个8位(bit)
数据表示0声道(左)数据,紧随其后的8位(bit)数据表示1声道(右)数据;
对于16位单声道,每个样本数据由16位(bit)表示;其中低位元组存放高位,高位元组存放低位
对于16位立体声,每个声道的数据由一个16位(bit)数据表示,且第一个16位(bit)
数据表示0声道(左)数据,紧随其后的16位(bit)数据表示1声道(右)数据。
|单声道| 取样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 wav数据bit位置安排方式Data Chunk头结构定义如下:

struct DATA_BLOCK {
char szDataID[4]; // 'd','a','t','a'
DWORD dwDataSize;
};
特点
WAV音频格式的优点包括:简单的编/解码(几乎直接存储来自模/数转换器(ADC)的信号)、普遍的认同/支持以及无损耗存储。WAV格式的主要缺点是需要音频存储空间。对于小的存储限制或小频宽套用而言,这可能是一个重要的问题。WAV格式的另外一个潜在缺陷是在32位WAV档案中的2G限制,这种限制已在为SoundForge开发的W64格式中得到了改善。
Wav

常见的WAV档案使用PCM无压缩编码,这使WAV档案的质量极高,体积也出奇大,对于PCM WAV,恐怕也只有无损压缩的音频才能和其有相同的质量,平时我们见的什幺mp3,wma(不含wmalossless)和wav的质量都是差很远的!这点可以通过频谱看出,即使320kbps的mp3和wav一比,也要自卑了!
支持
Wav格式支持MSADPCM、CCITTALaw、CCITT μ Law和其它压缩算法,支持多种音频位数、採样频率和声道,但其缺点是档案体积较大(一分钟44kHZ、16bit Stereo的WAV档案约要占用10MB左右的硬碟空间),所以不适合长时间记录。
在Windows中,把声音档案存储到硬碟上的扩展名为WAV。WAV记录的是声音的本身,所以它占的硬碟空间大的很。例如:16位的44.1KHZ的立体声声音一分钟要占用大约10MB的容量,和MIDI相比就差的很远。
转换
AVI和WAV在档案结构上是非常相似的,不过AVI多了一个视频流而已。我们接触到的AVI有很多种,因此我们经常需要安装一些Decode才能观看一些AVI,我们接触到比较多的DivX就是一种视频编码,AVI可以採用DivX编码来压缩视频流,当然也可以使用其他的编码压缩。同样,WAV也可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的dDecode,就可以欣赏这些WAV了。
Zen Wav播放器

在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软体都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。
编解码器
WAV档案格式是一种由微软和IBM联合开发的用于音频数字存储的标準,它採用RIFF档案格式结构,非常接近于AIFF和IFF格式。多媒体套用中使用了多种数据,包括点阵图、音频数据、视频数据以及外围设备控制信息等。RIFF为存储这些类型的数据提供了一种方法,RIFF档案所包含的数据类型由该档案的扩展名来标识,能以RIFF档案存储的数据包括:
#音频视频交错格式数据(.AVI)
# 波形格式数据(.WAV)
# 点阵图格式数据(.RDI)
# MIDI格式数据(.RMI)
#调色板格式(.PAL)
#多媒体电影(.RMN)
# 动画游标(.ANI)
# 其它RIFF档案(.BND)
RIFF是一种含有嵌套数据结构的二进制档案格式,每个数据结构都称为因一个chunk(块)。Chunk在RIFF档案中没有固定的位置,因而偏移量不能用于定位域值。一个块中的数据包括数据结构、数据流或其它组块(称为子块)等,每个RIFF块都具有如下结构:
typedef struct _Chunk{
VB中播放WAV档案的VB界面

DWORD ChunkId; /*块标誌*/
DWORD ChunkSize; /*块大小*/
BYTE ChunkData[ChunkSize]; /*块内容*/
} CHUNK;
ChunkId由4个ASCII字元组成,用以识别块中所包含的数据。字元RIFF用于标识RIFF数据块,间隔空格在右面是不超过4个字元的ID。由于这种档案结构最初是由Microsoft和IBM为PC机所定义,RIFF档案是按照little-endian位元组顺序写入的,而採用big-endian位元组顺序的档案则用‘RIFX’作为标誌。
ChunkSize(块大小)是存储在ChunkData域中数据的长度,ChunkId与ChunkSize域的大小则不包括在该值内。
ChunkData(块内容)中所包含的数据是以字(WORD)为单位排列的,如果数据长度是奇数,则在最后添加一个空(NULL)位元组。
子块(Subchunk)与块具有相同的结构。一个子块就是包含在其它块内部的一个块,只有RIFF档案块‘RIFF’和列表块‘List’才能含有子块,所有其它块仅能含有数据。一个RIFF档案就是一个RIFF块,档案中所有其它块和子块均包含在这个块中。
WAV档案可以存储大量格式的数据,通常採用的音频编码方式是脉冲编码调製(PCM)。由于WAV格式源自Windows/Intel环境,因而採用Little-Endian位元组顺序进行存储。
脉冲编码调製
Claude E. Shannon于1948年发表的“通信的数学理论”奠定了现代通信的基础。同年贝尔实验室的工程人员开发了PCM技术,虽然在当时是革命性的,但今天脉冲编码调製被视为是一种非常单纯的无损耗编码格式,音频在固定间隔内进行採集并量化为频带值,其它採用这种编码方法的套用包括电话和CD。PCM主要有三种方式:标準PCM、差分脉冲编码调製(DPCM)和自适应DPCM。在标準PCM中,频带被量化为线性步长的频带,用于存储绝对量值。在DPCM中存储的是前后电流值之差,因而存储量减少了约25%。自适应DPCM改变了DPCM的量化步长,在给定的信噪比(SNR)下可压缩更多的信息。
执行过程
在对WAV音频档案进行编解码过程中,最一致的地方包括採样点和採样帧的处理和转换。一个採样点的值代表了给定时间内的音频信号,一个採样帧由适当数量的採样点组成并能构成音频信号的多个通道。对于立体声信号一个採样帧有两个採样点,一个採样点对应一个声道。一个採样帧作为单一的单元传送到数/模转换器(DAC),以确保正确的信号能同时传送到各自的通道中。
VB中WAV
综述
在多媒体软体的开发设计中,声音是一个相当重要的多媒体元素,优秀的声音设计会为多媒体软体增色不少。而WAV格式的声音档案是一种最常用的声音档案格式,也最容易得到,比如通过Win 95中的“录音机”程式,利用麦克风就可以非常简单地录製WAV档案。VB是一个相当经典的多媒体开发的工具,在VB中播放WAV档案的方法主要有这样几种。
OLE控制项
建一窗体,用滑鼠选择OLE控制项,在窗体上拖出OLE区域,在图一的视窗中选择新建和声音然后按确定键就完成了在视窗中添加OLE控制项。
这样就可以在OLE控制项的ResourceDoc属性中选择所要播放的档案,程式运行时双击OLE控制项即可。
在实际的程式设计当中,往往需要单击某个图示或按钮来控制声音的播放,其实现方法是这样的:首先将OLE控制项的VISIBLE属性设定为FALSE,然后在图示或按钮的单击事件中编写如下的程式:
Private Sub Contol_Click()
OLE1.Action = 7
End Sub
MMControl控制项
VB5.0提供了许多设计多媒体的控制项,在PROJECT/COMPENENTS/CONTROLS中选择MMControls 控制项,窗体上就出现了多媒体控制项对象,在这个对象上有不同的图形功能标识,其名称从左到右分别是Pre、Next、Play、Pause、Back、Step、Stop、Record 、Eject。
这个多媒体控制项可以播放多种格式的声音,播放WAV格式声音档案的程式代码
Private Sub form_load()
MMControl1.DeviceType = "waveaudio"
MMControl1.filename = "c:\win95\media\ding.wav"
MMControl1.Command = "open"
End Sub '以下是为图形标识Play事件编写的代码
Private Sub MMControl_playclick(cancel As Integer)
MMControl1.Command = "play"
End Sub
当运行这个程式时,MMControl控制项中的Play键被激活,点取此按钮即可播放ding.wav档案。
在实际的软体设计当中,更多的情况是滑鼠点击按钮或图示来控制声音的播放,其实现方法是这样的:首先将MMControl控制项的VISIBLE属性设定为FALSE,然后在图示或按钮的单击事件中编写如下的程式:
Private Sub Control1_Click()
MMControl1.Command = "play"
End Sub
运行程式时单击相用的按钮或图示,WAV档案照样可以播放。用自行设计的按钮或图示取代多媒体控制项中的固定按钮,可设计出更加灵活方便的用户界面。
VB的API函式
在窗体的DECLARATIONS(声明)中输入如下代码:
P rivate Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal_lpszSoundName As String,ByVal uFlags As Long) As Long
'lpszSoundName是一个字元串变数,表示一个WAV格式的档案名称。
'uFlags 用于设定播放状态的各种选项。参数值为0X00时,实现同步播放,参数值为0X01时实现非同步播放。
在命令按钮的单击事件中输入如下代码:
Private Sub Command1_Click()
Dim plays As Long
plays = sndPlaySound(“E:\WINDOWS\MEDIA\DING.WAV",&H0)
End Sub
运行时单击命令按钮即可播放WAV档案。