WAV格式文件分析
概述
WAV格式目前是最常见的音频文件格式之一,是微软公司专门为旗下Windows操作系统开发的一种标准数字音频文件。WAV格式文件最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为*.wav,是WaveForm的简写,也称为波形文件,可直接存储声音波形,且还原的波形曲线十分逼真。
本质上,WAV文件格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linux等多种操作系统。WAV支持多种音频数字、取样频率和声道,标准格式化的WAV文件和CD格式一样,也是44.1kHz的取样频率,16位量化数字,因此声音文件质量和CD相差无几。同时,WAV格式文件还有真实记录自然声波形、数据压缩程度低、数据量相对较大等特点。
在本文中,作者则以多媒体文件的“容器”概念出发,针对WAV格式文件的文件结构、数据组织结构、元数据信息等方面作简要的说明。
一、WAV格式文件
1、波形声音文件格式 WAV
WAV即波形声音文件格式 (Waveform Audio File Format,简称WAVE,因后缀为*.wav故简称WAV文件),其采用RIFF(Resource Interchange File Format,资源互换文件格式)结构,并符合(RIFF)规范,用于保存Windows平台的音频信息资源,被Windows平台及其应用程序所广泛支持。Wave格式支持MSADPCM、CCITT A律、CCITT μ律和其他压缩算法,支持多种音频位数、采样频率和声道,是PC机上最为流行的声音文件格式;但由于“无损”的特点,WAV文件格式所占用的磁盘空间相对较大(每分钟的音乐大约需要12MB磁盘空间),故此文件格式多用于存储简短的声音片段。同时WAV文件格式通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。
2、音频文件参数简介
对于形如44100HZ 16bit stereo 或者 22050HZ 8bit mono参数描述的音频文件,其蕴含的文件参数包括:
- 采样率:声音信号在“模拟→数字”转换过程中单位时间内被采样的次数。
- 采样值(采样精度):声音模拟信号在每个采样周期内的积分值。
同时,每个采样数据记录幅度,采样精度取决于存储空间的大小。
对于单声道(mono)文件,采样数据为8位的短整数,同时其采样精度有:
- 1 字节(8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;
- 2 字节(16bit) 可以细到 65536 个数, 即为 CD 标准;
- 4 字节(32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了。
对于双声道立体声(stereo)文件,每次采样数据为一个16位的整数(int),且采样是双份的,也为单声道文件的两倍。采样数据中高八位(左声道)和低八位(右声道)分别代表两个声道。
由于wav格式文件本质上为音频文件,即可根据文件的大小、采样频率和采样大小估算文件的播放长度。
二、文件结构
WAV文件遵循RIFF规则,其数据体以区块(Chunk)为最小单位进行存储,而整个文件则以文件头进行标识。其结构示意如下表与图。
WAV Head | Data Chunk | …… | Data Chunk |
---|
1、WAV文件的文件头
PNG格式文件的文件头是由位固定的字节进行描述,其大小占44个字节。
char *header = new char[44]; //wav文件头
其中前四字节为资源交换文件标志“RIFF”。
header[0] ='R';
header[1] ='I';
header[2] ='F';
header[3] ='F';
后40字节则分别声明音频文件参数,包括:
int file_size; //文件大小
int channel; //声道数
int sample_rate; //采样率
int bit_rate; //比特率
int sample_bit; //每个采样点的位数
int data_size; //pcm数据的大小
2、WAV文件的数据体
WAV文件的数据体区块一般由3个区块组成:RIFF Chunk、Format Chunk和Data Chunk。示意如下表。另外,文件中还可能包含一些可选的区块,如:Fact Chunk、Cue Points Chunk、Playlist Chunk、Associated Data List Chunk等。
RIFF Chunk | Format Chunk | Data Chunk | …… |
---|
三、WAV格式文件数据体结构
目前可知,WAV音频文件的内部数据是以数据体为单位在文件头后进行存储,其数据体内部数据由PCM(脉冲编码调制)格式表示的样本组成。每个区块则均有表征数据块特点的ID、Size等码段,同时也有不同码段内容。
1、RIFF Chunk区块
RIFF数据块长度为12字节,共有三种码段。如下表所示。
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
ID | 0x00 | 4 | RIFF (0x52494646) |
Size | 0x04 | 4 | fileSize – 8 |
Type | 0x08 | 4 | WAVE(0x57415645) |
在:
- RIFF Chunk类型数据块以RIFF的ID部分为标识,说明数据块类型;
- Size是整个文件的长度减去ID和Size的长度,表征包含Type字段在内的数据块长度;
- Type是WAVE表示后面需要Format和Data两个子区块。
2、Format Chunk区块
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
ID | 0x00 | 4 | ‘fmt ’ (0x666D7420) |
Size | 0x04 | 4 | 16 |
AudioFormat | 0x08 | 2 | 音频格式 |
NumChannels | 0x0A | 2 | 声道数 |
SampleRate | 0x0C | 4 | 采样率 |
ByteRate | 0x10 | 4 | 每秒数据字节数 |
BlockAlign | 0x14 | 2 | 数据块对齐 |
BitsPerSample | 0x16 | 2 | 采样位数 |
在:
- 此类型数据块以“fmt”的ID为标识,说明数据块类型;
- Size表示该区块数据不包含ID和Size的长度;
- AudioFormat表示Data区块存储的音频数据的格式,PCM音频数据的值为1;
- NumChannels表示音频数据的声道数,其中1表示单声道,2表示双声道;
- SampleRate表示音频数据的采样率;
- ByteRate每秒数据字节数,计算公式为
ByteRate = SampleRate × NumChannels × BitsPerSample / 8
- BlockAlign每个采样所需的字节数,计算公式为NumChannels*BitsPerSample/8;
- BitsPerSample每个采样存储的bit数,其中8表示8bit,16表示16bit,32表示32bit。
3、DATA区块
DATA区块为音频文件存储实际的数据。
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
ID | 0x00 | 4 | ‘data’ (0x64617461) |
Size | 0x04 | 4 | – |
Data | 0x08 | – | 音频数据 |
在:
- Size表示音频数据的长度,不包含ID和Size数据段,且对于采样率为ByteRate的音频文件数据来说,其计算公式为
Size = ByteRate × seconds
- Data为实际存储的完整音频数据。
总结
通过对WAV格式文件的文件结构、数据结构以及元数据表示方法的简要学习,作者对WAV格式媒体文件有了进一步的认识。同时,通过分析WAV格式文件内部数据的表示内容,此过程中也对音频文件的各项参数指标有了更深的了解。
参考文献和引用材料
[1]WAV文件格式详解
[2]WAVE PCM Sound File Format
[3]wav文件格式分析
[4]WAV 百度百科
文章出处登录后可见!