1、WAV文件概述
WAV是微軟公司開發(fā)的一種音頻格式文件,用于保存Windows平臺(tái)的音頻信息資源,它符合資源互換文件格式(Resource Interchange File Format,RIFF)文件規(guī)范。標(biāo)準(zhǔn)格式化的WAV文件和CD格式一樣,也是44.1K的取樣頻率,16位量化數(shù)字,因此在聲音文件質(zhì)量和CD相差無幾!
WAV通常用來保存PCM格式的原始音頻數(shù)據(jù),所以通常被稱為無損音頻。但是嚴(yán)格意義上來講,WAV也可以存儲(chǔ)其它壓縮格式的音頻數(shù)據(jù)。
2、WAV文件格式
WAV符合RIFF文件格式標(biāo)準(zhǔn),可以看作是RIFF文件的一個(gè)具體實(shí)例。既然WAV符合RIFF規(guī)范,其基本的組成單元也是chunk。一個(gè)WAV文件通常有三個(gè)chunk以及一個(gè)可選chunk,其在文件中的排列方式依次是:RIFF chunk,F(xiàn)ormat chunk,F(xiàn)act chunk(附加塊,可選),Data chunk。示意圖如下:
2019-10-21_162529
一個(gè)WAV文件,首先是一個(gè)RIFF chunk,其格式類型為'WAVE'。RIFF chunk包括兩個(gè)子chunk,ID分別為 'fmt '和'data',還有一個(gè)可選的Fact chunk。Format chunk用于表示音頻數(shù)據(jù)的屬性,包括編碼方式、聲道數(shù)目、采樣頻率、每個(gè)采樣需要的bit數(shù)等等信息。Fact chunk是一個(gè)可選chunk,一般當(dāng)WAVE文件由某些軟件轉(zhuǎn)化而成就包含F(xiàn)act chunk。Data chunk包含WAVE文件的數(shù)字化波形聲音數(shù)據(jù)。WAVE整體結(jié)構(gòu)如下圖所示:
2019-10-21_162508
接下來講講各個(gè)chunk的具體內(nèi)容。
3、各個(gè)chunk的具體內(nèi)容
(1).RIFF chunk
ID:4字節(jié),值為"RIFF"。
Size:4字節(jié),ChunkData字段中數(shù)據(jù)的大小,單位:字節(jié)。
ChunkData:包含F(xiàn)ormType和其他chunk的內(nèi)容。
FormType:4字節(jié),值為"WAVE"。
Data:其他chunk的內(nèi)容。
(2).Format chunk
ID:4字節(jié),值為"fmt ",最后一個(gè)字符是空格。
Size:4字節(jié),數(shù)據(jù)字段(Data)包含的數(shù)據(jù)大小。如無擴(kuò)展塊,則值為16;有擴(kuò)展塊,則值為= 16 + 2字節(jié)擴(kuò)展塊長(zhǎng)度 + 擴(kuò)展塊內(nèi)容,或者值為18(只有擴(kuò)展塊長(zhǎng)度為2字節(jié),并且擴(kuò)展塊長(zhǎng)度值為0),單位:字節(jié)。
Data:存放音頻格式、聲道數(shù)、采樣率等信息。
audio_format:2字節(jié),表示音頻數(shù)據(jù)的格式。如值為1,表示使用PCM格式。
channels:2字節(jié),聲道數(shù)。值為1則為單聲道,為2則是雙聲道。
sample_rate:4字節(jié),采樣頻率,主要有22.05KHz,44.1kHz和48KHz等,例如0xAC44表示44100Hz。
bytes_per_sec:4字節(jié),音頻的碼率,每秒播放的字節(jié)數(shù)。其值為:聲道數(shù) * 采樣頻率 * 量化位數(shù) / 8,可以估算出使用緩沖區(qū)的大小。
block_align:2字節(jié),每個(gè)采樣點(diǎn)所需的字節(jié)數(shù),其值為:聲道數(shù) * 量化位數(shù) / 8。
bits_per_sample:2字節(jié),量化位數(shù),有16位,24位和32位等。
cbSize:2字節(jié),擴(kuò)展塊的長(zhǎng)度,其值可以為0或者22。
cbContent:0字節(jié)或22字節(jié),擴(kuò)展塊內(nèi)容,具體介紹在下文提及。
備注:這個(gè)區(qū)域只需要關(guān)心channels,sample_rate,bits_per_sample三個(gè)參數(shù)就可以了,其它的都是依據(jù)這三個(gè)計(jì)算出來的。
(3).Fact chunk(可選)
fact chunk為可選的,在大多數(shù)的WAV文件中是不存在的。采用壓縮編碼的WAV文件,必須要有Fact chunk,該塊中只有一個(gè)數(shù)據(jù),為每個(gè)聲道的采樣總數(shù)。
ID:4字節(jié),值為"fact"。
Size:4字節(jié),數(shù)據(jù)字段的長(zhǎng)度,其值最小為4。
Data:采樣總數(shù)。
(4).Data chunk
ID:4字節(jié),值為"data"。
Size:4字節(jié),音頻數(shù)據(jù)的長(zhǎng)度。
Data:具體的音頻數(shù)據(jù)內(nèi)容存放在這里。
4、Format chunk中的音頻數(shù)據(jù)格式
在format chunk中,有一個(gè)字段audio_format,該字段表示音頻數(shù)據(jù)是以何種方式進(jìn)行編碼存放的。其可選的取值有:
0x0001:WAVE_FORMAT_PCM,采用PCM格式,此時(shí)WAV文件中不包含F(xiàn)act chunk。
0x0002:WAVE_FORMAT_ADPCM,此時(shí)WAV文件中包含F(xiàn)act chunk。
0x0006:WAVE_FORMAT_ALAW,此時(shí)WAV文件中包含F(xiàn)act chunk。
0x0007:WAVE_FORMAT_MULAW,此時(shí)WAV文件中包含F(xiàn)act chunk。
0xFFFE:WAVE_FORMAT_EXTENSIBLE,具體的編碼方式由Format chunk中擴(kuò)展塊的sub_format字段決定。
備注:一般情況下,我們遇到的WAV文件的音頻數(shù)據(jù)編碼格式是PCM,介紹上述內(nèi)容,只是讓大家多了解下其他的編碼格式的值與名稱,當(dāng)遇到這類編碼時(shí),能夠知道其名稱,從而方便查詢相關(guān)資料。
5、Format chunk中的擴(kuò)展塊
當(dāng)WAV文件使用的不是PCM編碼方式時(shí),就需要擴(kuò)展格式塊,它是在基本的Format chunk中又添加一段數(shù)據(jù)。該數(shù)據(jù)的前兩個(gè)字節(jié),表示的是擴(kuò)展塊的長(zhǎng)度。緊接其后的是擴(kuò)展塊的數(shù)據(jù)區(qū),含有擴(kuò)展的格式信息,其具體的長(zhǎng)度取決于壓縮編碼的類型。當(dāng)某種編碼方式的擴(kuò)展塊的數(shù)據(jù)區(qū)長(zhǎng)度為0,此時(shí)擴(kuò)展塊只包含了擴(kuò)展塊長(zhǎng)度字段,擴(kuò)展塊的長(zhǎng)度字段還必須保留,只是其值設(shè)置為0。
擴(kuò)展塊的各個(gè)字節(jié)的含義如下:
cbSize:2字節(jié),擴(kuò)展塊的長(zhǎng)度,其值可以為0或者22。
cbContent:0字節(jié)或22字節(jié),擴(kuò)展塊內(nèi)容。
valid_bits_per_sample:2字節(jié),有效的采樣位數(shù),最大值為block_align * 8??梢允褂酶`活的量化位數(shù),通常音頻sample的量化位數(shù)為8的倍數(shù),但是使用了WAVE_FORMAT_EXTENSIBLE時(shí),量化的位數(shù)由擴(kuò)展塊中的valid_bits_per_sample來描述,可以小于Format chunk中指定的bits_per_sample。
channle_mask:4字節(jié),聲道掩碼。
sub_format:16字節(jié),數(shù)據(jù)格式碼。
在Format chunk中的audio_format設(shè)置為0xFFFE時(shí),表示使用擴(kuò)展區(qū)中的sub_format來決定音頻的數(shù)據(jù)的編碼方式。在以下幾種情況下必須要使用WAVE_FORMAT_EXTENSIBLE:
PCM數(shù)據(jù)的量化位數(shù)大于16。
音頻的采樣聲道大于2。
實(shí)際的量化位數(shù)不是8的倍數(shù)。
存儲(chǔ)順序和播放順序不一致,需要指定從聲道順序到聲卡播放順序的映射情況。
備注:一般情況下,我們遇到的WAV文件中是不含有擴(kuò)展塊的。
6、聲音數(shù)據(jù)格式
Data chunk中的Data塊中存放的是音頻的采樣數(shù)據(jù)。每個(gè)sample按照采樣的時(shí)間順序?qū)懭耄瑢?duì)于使用多個(gè)字節(jié)的sample,使用小端模式存放(低位字節(jié)存放在低地址,高位字節(jié)存放在高地址)。對(duì)于多聲道的sample采用交叉存放的方式。例如:立體雙聲道的sample存儲(chǔ)順序?yàn)椋郝暤?的第一個(gè)sample,聲道2的第一個(gè)sample;聲道1的第二個(gè)sample,聲道2的第二個(gè)sample;依次類推....。
對(duì)于Data chunk中的Data字段,也就是音頻數(shù)據(jù)內(nèi)容的存儲(chǔ),根據(jù)聲道數(shù)和采樣位數(shù)的不同情況,布局如下(每1列代表8 bits):
(1).8 bit單聲道
采樣1 | 采樣2 |
---|---|
數(shù)據(jù)1 | 數(shù)據(jù)2 |
(2).8 bit雙聲道
采樣1 | 采樣2 | ||
---|---|---|---|
聲道1數(shù)據(jù)1 | 聲道2數(shù)據(jù)1 | 聲道1數(shù)據(jù)2 | 聲道2數(shù)據(jù)2 |
(3).16 bit單聲道
采樣1 | 采樣2 | ||
---|---|---|---|
數(shù)據(jù)1低字節(jié) | 數(shù)據(jù)1高字節(jié) | 數(shù)據(jù)2低字節(jié) | 數(shù)據(jù)2高字節(jié) |
(4).16 bit雙聲道
聲道1采樣1 | 聲道2采樣1 | ||
---|---|---|---|
聲道1數(shù)據(jù)1低字節(jié) | 聲道1數(shù)據(jù)1高字節(jié) | 聲道2數(shù)據(jù)1低字節(jié) | 聲道2數(shù)據(jù)1高字節(jié) |
聲道1采樣2 | 聲道2采樣2 | ||
聲道1數(shù)據(jù)2低字節(jié) | 聲道1數(shù)據(jù)2高字節(jié) | 聲道2數(shù)據(jù)2低字節(jié) | 聲道2數(shù)據(jù)2高字節(jié) |
7、WAV文件實(shí)例分析
利用winhex工具軟件可以非常方便的以十六進(jìn)制查看文件,下圖是我用winhex軟件打開一個(gè)WAV音頻文件時(shí)的部分界面截圖:
2019-10-21_160033
下表對(duì)文件格式進(jìn)行解讀:
偏移地址 | 字節(jié)數(shù) | 16進(jìn)制源碼 | 內(nèi)容 |
---|---|---|---|
00H | 4 | 52 49 46 46 | 'RIFF'標(biāo)識(shí)符 |
04H | 4 | F4 FE 83 01 | 數(shù)據(jù)長(zhǎng)度:0x0183FEF4(注意順序) |
08H | 4 | 57 41 56 45 | 'WAVE'標(biāo)識(shí)符 |
0CH | 4 | 66 6D 74 20 | 'fmt ',最后一位為空格 |
10H | 4 | 10 00 00 00 | Format chunk大?。?x10 |
14H | 2 | 01 00 | 編碼格式:0x01為PCM |
16H | 2 | 02 00 | 聲道數(shù)目:0x02為雙聲道 |
18H | 4 | 44 AC 00 00 | 采樣頻率:0xAC44表示44100Hz |
1CH | 4 | 10 B1 02 00 | 每秒字節(jié)數(shù):0x02B110 |
20H | 2 | 04 00 | 每個(gè)采樣點(diǎn)所需的字節(jié)數(shù):0x04 |
22H | 2 | 10 00 | 量化位數(shù):0x10 |
24H | 4 | 64 61 74 61 | 'data'標(biāo)識(shí)符 |
28H | 4 | 48 FE 83 01 | 音頻數(shù)據(jù)的長(zhǎng)度:0x0183FE48 |
從偏移量2CH開始就是音頻數(shù)據(jù)了。
審核編輯:湯梓紅
-
音頻
+關(guān)注
關(guān)注
29文章
2868瀏覽量
81490 -
WAV
+關(guān)注
關(guān)注
0文章
22瀏覽量
19148 -
編碼
+關(guān)注
關(guān)注
6文章
940瀏覽量
54812 -
文件
+關(guān)注
關(guān)注
1文章
565瀏覽量
24727
原文標(biāo)題:WAV文件格式詳解
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論