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即波形声音文件格式 (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也可以存储其它压缩格式的音频数据。
对于形如44100HZ 16bit stereo 或者 22050HZ 8bit mono参数描述的音频文件,其蕴含的文件参数包括:
对于单声道(mono)文件,采样数据为8位的短整数,同时其采样精度有:
对于双声道立体声(stereo)文件,每次采样数据为一个16位的整数(int),且采样是双份的,也为单声道文件的两倍。采样数据中高八位(左声道)和低八位(右声道)分别代表两个声道。
由于wav格式文件本质上为音频文件,即可根据文件的大小、采样频率和采样大小估算文件的播放长度。
WAV文件遵循RIFF规则,其数据体以区块(Chunk)为最小单位进行存储,而整个文件则以文件头进行标识。其结构示意如下表与图。
WAV Head | Data Chunk | …… | Data Chunk |
---|
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数据的大小
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音频文件的内部数据是以数据体为单位在文件头后进行存储,其数据体内部数据由PCM(脉冲编码调制)格式表示的样本组成。每个区块则均有表征数据块特点的ID、Size等码段,同时也有不同码段内容。
RIFF数据块长度为12字节,共有三种码段。如下表所示。
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
ID | 0x00 | 4 | RIFF (0x52494646) |
Size | 0x04 | 4 | fileSize - 8 |
Type | 0x08 | 4 | WAVE(0x57415645) |
其中:
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
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 | 采样位数 |
其中:
ByteRate = SampleRate × NumChannels × BitsPerSample / 8
DATA区块为音频文件存储实际的数据。
名称 | 偏移地址 | 字节数 | 内容 |
---|---|---|---|
ID | 0x00 | 4 | ‘data’ (0x64617461) |
Size | 0x04 | 4 | - |
Data | 0x08 | - | 音频数据 |
其中:
Size = ByteRate × seconds
通过对WAV格式文件的文件结构、数据结构以及元数据表示方法的简要学习,作者对WAV格式媒体文件有了进一步的认识。同时,通过分析WAV格式文件内部数据的表示内容,此过程中也对音频文件的各项参数指标有了更深的了解。
[1] WAV文件格式详解
[2] WAVE PCM Sound File Format
[3] wav文件格式分析
[4] WAV 百度百科