1 WAV/WMA/MP3的比较
介绍WAV格式之前,有必要拿最常见的几种格式进行一下比较。
MP3(Moving Picture Experts Group Audio Layer II)即MPEG Audio Layer3,是一种音频压缩技术。WMA诞生时间稍微晚一点,也是一种音频压缩技术,相关资料显示,其压缩率相对于MP3更有优势,只不过其标准不及MP3开放,所以市面上MP3格式的文件相对流行一些。
而WAV为声音文件的格式,采用RIFF标准(RIFF是Microsoft提出的一种多媒体文件的存储方式,不同编码的音频、视频文件,可以按照它定义的存储规则保存、记录各自不同的数据,WAV和AVI都采用这种标准),不进行压缩。
2 WAV格式描述
WAV格式符合RIFF标准,同样采用FOURCC,CHUNK和LIST进行组织,三者的关系形象的来进行比喻的话,FOURCC类似与Linux中的RootFS,LIST类似于各个分区的目录,而CHUNK类似于文件,系统中可能存在多个FOURCC和CHUNK,并且RIFF和LIST块可以包含其他块,而其它块仅能含有数据。
这里引用资料中的一张图片来进行形象说明,如下:
(待添加)
WAV文件由若干个Chunk构成,按照从前向后的顺序依次为RIFF WAVE CHUNKàFORMAT CHUNKàFACT CHUNK(可选,不一定有)àDATA CHUNK,如下图所示:
------------------------------------------------
| RIFF WAVE Chunk |
| ID = 'RIFF' |
| RiffType = 'WAVE' |
------------------------------------------------
| Format Chunk |
| ID = 'fmt ' |
------------------------------------------------
| Fact Chunk(optional) |
| ID = 'fact' |
------------------------------------------------
| Data Chunk |
| ID = 'data' |
------------------------------------------------
其中,按照RIFF的规定,每个Chunk的格式都是固定的,可以用下面的结构体来进行描述:
structchunk { u32id; /* 块标志*/ u32size; /* 块大小*/ u8dat[size]; /* 块内容*/ }; |
WAV文件的详细Layout如下表所描述:
endian |
field name |
Size |
Column1 |
big |
ChunkID |
4 |
文件头标识,一般就是" RIFF" 四个字母 |
little |
ChunkSize |
4 |
整个数据文件的大小,不包括上面ID和Size本身 |
big |
Format |
4 |
一般就是" WAVE" 四个字母 |
big |
SubChunk1ID |
4 |
格式说明块,本字段一般就是"fmt " |
little |
SubChunk1Size |
4 |
本数据块的大小,不包括ID和Size字段本身 |
little |
AudioFormat |
2 |
音频的格式说明 |
little |
NumChannels |
2 |
声道数 |
little |
SampleRate |
4 |
采样率 |
little |
ByteRate |
4 |
比特率,每秒所需要的字节数 |
little |
BlockAlign |
2 |
数据块对齐单元 |
little |
BitsPerSample |
2 |
采样时模数转换的分辨率 |
big |
SubChunk2ID |
4 |
真正的声音数据块,本字段一般是"data" |
little |
SubChunk2Size |
4 |
本数据块的大小,不包括ID和Size字段本身 |
little |
Data |
N |
音频的采样数据 |
举例以文件simtkit_callwait.wav为例来进一步说明wav文件的格式,该文件为WinCE6.0下的系统自带音频文件,可以从VS2005开发环境下找到。
该文件前64字节如下:
详细分析如下:
使用Adobe Audition分析如下:
分析Sample 0如下:
可以看到,采样点0的采样值(114)正好是二进制文件中Sample 0的采样值(0x72),其它采样点不再具体分析。