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。示意图如下:

一个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的具体内容。

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音频文件时的部分界面截图:

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

偏移地址 字节数 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

发表回复

相关推荐

山西黨成喜連環奸殺案——梨花下的罪惡

本案案情過於殘忍,兇手手段令人發指,連十歲幼童和自己的外甥女都不放過,閱讀前建議做好心理準備。兇手名叫黨成喜,是山西...

· 3分钟前

從崔雪莉等明星自殺到總統被清算,韓國財閥究竟有多恐怖?

從不認識崔雪莉,到熟知她的一切,隻需要半天。這個時代,活著備受鞭撻,隻有死瞭才能受到憐憫,真是可悲。好像隻有你死去瞭...

· 3分钟前

博金賽鴿丨名傢天落同原舍鴿子的異處

當名傢的鴿子沒有成為天落鳥的時候,就屬於原舍的鴿子。一些玩得好,鴿子培養得好的鴿友的鴿子,往往價格很高。不過當鴿...

· 8分钟前

8款热门果泥测评,谁是果泥营养天花板?

满满小的时候市面上常见的果泥都吃过。有时候我带她去上早教,为了她可以乖乖的上课,我常常就给她带两包果泥,相较于新鲜的 ...

· 8分钟前

用影子来画画,太好玩了!

先给你看几幅挺有趣的创作,是利用影子的有趣创作。

· 9分钟前