wav文件是微软保存音频数据的文件,它的数据内容一般都是录音的数据内容,下面的wav文件介绍供参考:
首先wav文件是基于微软版本的EA-IFF方法来保存数据的,IFF是Electronic Arts公司开发的一种文件格式(EA IFF 1985),基于基本的IFF格式,wav的收保存在各种不同的“chunk”中。
在wav文件中,有三种chunk是必须的,另外的chunk都是可选的,简单的可以如图所示:
1. 'RIFF', 'WAVE' chunk
这个chunk主要是一个标记,告诉我们这是一个wav文件。它的数据信息可以用如下:
----------------------------------
|ID | 4 Bytes | 'RIFF' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| Type | 4 Bytes| 'WAVE' |
----------------------------------
所以wav文件的wave chunk是很简单的,共有12个字节,size表示的是整个wav文件大小除去该chunk的ID和Size的大小,也就是FileSize-8。
2. "fmt" chunk
格式chunk包含个各种描述内容格式的重要参数,比如音频的采样率,比特率等。它的信息可以用如下的图来表示:
--------------------------------------------------------------------
|ID | 4Bytes | 'fmt' |
--------------------------------------------------------------------
|Size | 4Bytes | 数值为16或18,18则最后又附加信息 |
------------------------------------------------------------------------
|FormatTag | 2 Bytes | 编码方式,一般为0x0001 |
-------------------------------------------------------------------- |
|Channels | 2 Bytes | 声道数目,1--单声道;2--双声道 |
-------------------------------------------------------------------- |
| SamplesPerSec | 4Bytes | 采样频率 |
-------------------------------------------------------------------- |
| AvgBytesPerSec| 4Bytes | 每秒所需字节数 |
-------------------------------------------------------------------- |
|BlockAlign | 2 Bytes | 数据块对齐单位(每个采样需要的字节数) |
-------------------------------------------------------------------- |
| BitsPerSample | 2Bytes | 每个采样需要的bit数 |
-------------------------------------------------------------------- |
| | 2 Bytes | 附加信息(可选,通过Size来判断有无) |
-------------------------------------------------------------------- ----
该部分的内容以’fmt’为标记,4字节size表示的该chunk除去ID和Size的大小,如图中所示为16或18;FormatTag表示的该wav数据的编码,这里最常用的编码就是0x0001,为PCM编码,其他的编码,可以参考微软的Windows wave格式。声道数,采样率不再累赘,blockalign以8字节对齐,可以用下面的方式计算
nBlockAlign = channels * ((nBitsPerSample + 7) / 8);
nBitsPerSample表示音频数据字长,16位的bit最为常见;AvgBytesPerSe表示每秒钟的字节数。
3. 'data' chunk
数据chunk则保存了真正的wav数据;它的格式如下:
|ID | 4 Bytes | 'data' |
----------------------------------
| Size | 4 Bytes| |
----------------------------------
| data | | |
----------------------------------
以'data'作为该Chunk的标示。然后是数据的大小。紧接着就是wav数据。根据Format Chunk中的声道数以及采样bit数,每个byte中wav数据的bit位置可以分成以下几种形式(以intel的little edian为例):
a,单声道8位字长
---------------------------------------------------------------------
| 单声道 | 取样1 | 取样2 | 取样3 | 取样4 |
| |--------------------------------------------------------
| 8bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
---------------------------------------------------------------------
b, 双声道8位字长
| 双声道 | 取样1 | 取样2 |
| |--------------------------------------------------------
| 8bit量化 | 声道0(左) | 声道1(右) | 声道0(左) | 声道1(右) |
---------------------------------------------------------------------
c, 单声道16位字长
| | 取样1 | 取样2 |
| 单声道 |--------------------------------------------------------
| 16bit量化 | 声道0 | 声道0 | 声道0 | 声道0 |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
---------------------------------------------------------------------
c, 双声道16位字长
| | 取样1 |
| 双声道 |--------------------------------------------------------
| 16bit量化 | 声道0(左) | 声道0(左) | 声道1(右) | 声道1(右) |
| | (低位字节) | (高位字节) | (低位字节) | (高位字节) |
---------------------------------------------------------------------
参考:
那怎样利用跨平台格式的乐谱文件产生声卡可用的数据文件?
是midi文件转化成其他格式吗?这个转换是有工具的
2014-01-13
最常见的应该是PCM那种编码了,可以从微软的MSDN里查到相关的WAV结构,不过WAV数据都是一些波形的采样,这个一般不需要你去写的,如果你有自己的波形生成算法,才需要这么做,一般录音的话直接调微软的wavoutwrite那套API就OK了