WAV文件格式详解

By: Ailson Jack
Date: 2020.03.29
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/114.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

1WAV文件概述

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

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

2WAV文件格式

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:具体的音频数据内容存放在这里。

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

5Format 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高字节

7WAV文件实例分析

利用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开始就是音频数据了。

       如果觉得文章写的不错,对你有帮助,欢迎点赞,关注博主哟!

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/114.html
注:转载请注明出处,谢谢!^_^

猜你喜欢

转载自blog.csdn.net/jackailson/article/details/105183413