本文共 5623 字,大约阅读时间需要 18 分钟。
WAVE文件头作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是“RIFF”。合理利用WAVE文件头可以更有效地进行语音解码。
通常意义上说的语音编码都是指将8KHz采样、16比特量化的线性PCM语音信号压缩成其它格式的语音信号,解码时就将其它格式的语音信号变换成8KHz采样、16比特量化的线性PCM语音信号。一般说来,这个转换过程比较复杂,费时费力。如果对其它格式的语音信号直接加上对应的WAVE文件头就不用这个转换过程,用微软自带的录音机就可解码语音。 下面就分别剖析各种语音编码的WAVE文件头格式,用如下各个表(表1到表7)进行对比即可。表1 8KHz采样、16比特量化的线性PCM语音信号的WAVE文件头格式表(共44字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 10 00 00 00H(PCM) long int size1=0x1014H 2 int 01 00H int fmttag=0x0116H 2 int int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=声道数*量化数/822H 2 int 量化数 int bitpersamples=8或1624H 4 char "data" char data_id="data"28H 4 long int 采样数据字节数 long int size2=文长-442CH 到文尾 char 采样数据 表2 8KHz采样、8比特A律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(ALAW) long int size1=0x1214H 2 int 06 00H int fmttag=0x0616H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=0x0122H 4 long int 量化数 long int bitpersamples=826H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000000530700H定 char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数 lont int size2=文长-58表3 8KHz采样、8比特U律量化的PCM语音信号的WAVE文件头格式表(共58字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(ULAW) long int size1=0x1214H 2 int 07 00H int fmttag=0x0716H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=0x0122H 4 long int 量化数 long int bitpersamples=826H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000000530700H定 char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数 lont int size2=文长-58表4 ADPCM语音编码后的WAVE文件头格式表(共90字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 32000000H(ADPCM) long int size1=0x3214H 2 int 02 00H int fmttag=0x0216H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=声道数*量化数/822H 2 int 量化数 int bitpersamples=424H 34 char 固定字节 char temp146H 4 char "fact" char wave_fact="fact"4AH 8 char 0400000004930600H定 char temp252H 4 char "data" char wave_data="data"56H 4 long int 采样数据字节数 lont int size2=文长-905AH 到文尾 采样数据 表5 GSM语音编码后的WAVE文件头格式表(共60字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 14000000H(GSM) long int size1=0x1414H 2 int 31 00H int fmttag=0x3116H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 8 char 4100000002004001H定 char temp128H 8 char 6661637404000000H定 char temp230H 4 char 40 E2 05 00H定 char temp334H 4 char "data" char wave_data="data"38H 4 long int 采样数据字节数 lont int size2=文长-603CH 到文尾 采样数据 表6 SBC语音编码后的WAVE文件头格式表(共58字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(SBC) long int size1=0x1214H 2 int 71 00H int fmttag=0x7116H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=0x2522H 4 long int 量化数 long int bitpersamples=1626H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000076280400H定 char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数 lont int size2=文长-59表7 CELP语音编码后的WAVE文件头格式表(共58字节)偏移地址 字节数 数据类型 内容 文件头定义为00H 4 char "RIFF" char riff_id[4]="RIFF"04H 4 long int 文件总长-8 long int size0=文总长-808H 8 char "WAVEfmt " char wave_fmt[8]10H 4 long int 12000000H(CELP) long int size1=0x1214H 2 int 70 00H int fmttag=0x7016H 2 int 声道数 int channel=1 或218H 4 long int 采样率 long int samplespersec1CH 4 long int 每秒播放字节数 long int bytepersec20H 2 int 采样一次占字节数 int blockalign=0x0C22H 4 long int 量化数 long int bitpersamples=1626H 4 char "fact" char wave_fact="fact"2AH 8 char 0400000060520700H定 char temp32H 4 char "data" char wave_data="data"36H 4 long int 采样数据字节数 lont int size2=文长-58WAVEFORMATEX
typedef struct{WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX;具体参数解释如下: wFormatTag:波形数据的格式,定义在MMREG.H文件中 nChannels:波形数据的通道数:单声道或立体声 nSamplesPerSec:采样率,对于PCM格式的波形数据,采样率有8.0 kHz,11.025kHz,22.05 kHz,44.1 kHz等 nAvgBytesPerSec:数据率,对于PCM格式的波形数据,数据率等于采样率乘以每样点字节数 nBlockAlign:每个样点字节数 wBitsPerSample:采样精度,对于PCM格式的波形数据,采样精度为8或16 cbSize:附加格式信息的数据块大小 概念2、定义设备头结构 WAVEHDR定义了指向波形数据缓冲区的设备头。
WAVEHDR
typedef struct { LPSTR lpData; DWORD dwBufferLength; DWORD dwBytesRecorded; DWORD dwUser; DWORD dwFlags; DWORD dwLoops; struct wavehdr_tag * lpNext; DWORD reserved; } WAVEHDR;lpData:波形数据的缓冲区地址 dwBufferLength:波形数据的缓冲区地址的长度 dwBytesRecorded:当设备用于录音时,标志已经录入的数据长度 dwUser:用户数据 dwFlags:波形数据的缓冲区的属性 dwLoops:播放循环的次数,仅用于播放控制中 lpNext和reserved均为保留值 注意:上述结构体以及我们在程序中所使用到的“HWAVEIN””HWAVEOUT”结构体均是系统已经存在的,我们只需要对其进行赋值即可。 几个收藏的关于WAVE的网址
转载地址:http://argdi.baihongyu.com/