WAV格式解析


 

 WAV為微軟公司(Microsoft)開發的一種聲音文件格式,它符合RIFF(Resource Interchange File Format)文件規范,用於保存Windows平台的音頻信息資源,被Windows平台及其應用程序所廣泛支持,

該格式也支持MSADPCM,CCITT A LAW等多種壓縮運算法,支持多種音頻數字,取樣頻率和聲道,標准格式化的WAV文件和CD格式一樣,也是44.1K的取樣頻率,16位量化數字,因此在聲音文件質量和CD相差無幾。

 

WAVE文件為了與RIFF保持一致,數據采用“chunk”來存儲。

因此,如果想要在WAVE文件中補充一些新的信息,只需要在在新chunk中添加信息,而不需要改變整個文件。這也是設計IFF最初的目的。

對於一個基本的WAVE文件而言,最少包含以下三種Chunk:

以上三個chunk 順序固定,對於其它的chunk,順序沒有嚴格的限制。

 

具體格式如下:

 

然而,所有基於壓縮編碼的WAV文件必須含有fact塊。此外所有其它塊都是可選的。fmt,Data及fact塊均為RIFF塊的子塊。WAV文件的文件格式類型標識符為“WAVE”。

 

 

各個chunk中字段的意義如下:

RIFF chunk

ID big-endian FOURCC 值為'R' 'I' 'F' 'F'
Size little-endian data字段中數據的字節數
Data big-endian 包含其它的chunk

 

 

 

 

 

 

Format chunk

ID big-endian    FOURCC 值為 'f' 'm' 't' ' '
Size little-endian      數據字段包含數據的大小。如無擴展塊,則值為16;有擴展塊,則值為 16 + 2字節擴展塊長度 + 擴展塊長度或者值為18(只有擴展塊的長度為2字節,值為0)
Data little-endian format_tag 2字節,表示音頻數據的格式。如值為1,表示使用PCM格式。
little-endian channels 2字節,聲道數。值為1則為單聲道,為2則是雙聲道。
little-endian samples_per_sec 采樣率,主要有22.05KHz,44.1kHz和48KHz。
little-endian bytes_per sec 音頻的碼率,每秒播放的字節數。samples_per_sec * channels * bits_per_sample / 8,可以估算出使用緩沖區的大小
little-endian block_align 數據塊對齊單位,一次采樣的大小,值為聲道數 * 量化位數 / 8,在播放時需要一次處理多個該值大小的字節數據。
little-endian bits_per_sample 音頻sample的量化位數,有16位,24位和32位等。
  cbSize 擴展區的長度
  擴展格式塊內容 22字節,具體介紹請看下面

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 其中 format_tag 可以取如下值:

格式代碼 格式名稱 fmt 塊長度 fact 塊
1(0x0001) PCM/非壓縮格式 16  
2(0x0002 Microsoft ADPCM 18
3(0x0003) IEEE float 18
6(0x0006) ITU G.711 a-law 18
7(0x0007) ITU G.711 μ-law 18
49(0x0031) GSM 6.10 20
64(0x0040) ITU G.721 ADPCM  
65,534(0xFFFE) 見子格式塊中的編碼格式 40  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

其中的擴展格式塊:

當WAV文件使用的不是PCM編碼方式是,就需要擴展格式塊,它是在基本的Format chunk又添加一段數據。

該數據的前兩個字節,表示的擴展塊的長度。緊接其后的是擴展的數據區,含有擴展的格式信息,其具體的長度取決於壓縮編碼的類型。

當某種編碼方式(如 ITU G.711 a-law)使擴展區的長度為0,擴展區的長度字段還必須保留,只是其值設置為0。

擴展區的各個字節的含義如下:

Size 擴展區的數據長度 ,可以為0或22
valid_bits_per_sample 有效的采樣位數,最大值為采樣字節數 * 8。可以使用更靈活的量化位數,通常音頻sample的量化位數為8的倍數,但是使用了WAVE_FORMAT_EXTENSIBLE時,量化的位數有擴展區中的valid bits per sample來描述,可以小於Format chunk中制定的bits per sample
channle mask 4字節,聲道掩碼
sub format 16字節,GUID,include the data format code,數據格式碼。

 

 

 

在Format chunk中的format_tag設置為0xFFFE時,表示使用擴展區中的sub_format來決定音頻的數據的編碼方式。在以下幾種情況下必須要使用WAVE_FORMAT_EXTENSIBLE

  • PCM數據的量化位數大於16
  • 音頻的采樣聲道大於2
  • 實際的量化位數不是8的倍數
  • 存儲順序和播放順序不一致,需要指定從聲道順序到聲卡播放順序的映射情況。

 

 

Fact chunk (可選)

ID FOURCC 值為 'f' 'a' 'c' 't'
Size 數據域的長度,4(最小值為4)
Data 每個聲道的采樣總數 4字節

 

 

 

 

 

 

Data chunk

ID FOURCC 值為'd' 'a' 't' 'a'
Size 數據域的長度
Data

具體的音頻數據存放在這里

 

 

 

 

 

 

Data塊中存放的是音頻的采樣數據。每個sample按照采樣的時間順序寫入,對於使用多個字節的sample,使用小端模式存放(低位字節存放在低地址,高位字節存放在高地址)。對於多聲道的sample采用交叉存放的方式。例如:立體雙聲道的sample存儲順序為:聲道1的第一個sample,聲道2的第一個sample;聲道1的第二個sample,聲道2的第二個sample;依次類推....。對於PCM數據,有以下兩種的存儲方式:

  • 單聲道,量化位數為8,使用偏移二進制碼
  • 除上面之外的,使用補碼方式存儲。

 

 

描述WAVE文件的基本單元是“Sample”,一個Sample代表采樣一次得到的數據。因此如果用44KHz采樣,將在一秒中得到44000個Sample。

每個Sample可以用8位、24位,甚至32位表示(位數沒有限制,只要是8的整數倍即可),位數越高,音頻質量越好。

注意:8位代表無符號的數值,而16位或16位以上代表有符號的數值

 

 

每秒數據大小(字節)=采樣率 * 聲道數 * sample比特數 / 8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM