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