WAVE文件頭作為(wei)多媒體中使(shi)用的聲波文(wen)件(jian)格式之一,它是以(yi)RIFF格式為標準的。RIFF是英文(wen)Resource Interchange File Format的縮寫,每個WAVE文(wen)件(jian)的頭四個字節便是“RIFF”。合理利用WAVE文(wen)件(jian)頭可(ke)以(yi)更有效(xiao)地進行語音解(jie)碼。
通常意義(yi)上說(shuo)的語音編碼(ma)都(dou)是指將8KHz采樣(yang)、16比(bi)特量化的線性(xing)PCM語音(yin)(yin)信(xin)(xin)號(hao)壓(ya)縮成其它格(ge)式的語音(yin)(yin)信(xin)(xin)號(hao),解碼時就(jiu)將其它格(ge)式的語音(yin)(yin)信(xin)(xin)號(hao)變換成8KHz采樣、16比特量化的線(xian)性PCM語音(yin)(yin)信(xin)(xin)號(hao)。一般說來(lai),這個轉換過(guo)程比較(jiao)復(fu)雜,費(fei)時費(fei)力。如果對其它格(ge)式的語音(yin)(yin)信(xin)(xin)號(hao)直接加上對應的WAVE文(wen)件頭就(jiu)不用(yong)這個轉換過(guo)程,用(yong)微軟自帶的錄音(yin)機就(jiu)可解碼語音(yin)。
下面就分別剖析(xi)各(ge)種語音編(bian)碼的WAVE文件頭格式,用如(ru)下各(ge)個表(biao)(表(biao)1到表(biao)7)進行對比即可。
表1 8KHz采樣、16比特量化的線性PCM語音信號的WAVE文件頭格式表(共44字節)
偏(pian)移(yi)地址 字節數 數據類型 內容(rong) 文件頭定義為
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文(wen)件總長-8 long int size0=文(wen)總長-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 10 00 00 00H(PCM) long int size1=0x10
14H 2 int 01 00H int fmttag=0x01
16H 2 int int channel=1 或2
18H 4 long int 采樣率 long int samplespersec
1CH 4 long int 每秒播放字節數 long int bytepersec
20H 2 int 采樣一次占字(zi)節(jie)數(shu) int blockalign=聲道數(shu)*量化數(shu)/8
22H 2 int 量化(hua)數(shu) int bitpersamples=8或16
24H 4 char "data" char data_id="data"
28H 4 long int 采(cai)樣數據字(zi)節數 long int size2=文長(chang)-44
2CH 到文尾 char 采樣數據
表2 8KHz采樣、8比特A律量化的PCM語音信號的WAVE文件頭格式表(共58字節)
偏移地址(zhi) 字(zi)節(jie)數 數據類(lei)型(xing) 內容 文件頭定義(yi)為
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件總長(chang)-8 long int size0=文總長(chang)-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(ALAW) long int size1=0x12
14H 2 int 06 00H int fmttag=0x06
16H 2 int 聲道數(shu) int channel=1 或2
18H 4 long int 采(cai)樣率 long int samplespersec
1CH 4 long int 每秒(miao)播放字(zi)節(jie)數 long int bytepersec
20H 2 int 采樣一次占字節數 int blockalign=0x01
22H 4 long int 量化數 long int bitpersamples=8
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000000530700H定 char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采(cai)樣數據(ju)字節數 lont int size2=文長-58
表3 8KHz采樣、8比特U律量化的PCM語音信號的WAVE文件頭格式表(共58字節)
偏移地址 字節數 數據(ju)類型 內容 文件頭定義為
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件(jian)總(zong)長(chang)-8 long int size0=文總(zong)長(chang)-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(ULAW) long int size1=0x12
14H 2 int 07 00H int fmttag=0x07
16H 2 int 聲(sheng)道數 int channel=1 或2
18H 4 long int 采樣(yang)率 long int samplespersec
1CH 4 long int 每秒播放字節數(shu) long int bytepersec
20H 2 int 采(cai)樣一(yi)次占字節數(shu) int blockalign=0x01
22H 4 long int 量化數 long int bitpersamples=8
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000000530700H定(ding) char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采樣數據字節數 lont int size2=文長-58
表4 ADPCM語音編碼后的WAVE文件頭格式表(共90字節)
偏(pian)移(yi)地址(zhi) 字(zi)節數 數據(ju)類型 內容 文件頭定義(yi)為(wei)
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文(wen)(wen)件總(zong)長-8 long int size0=文(wen)(wen)總(zong)長-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 32000000H(ADPCM) long int size1=0x32
14H 2 int 02 00H int fmttag=0x02
16H 2 int 聲道數 int channel=1 或2
18H 4 long int 采樣(yang)率 long int samplespersec
1CH 4 long int 每秒(miao)播放(fang)字節(jie)數 long int bytepersec
20H 2 int 采樣一次占字節數(shu) int blockalign=聲(sheng)道數(shu)*量化(hua)數(shu)/8
22H 2 int 量化數(shu) int bitpersamples=4
24H 34 char 固定字節 char temp1
46H 4 char "fact" char wave_fact="fact"
4AH 8 char 0400000004930600H定 char temp2
52H 4 char "data" char wave_data="data"
56H 4 long int 采樣(yang)數據(ju)字節數 lont int size2=文(wen)長-90
5AH 到文尾 采樣數據
表5 GSM語音編碼后的WAVE文件頭格式表(共60字節)
偏移地址 字節數 數據(ju)類型 內容 文件頭定義為(wei)
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文件總長(chang)-8 long int size0=文總長(chang)-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 14000000H(GSM) long int size1=0x14
14H 2 int 31 00H int fmttag=0x31
16H 2 int 聲(sheng)道數 int channel=1 或2
18H 4 long int 采(cai)樣率(lv) long int samplespersec
1CH 4 long int 每秒播(bo)放(fang)字節數 long int bytepersec
20H 8 char 4100000002004001H定(ding) char temp1
28H 8 char 6661637404000000H定(ding) char temp2
30H 4 char 40 E2 05 00H定 char temp3
34H 4 char "data" char wave_data="data"
38H 4 long int 采樣數據字節數 lont int size2=文長-60
3CH 到文尾 采樣(yang)數(shu)據
表6 SBC語音編碼后的WAVE文件頭格式表(共58字節)
偏移地址(zhi) 字節數(shu)(shu) 數(shu)(shu)據類型 內容(rong) 文件頭定義為(wei)
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文(wen)件(jian)總長(chang)-8 long int size0=文(wen)總長(chang)-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(SBC) long int size1=0x12
14H 2 int 71 00H int fmttag=0x71
16H 2 int 聲道數 int channel=1 或2
18H 4 long int 采樣率(lv) long int samplespersec
1CH 4 long int 每秒播(bo)放字節(jie)數 long int bytepersec
20H 2 int 采(cai)樣一次占字節數 int blockalign=0x25
22H 4 long int 量化數 long int bitpersamples=16
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000076280400H定 char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采(cai)樣數據字節數 lont int size2=文(wen)長-59
表7 CELP語音編碼后的WAVE文件頭格式表(共58字節)
偏移地(di)址 字節(jie)數 數據類型 內容 文件(jian)頭定(ding)義為
00H 4 char "RIFF" char riff_id[4]="RIFF"
04H 4 long int 文(wen)件(jian)總長-8 long int size0=文(wen)總長-8
08H 8 char "WAVEfmt " char wave_fmt[8]
10H 4 long int 12000000H(CELP) long int size1=0x12
14H 2 int 70 00H int fmttag=0x70
16H 2 int 聲道(dao)數 int channel=1 或2
18H 4 long int 采樣率 long int samplespersec
1CH 4 long int 每(mei)秒播放字節數 long int bytepersec
20H 2 int 采樣一次(ci)占字節數 int blockalign=0x0C
22H 4 long int 量化(hua)數(shu) long int bitpersamples=16
26H 4 char "fact" char wave_fact="fact"
2AH 8 char 0400000060520700H定 char temp
32H 4 char "data" char wave_data="data"
36H 4 long int 采(cai)樣(yang)數(shu)(shu)據字(zi)節數(shu)(shu) lont int size2=文長(chang)-58