wav文件格式作为一种常用的多媒体音频文件格式,其由MS在1991年8月在Windows 3.1上推出,文件扩展名为WAV,是WaveFom的简写。通常存储未压缩的pcm数据,也可存储压缩的pcm数据(G711a/u, G726, ADPCM)。WAV文件格式简称WAV格式,是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统,详述如下。

波形文件的基础知识

1.1 波形文件的存储过程

声源发出的声波通过话筒被转换成连续变化的电信号,经过放大、抗混叠滤波后,按固定的频率进行采样,每个样本是在一个采样周期内检测到的电信号幅度值;接下来将其由模拟电信号量化为由二进制数值;最后编码并存储为音频流数据。有的应用为了节省存储空间,存储前,还要对采样数据先进行压缩(G711/G726)。其过程如下:

采样->模拟信号->量化->压缩->存储。

1.2 WAV文件的编码

编码包括了两方面内容:一是按一定格式存储数据;二是采用一定的算法压缩数据。WAV格式对音频流的编码没有硬性规定,既支持非压缩的PCM(Puls Code Modulation)脉冲编码调制格式,又支持压缩型的数据,如微软自适应分脉冲编码调制Microsoft ADPCM(Adaptive Differential Puls Code Modulation)、国际电报联盟(International Telegraph Union)制定的语音压缩标准ITUG.711 a-law、ITU G.711 u-law、IMA ADPCM和其它压缩算法。

1.3 WAV文件存储格式

wav封装格式-LMLPHP

封装格式主要包括三部分:"RIFF" chunk, "fmt " sub-chunk, "data" sub-chunk。

每个chunk的格式如下:

块标识4Bytes"RIFF"/"fmt "/"data"
块长度4Bytes接下来“数据”到文件尾的size
数据X Bytes具体内容

其中,对“块长度”进行详细解释,其大小为从接下来“数据”部分开始,一直到文件尾结束,其以字节为单位的大小。但是,"fmt " sub-chunk则有些特别。

例如,"RIFF" chunk,其“块长度”=file_size - 8Bytes,因为要排除“块标识”+本“块长度”的8Bytes。

"fmt " sub-chunk(注意t后面有个空格,必须由4Bytes组成),其大小为该sub-chunk的大小=16Bytes。

"data" sub-chunk,其大小为接下来“数据”部分的size,即pcm数据的大小=file_size - 44Bytes(wav头大小)。

1.4 WAV文件实例分析

通过winhex查看二进制数据如下:

wav封装格式-LMLPHP

PCM基础知识

(1)采样频率(sample rate):又称取样频率。是单位时间内的采样次数(一秒钟采样多少次信号),决定了数字化音频的质量。采样频率越高,数字化音频的质量越好、声音越真实,当然所占的资源、存储空间也越多。根据奎特采样定理,要从采样中完全恢复原始信号的波形,采样频率要高于声音中最高频率的两倍。人耳可听到的声音的频率范围是在16Hz-20kHz之间。因此,要将听到的原声音真实地还原出来,采样频率必须大于4 0k H z 。常用的采样频率有8 k H z 、1 1 . 02 5 k H z 、22.05kHz、44.1kHz、48kHz等几种。22.05KHz相当于普通FM广播的音质,44.1KHz理论上可达到CD的音质。对于高于48KHz的采样频率人耳很难分辨,没有实际意义。录像设备采集人声时,通常用16kHz采样,使用8kHz的则声音回放时有些闷,使用16k以上时跟16k的分不出区别。而专业录音棚中录制时,则通常使用44.1k/48k/96k的采样率,因为不仅要采集人声,还要采集乐器声。

(2)采样位数(bit width):也叫量化位数(单位:比特),是存储每个采样值所用的二进制位数。采样值反应了声音的波动状态。采样位数决定了量化精度。采样位数越长,量化的精度就越高,还原的波形曲线越真实,产生的量化噪声越小,回放的效果就越逼真。常用的量化位数有4、8、12、16、24。量化位数与声卡的位数和编码有关。如果采用PCM编码时使用16位声卡,可将音频信号幅度划分成了64K个音量等级,取值范围为-32768至32767。网络上音频文件基本上都是16位采样精度。

(3)声道数(channel count):是使用的声音通道的个数,也是采样时所产生的声音波形的个数。我们通常接触到的是单声道(mono)和立体声(stereo)。立体声在采集时,使用两个mic,两个mic处于不同的位置,其采集时所量化到的二进制值有些差别,因此在回放时会感觉到两个耳朵里信号有些差异,给人以立体感。

WAV实例练习

为了学习wav封装格式,特写了一个工具,用于读取/写wav文件,检查sample_rate/channel_cnt/duration。已上传GitHub:https://github.com/Dreaming-in-Gottingen/AudioTools

wav_utils文件生成libwav_ops.so库文件,tests用于测试libwav_ops.so中对wav读/写的实现,CStdWavGenerator用于生成标准的音频文件(如正弦波,方波,三角波)。

码了这么多字,实在太费时间了,朋友们可以下载下来测试一下。有问题,欢迎留言。

以后有时间了,再整一篇文章介绍一下关于pcm增益、采样率、频率等问题。

05-11 22:45