WAV格式文件分析

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 HeadData Chunk……Data Chunk

WAV文件整体结构

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 ChunkFormat ChunkData Chunk……

三、WAV格式文件数据体结构

目前可知,WAV音频文件的内部数据是以数据体为单位在文件头后进行存储,其数据体内部数据由PCM(脉冲编码调制)格式表示的样本组成。每个区块则均有表征数据块特点的ID、Size等码段,同时也有不同码段内容。

1、RIFF Chunk区块

RIFF数据块长度为12字节,共有三种码段。如下表所示。

名称偏移地址字节数内容
ID0x004RIFF (0x52494646)
Size0x044fileSize – 8
Type0x084WAVE(0x57415645)

在:

  • RIFF Chunk类型数据块以RIFF的ID部分为标识,说明数据块类型;
  • Size是整个文件的长度减去ID和Size的长度,表征包含Type字段在内的数据块长度;
  • Type是WAVE表示后面需要Format和Data两个子区块。

2、Format Chunk区块

名称偏移地址字节数内容
ID0x004‘fmt ’ (0x666D7420)
Size0x04416
AudioFormat0x082音频格式
NumChannels0x0A2声道数
SampleRate0x0C4采样率
ByteRate0x104每秒数据字节数
BlockAlign0x142数据块对齐
BitsPerSample0x162采样位数

在:

  • 此类型数据块以“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区块为音频文件存储实际的数据。

名称偏移地址字节数内容
ID0x004‘data’ (0x64617461)
Size0x044
Data0x08音频数据

在:

  • Size表示音频数据的长度,不包含ID和Size数据段,且对于采样率为ByteRate的音频文件数据来说,其计算公式为

Size = ByteRate × seconds

  • Data为实际存储的完整音频数据。

总结

通过对WAV格式文件的文件结构、数据结构以及元数据表示方法的简要学习,作者对WAV格式媒体文件有了进一步的认识。同时,通过分析WAV格式文件内部数据的表示内容,此过程中也对音频文件的各项参数指标有了更深的了解。

参考文献和引用材料

[1]WAV文件格式详解
[2]WAVE PCM Sound File Format
[3]wav文件格式分析
[4]WAV 百度百科

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月17日 下午3:54
下一篇 2022年3月17日 下午4:14

相关推荐