WAV格式总结

本文详细介绍了WAV文件格式的组成、结构和关键信息,包括RIFF、Format、Fact和Data Chunk的作用及数据排列方式,帮助理解WAV文件如何存储和传输声音数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

收集了网上的一些关于WAV格式的资料,做个简单的总结,用于个人学习。

参考资料:

1 http://blog.youkuaiyun.com/bluesoal/archive/2006/07/17/932395.aspx

 

   WAV格式是微软公司开发的一种声音文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。WAV格式支持许多压缩算法,支持多种音频位数、采样频率和声道,采用44.1kHz的采样频率,16位量化位数,因此WAV的音质与CD相差无几,但WAV格式对存储空间需求太大不便于交流和传播.

  WAV来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的WAV文件,即波形文件。Microsoft Sound System软件Sound Finder可以转换AIF SNDVOD文件到WAV格式。

  该格式记录声音的波形,故只要采样率高、采样字节长、机器速度快,利用该格式记录的声音文件能够和原声基本一致,质量非常高,但这样做的代价就是文件太大。

 

一、综述

  WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。

  RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”

  WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk具体见下图:

  ------------------------------------------------

  | RIFF WAVE Chunk |

  | ID = 'RIFF' |

  | RiffType = 'WAVE' |

  ------------------------------------------------

  | Format Chunk |

       | ID = 'fmt ' |

       | Data Field |

  ------------------------------------------------

  | Fact Chunk(optional) |

        | ID = 'fact' |

        | Data Field |

  ------------------------------------------------

  | Data Chunk |

        | ID = 'data' |

        | Data Field |

  ------------------------------------------------

  图1 Wav格式包含Chunk示例

  其中除了Fact Chunk外,其他三个Chunk是必须的。每个Chunk有各自的ID,位于Chunk最开始位置,作为标示,而且均为4个字节。并且紧跟在ID后面的是Chunk大小(去除IDSize所占的字节数后剩下的其他字节数目),4个字节表示,低字节表示数值低位,高字节表示数值高位。下面具体介绍各个Chunk内容。

  

      PS

  所有数值表示均为低字节表示低位,高字节表示高位。

 

二、每个Chunk的具体介绍

  RIFF WAVE Chunk

  ==================================

  | |所占字节数| 具体内容 |

  ==================================

  | ID | 4 Bytes | 'RIFF' |

  ----------------------------------

  | Size | 4 Bytes | |

  ----------------------------------

  | Type | 4 Bytes | 'WAVE' |

  ----------------------------------

  图2 RIFF WAVE Chunk

  以'RIFF'作为标示,然后紧跟着为size字段,该size是整个wav文件大小减去IDSize所占用的字节数,即FileLen - 8 = Size。然后是Type字段,为'WAVE',表示是wav文件。RIFF WAVE Chunk的大小为12bytes

  结构定义如下:

  struct RIFF_HEADER

  {

  char szRiffID[4]; // 'R','I','F','F'

  DWORD dwRiffSize;

  char szRiffFormat[4]; // 'W','A','V','E'

};

 

  Format Chunk

  ============================================================

  | | 字节数 | 具体内容 |

  ============================================================

  | ID | 4 Bytes | 'fmt ' |

  --------------------------------------------------------------------

  | Size | 4 Bytes | 数值为161818则最后又附加信息 |

  -------------------------------------------------------------------- ----

  | FormatTag | 2 Bytes | 编码方式,一般为0x0001 | |

  -------------------------------------------------------------------- |

  | Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 | |

  -------------------------------------------------------------------- |

  | SamplesPerSec | 4 Bytes | 采样频率 | |

  -------------------------------------------------------------------- |

  | AvgBytesPerSec| 4 Bytes | 每秒所需字节数 | |===> WAVE_FORMAT

  -------------------------------------------------------------------- |

  | BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) | |

  -------------------------------------------------------------------- |

  | BitsPerSample | 2 Bytes | 每个采样需要的bit | |

  -------------------------------------------------------------------- |

  | | 2 Bytes | 附加信息(可选,通过Size来判断有无) | |

  -------------------------------------------------------------------- ----

3 Format Chunk

  以'fmt '作为标示。一般情况下Size16,此时最后附加信息没有;如果为18

  则最后多了2个字节的附加信息。主要由一些软件制成的wav格式中含有该2个字节的附加信息,什么附加信息?内容为什么?

  结构定义如下:

  struct WAVE_FORMAT

  {

  WORD wFormatTag;

  WORD wChannels;

  DWORD dwSamplesPerSec;

  DWORD dwAvgBytesPerSec;

  WORD wBlockAlign;

  WORD wBitsPerSample;

  };

  struct FMT_BLOCK

  {

  char szFmtID[4]; // 'f','m','t',' '

  DWORD dwFmtSize;

  WAVE_FORMAT wavFormat;

};

 

  Fact Chunk

  ==================================

  | |所占字节数| 具体内容 |

  ==================================

  | ID | 4 Bytes | 'fact' |

  ----------------------------------

  | Size | 4 Bytes | 数值为4 |

  ----------------------------------

  | data | 4 Bytes | |

  ----------------------------------

  图4 Fact Chunk

  Fact Chunk是可选字段,一般当wav文件由某些软件转化而成,则包含该Chunk一般不包含Fact Chunk

  结构定义如下:

  struct FACT_BLOCK

  {

  char szFactID[4]; // 'f','a','c','t'

  DWORD dwFactSize;

  };

  Data Chunk

  ==================================

  | |所占字节数| 具体内容 |

  ==================================

  | ID | 4 Bytes | 'data' |

  ----------------------------------

  | Size | 4 Bytes | |

  ----------------------------------

  | data | | |

  ----------------------------------

  图5 Data Chunk

  Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数, wav数据的bit位置可以分成以下几种形式:

  ---------------------------------------------------------------------

 Data Chunk是真正保存wav数据的地方,以'data'作为该Chunk的标示。然后是

数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,

wav数据的bit位置可以分成以下几种形式:

    ----------------------------------------------------------------------------------------------------

    |   单声道  |    取样1    |    取样2    |    取样3    |    取样4    |

    |           |-----------------------------------------------------------------------------------

    |  8bit量化 |    声道0    |    声道0    |    声道0    |    声道0    |

    ----------------------------------------------------------------------------------------------------

    |   双声道  |          取样1            |           取样2           |

    |           |----------------------------------------------------------------------------------

    |  8bit量化声道0()  |  声道1()  |  声道0()  |  声道1()  |

    ----------------------------------------------------------------------------------------------------

    |           |          取样1            |           取样2           |

    |   单声道  |----------------------------------------------------------------------------------

    | 16bit量化 |    声道0    |  声道0      |    声道0    |  声道0      |

    |           | (低位字节)  | (高位字节)     | (低位字节)   | (高位字节)  |

    ------------------------------------------------------------------------------------------------------

    |           |                         取样1                         |

    |   双声道  |------------------------------------------------------------------------------------

    | 16bit量化声道0()  |  声道0()  |  声道1()  |  声道1()     |

    |           | (低位字节)   | (高位字节)   | (低位字节)   | (高位字节)      |

    --------------------------------------------------------------------------------------------------------

                         6 wav数据bit位置安排方式

  Data Chunk头结构定义如下:

  struct DATA_BLOCK

  {

  char szDataID[4]; // 'd','a','t','a'

  DWORD dwDataSize;

};

用表格的形式来描述WAVE HEADER

       Wave Header总大小一般为44Bytes果用一个结构体来定义WAVE文件头应该为:
struct WAVEFILEHEADER
{
 char chRIFF[4];
 DWORD dwRIFFLen;
 char chWAVE[4];
 char chFMT[4];
 DWORD dwFMTLen;
 PCMWAVEFORMAT pwf;
 char chDATA[4];
 DWORD dwDATALen;
};

      这样在进行Wav文件播放时,拿出header信息后,就可以直接跳过44bytes,再来播放PCM数据。播放PCM数据时,要注意数据的排列顺序,根据采样精度、通道数来正确读取数据。下表为文件头的描述。  

偏移地址

字节数

数据类型

  

00H

4

char

"RIFF"标志

04H

4

long int

文件长度

08H

4

char

"WAVE"标志

0CH

4

char

"fmt"标志

10H

4

 

过渡字节(不定)

14H

2

int

格式类别(10HPCM形式的声音数据)

16H

2

int

通道数,单声道为1,双声道为2

18H

4

int

采样率(每秒样本数),表示每个通道的播放速度,

1CH

4

long int

波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。

20H

2

int

数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。

22H

2

 

每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。

24H

4

char

数据标记符"data

28H

4

long int

语音数据的长度

  PCM数据的存放方式:

 

样本1

                            样本2

8位单声道

0声道

0声道

8位立体声

0声道(左)

1声道(右)

0声道(左)

1声道(右)

16位单声道

0声道低字节

0声道高字节

0声道低字节

0声道高字节

16位立体声

0声道(左)低字节

0声道(左)高字节

1声道(右)低字节

1声道(右)高字节

WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。 8位采样一定是无符号。

样本大小

数据格式

最大值

最小值

8PCM

unsigned int

225

0

16PCM

int

32767

-32767

 

 

软件名称:Monkey's Audio 软件版本:4.06 运行环境:WinALL 汉化类型:汉化安装版 软件性质:免费 官方主页:http://www.monkeysaudio.com ━━━━━━━━━━━━━━━ 软件简介 ━━━━━━━━━━━━━━━ Monkey's Audio(http://www.monkeysaudio.com)是一种无损压缩技术。他并不是由什么大公司发明的,完全是一个个人业余兴趣作品。为了使Monkey's Audio能有更好的发展,现在这个软件已经公开了源代码。   这种压缩格式的特点是无损压缩,也就是说对压缩数据进行还原之后得到的数据与原来的数据是完全相同的。该格式的特点尤其适合那些拥有一对“金耳朵”并且一直对mp3的音质耿耿于怀的音乐发烧友。后者有人会问,要无损压缩,我随便找个压缩软件比如WINRAR都可以达到不错的效果了,还要这种格式干嘛? 所以这里要澄清一个误解:使用普通的压缩软件进行压缩无疑是可以得到不错的压缩效果,有时候甚至更优于使用Monkey's Audio,但是压缩软件生成的压缩包必须要先解压还原之后才能播放里面的内容,而Monkey's Audio这种无损压缩编码得到的文件可以直接使用播放器(比如WinAMP)进行播放。Monkey's Audio的压缩效果大约在2:1左右,也就是说压缩结果是原来的二分之一大小。一张CD大约需要330MB左右的空间存放,相比之下还是比较占空间的。由于这个原因,所以对音质要求不是太高的人通常都选择VBR方式的mp3而不是选择它。   与Monkey's Audio类似的编码格式还包括WavPack、RKAU、Shorten等等。由于相对不是那么出名,又或者在某些方面不够Monkey's Audio做得好,因此获得的关注程度就逊色很多。   Monkey's Audio 软件在Monkey‘s Audio官方网站可以下载,专用于压缩wav文件为ape文件或解压ape文件为wav文件   Monkey's Audio 是一种快速且易于操作的数字音乐压缩方案,它所生成的 APE 无损压缩格式压缩率接近50%,压缩后的品质跟原始声音的品质完全是一样的(据说有人将 Wav 文件生成 APE 格式后,再转换回 Wav 文件,结果对比两个Wav 文件的 MD5 值时,发现居然完全一样)!   APE 无损压缩音频格式已被绝大多数音频播放器如:Winamp、Media Jukebox以及越来越多的应用程序支持。Monkey's Audio 是 APE 的压缩、解压缩、转换操作的平台。   本汉化安装版包括了原版的一切组件,无需原版文件,另外,用于 Winamp的APE插件安装程序也替换为汉化版。 ━━━━━━━━━━━━━━━ 汉化历程 ━━━━━━━━━━━━━━━ 2006.01.11 发布 Monkey's Audio 4.01 b1 汉化版 2006.03.14 发布 Monkey's Audio 4.01 b2 汉化版 2009.02.02 发布 Monkey's Audio 4.03 汉化版 2009.02.03 发布 Monkey's Audio 4.04 汉化版 2009.02.05 发布 Monkey's Audio 4.05 汉化版 2009.03.19 发布 Monkey's Audio 4.06 汉化版
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值