整理网上和读书时的资料,结合自己的实际经验,给出wav头格式的解释和源代码,既是对
自己的总结,同时又服务大家。另外在给出几个实际例子,如果看了这篇文档还不能正确写出
wave文件,那就要吊起来打了^_^。
——flywen 2010-10-13
参考网址一:http://blog.csdn.net/sshcx/archive/2007/05/01/1593923.aspx
参考网址二:http://apps.hi.baidu.com/share/detail/15909594
WAVE 文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英
文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF"。WAVE
文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件 标识段和声音数据格
式说明段两部分。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz 采样率、8Bit的采样值)和
双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在"模→数"转换过程中单
位时间内采样的次数。 采样值是指每一次采样周期内声音模拟信号的积分值。
[!21ki@][@21ki!]
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声
声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
WAVE文件数据块包含以脉冲编码调制(PCM)格式表示的样本。WAVE文件是由样本组织而成
的。在单声道WAVE文件中,声道0代表左声道,声道1代表右声道。在多声道WAVE文件中,样本
是交替出现的。
参考网址一和二中都给出了wav的头定义,但有一个小区别,一中将这个44个字节作为一个
大的头,给定在一个结构体中,而二中则是按照四个不同的chunk处理的,所以就给了四个结构
体,后面我的代码也是根据二来写的,个人觉得这样比较清晰,不过这纯属个人感觉。
下面就是根据四个结构体写的代码,注意FACT不是必须的,可以不用写入头,不写的话就
是44个字节,写的话wave的头是56个字节。
一:源代码(参考二中也有比较详细的读wave头的代码)
#if !defined(_WAV_INFO_)
#define _WAV_INFO_
// 一些和声音数据相关的宏
#define SAMPLE_RATE 22050 // sample rate,每秒22050个采样点
#define QUANTIZATION 0x10 // 16bit量化,
#define BYTES_EACH_SAMPLE 0x2 // QUANTIZATION / 8, 所以每个采样点、
// 是short,占个2个字节
#define CHANNEL_NUN 0x1 // 单声道
#define FORMAT_TAG 0x1 // 线性PCM
// 一个wave file包括四个CHUNK,除了FACT之外,其它是必须的,并且第一个RIFF是整个文件的头,
// 所以别名为WAV_HEADER,而不是RIFF
/*------------------------Wave File Structure ------------------------------------ */
typedef struct RIFF_CHUNK{
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
评论0