WAV文件格式详解

描述

1、WAV文件概述

WAV是微软公司开发的一种音频格式文件,用于保存Windows平台的音频信息资源,它符合资源互换文件格式(Resource Interchange File Format,RIFF)文件规范。标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几!

WAV通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。

2、WAV文件格式

WAV符合RIFF文件格式标准,可以看作是RIFF文件的一个具体实例。既然WAV符合RIFF规范,其基本的组成单元也是chunk。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。示意图如下:

文件

2019-10-21_162529

一个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整体结构如下图所示:

文件

2019-10-21_162508

接下来讲讲各个chunk的具体内容。

3、各个chunk的具体内容

(1).RIFF chunk

ID:4字节,值为"RIFF"。

Size:4字节,ChunkData字段中数据的大小,单位:字节。

ChunkData:包含FormType和其他chunk的内容。

FormType:4字节,值为"WAVE"。

Data:其他chunk的内容。

(2).Format chunk

ID:4字节,值为"fmt ",最后一个字符是空格。

Size:4字节,数据字段(Data)包含的数据大小。如无扩展块,则值为16;有扩展块,则值为= 16 + 2字节扩展块长度 + 扩展块内容,或者值为18(只有扩展块长度为2字节,并且扩展块长度值为0),单位:字节。

Data:存放音频格式、声道数、采样率等信息。

audio_format:2字节,表示音频数据的格式。如值为1,表示使用PCM格式。

channels:2字节,声道数。值为1则为单声道,为2则是双声道。

sample_rate:4字节,采样频率,主要有22.05KHz,44.1kHz和48KHz等,例如0xAC44表示44100Hz。

bytes_per_sec:4字节,音频的码率,每秒播放的字节数。其值为:声道数 * 采样频率 * 量化位数 / 8,可以估算出使用缓冲区的大小。

block_align:2字节,每个采样点所需的字节数,其值为:声道数 * 量化位数 / 8。

bits_per_sample:2字节,量化位数,有16位,24位和32位等。

cbSize:2字节,扩展块的长度,其值可以为0或者22。

cbContent:0字节或22字节,扩展块内容,具体介绍在下文提及。

备注:这个区域只需要关心channels,sample_rate,bits_per_sample三个参数就可以了,其它的都是依据这三个计算出来的。

(3).Fact chunk(可选)

fact chunk为可选的,在大多数的WAV文件中是不存在的。采用压缩编码的WAV文件,必须要有Fact chunk,该块中只有一个数据,为每个声道的采样总数。

ID:4字节,值为"fact"。

Size:4字节,数据字段的长度,其值最小为4。

Data:采样总数。

(4).Data chunk

ID:4字节,值为"data"。

Size:4字节,音频数据的长度。

Data:具体的音频数据内容存放在这里。

4、Format chunk中的音频数据格式

在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,介绍上述内容,只是让大家多了解下其他的编码格式的值与名称,当遇到这类编码时,能够知道其名称,从而方便查询相关资料。

5、Format chunk中的扩展块

当WAV文件使用的不是PCM编码方式时,就需要扩展格式块,它是在基本的Format chunk中又添加一段数据。该数据的前两个字节,表示的是扩展块的长度。紧接其后的是扩展块的数据区,含有扩展的格式信息,其具体的长度取决于压缩编码的类型。当某种编码方式的扩展块的数据区长度为0,此时扩展块只包含了扩展块长度字段,扩展块的长度字段还必须保留,只是其值设置为0。

扩展块的各个字节的含义如下:

cbSize:2字节,扩展块的长度,其值可以为0或者22。

cbContent:0字节或22字节,扩展块内容。

valid_bits_per_sample:2字节,有效的采样位数,最大值为block_align * 8。可以使用更灵活的量化位数,通常音频sample的量化位数为8的倍数,但是使用了WAVE_FORMAT_EXTENSIBLE时,量化的位数由扩展块中的valid_bits_per_sample来描述,可以小于Format chunk中指定的bits_per_sample。

channle_mask:4字节,声道掩码。

sub_format:16字节,数据格式码。

在Format chunk中的audio_format设置为0xFFFE时,表示使用扩展区中的sub_format来决定音频的数据的编码方式。在以下几种情况下必须要使用WAVE_FORMAT_EXTENSIBLE:

PCM数据的量化位数大于16。

音频的采样声道大于2。

实际的量化位数不是8的倍数。

存储顺序和播放顺序不一致,需要指定从声道顺序到声卡播放顺序的映射情况。

备注:一般情况下,我们遇到的WAV文件中是不含有扩展块的。

6、声音数据格式

Data chunk中的Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推....。

对于Data chunk中的Data字段,也就是音频数据内容的存储,根据声道数和采样位数的不同情况,布局如下(每1列代表8 bits):

(1).8 bit单声道

采样1 采样2
数据1 数据2

(2).8 bit双声道

采样1   采样2  
声道1数据1 声道2数据1 声道1数据2 声道2数据2

(3).16 bit单声道

采样1   采样2  
数据1低字节 数据1高字节 数据2低字节 数据2高字节

(4).16 bit双声道

声道1采样1   声道2采样1  
声道1数据1低字节 声道1数据1高字节 声道2数据1低字节 声道2数据1高字节
声道1采样2   声道2采样2  
声道1数据2低字节 声道1数据2高字节 声道2数据2低字节 声道2数据2高字节

7、WAV文件实例分析

利用winhex工具软件可以非常方便的以十六进制查看文件,下图是我用winhex软件打开一个WAV音频文件时的部分界面截图:

文件

2019-10-21_160033

下表对文件格式进行解读:

偏移地址 字节数 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开始就是音频数据了。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分