WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format,RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!
WAV通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。
WAV符合RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。示意图如下:
一个WAV文件,首先是一个RIFF chunk,其格式类型为'WAVE'。RIFF chunk包括两个子chunk,ID分别为 'fmt '和'data',还有一个可选的Fact chunk。Format chunk用于表示音频数据的属性,包括编码方式、声道数目、采样频率、每个采样需要的bit数等等信息。Fact chunk是一个可选chunk,一般当WAVE文件由某些软件转化而成就包含Fact chunk。Data chunk包含WAVE文件的数字化波形声音数据。WAVE整体结构如下图所示:
接下来讲讲各个chunk的具体内容。
备注:这个区域只需要关心channels,sample_rate,bits_per_sample三个参数就可以了,其它的都是依据这三个计算出来的。
fact chunk为可选的,在大多数的WAV文件中是不存在的。采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。
ID:4字节,值为"fact"。
Size:4字节,数据字段的长度,其值最小为4。
Data:采样总数。
ID:4字节,值为"data"。
Size:4字节,音频数据的长度。
Data:具体的音频数据内容存放在这里。
在format chunk中,有一个字段audio_format,该字段表示音频数据是以何种方式进行编码存放的。其可选的取值有:
0x0001:WAVE_FORMAT_PCM,采用PCM格式,此时WAV文件中不包含Fact chunk。
0x0002:WAVE_FORMAT_ADPCM,此时WAV文件中包含Fact chunk。
0x0006:WAVE_FORMAT_ALAW,此时WAV文件中包含Fact chunk。
0x0007:WAVE_FORMAT_MULAW,此时WAV文件中包含Fact chunk。
0xFFFE:WAVE_FORMAT_EXTENSIBLE,具体的编码方式由Format chunk中扩展块的sub_format字段决定。
备注:一般情况下,我们遇到的WAV文件的音频数据编码格式是PCM,介绍上述内容,只是让大家多了解下其他的编码格式的值与名称,当遇到这类编码时,能够知道其名称,从而方便查询相关资料。
当WAV文件使用的不是PCM编码方式时,就需要扩展格式块,它是在基本的Format chunk中又添加一段数据。该数据的前两个字节,表示的是扩展块的长度。紧接其后的是扩展块的数据区,含有扩展的格式信息,其具体的长度取决于压缩编码的类型。当某种编码方式的扩展块的数据区长度为0,此时扩展块只包含了扩展块长度字段,扩展块的长度字段还必须保留,只是其值设置为0。
扩展块的各个字节的含义如下:
在Format chunk中的audio_format设置为0xFFFE时,表示使用扩展区中的sub_format来决定音频的数据的编码方式。在以下几种情况下必须要使用WAVE_FORMAT_EXTENSIBLE:
备注:一般情况下,我们遇到的WAV文件中是不含有扩展块的。
Data chunk中的Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推….。
对于Data chunk中的Data字段,也就是音频数据内容的存储,根据声道数和采样位数的不同情况,布局如下(每1列代表8 bits):
采样1 | 采样2 |
---|---|
数据1 | 数据2 |
采样1 | 采样2 | ||
---|---|---|---|
声道1数据1 | 声道2数据1 | 声道1数据2 | 声道2数据2 |
采样1 | 采样2 | ||
---|---|---|---|
数据1低字节 | 数据1高字节 | 数据2低字节 | 数据2高字节 |
声道1采样1 | 声道2采样1 | ||
---|---|---|---|
声道1数据1低字节 | 声道1数据1高字节 | 声道2数据1低字节 | 声道2数据1高字节 |
声道1采样2 | 声道2采样2 | ||
声道1数据2低字节 | 声道1数据2高字节 | 声道2数据2低字节 | 声道2数据2高字节 |
利用winhex工具软件可以非常方便的以十六进制查看文件,下图是我用winhex软件打开一个WAV音频文件时的部分界面截图:
下表对文件格式进行解读:
偏移地址 | 字节数 | 16进制源码 | 内容 |
---|---|---|---|
00H | 4 | 52 49 46 46 | 'RIFF'标识符 |
04H | 4 | F4 FE 83 01 | 数据长度:0x0183FEF4(注意顺序) |
08H | 4 | 57 41 56 45 | 'WAVE'标识符 |
0CH | 4 | 66 6D 74 20 | 'fmt ',最后一位为空格 |
10H | 4 | 10 00 00 00 | Format chunk大小:0x10 |
14H | 2 | 01 00 | 编码格式:0x01为PCM |
16H | 2 | 02 00 | 声道数目:0x02为双声道 |
18H | 4 | 44 AC 00 00 | 采样频率:0xAC44表示44100Hz |
1CH | 4 | 10 B1 02 00 | 每秒字节数:0x02B110 |
20H | 2 | 04 00 | 每个采样点所需的字节数:0x04 |
22H | 2 | 10 00 | 量化位数:0x10 |
24H | 4 | 64 61 74 61 | 'data'标识符 |
28H | 4 | 48 FE 83 01 | 音频数据的长度:0x0183FE48 |
从偏移量2CH开始就是音频数据了。
如果这篇文章对你有帮助,记得点赞和关注博主就行了。
欢迎关注博主,阅读博主其他的博文。
@Ailson Jack