WAV文件格式

WAV File(1)

是存儲音頻比特流的本地文件格式,由Microsoft和IBM聯合開發,應用資源交換文件格式(RIFF)組織數據,將其存儲在塊(chunk)中,是Windows上原始和未壓縮音頻數據的主流格式。

WAV 文件多數情況下是以線性脈衝編碼調製(PCM)方式的未壓縮文件。PCM方式保留了音軌的所有樣本,使得WAV文件有較高的音頻質量。同時WAV文件支持壓縮音頻,可使用任意的ACM編解碼器壓縮WAV文件。

RIFF (Resource Interchange File Format)

是一種標記文件格式(tagged file format),可以看做是一個特殊的容器( container),其通用格式是:

4字節:此塊的ASCII標識符4字節:塊長度(除此字段本身和塊標識符,且填充字節不計入塊的大小)大小可變字段:塊數據padding字節:填充塊數據(因爲塊數據必須是字對齊(Word aligned)的,即總的長度必須是2的倍數)


RIFF格式的優點:可拓展成不同類型的文件而不至引起混淆

                             允許程序不必識特定的塊且可以跳過這些塊去處理後續的數據(RIFF的讀取規則:忽略不能識別的                              帶有標記的塊)

並且某些特定的塊中還可以包括子塊(sub chunks),如WAV文件中的Wave List Chunk--"wavl"(用於指定幾個交替的靜音塊(slnt)和數據塊("data"))。


WAV文件中的塊:

1.Wave File Header - RIFF Type Chunk

按照標準的RIFF文件格式定義,起始的8字節是標準的RIFF文件塊標題,標識符"RIFF"和塊大小,緊隨的4字節定義RIFF塊中的資源類型,在WAV文件中即爲"WAVE(0x57415645)",類型定義之後是wave  chunks,定義音頻數據。

Offset Size Despription Value
0x00 4 Chunk ID "RIFF"(0x52494646)
0x04 4 Chunk Data Size (file size )-8
0x08 4 RIFF Type "WAVE"(0x57415645)
0x10 wave chunks
有多種類型的chunks可用於描述wave 文件,其中最常用的是Format  Chunk和Data Chunk(Format Chunk通常置於Data Chunk之前)。

Chunk Data Size:整個文件的大小,以字節爲單位減去Chunk ID和Chunk Data Size所佔的8的字節或

4 + (8 + Format Size) + (8 + Data Size)



Format Chunk - "fmt":描述WAV文件中音頻數據的存儲方式,壓縮方式,通道數,採樣率,(樣值的)量化比特數等信息

Offset Size Description Value
0x00 4 Chunk ID "fmt"(0x666D7420)
0x04 4 Chunk Data Size 16+extra format bytes
0x08 2 Compression Code 1 - 65535
0x0a 2 Number of Channels 1 - 65535
0x0c 4 Sample rate 1 - 0xFFFFFFFF
0x10 4 Byte rate 1 - 0xFFFFFFFF
0x14 2 Block align 1 - 65535
0x16 2 Bits per sample 2 - 65535
0x18 2 Extra format bytes 0 - 65535
0x1a EXtra format bytes
chunk ID:通常是"fmt",如果不包含未壓縮的數據,Chunk ID的字符串以空格(0x20)結尾。

Data Size:是標準WAVE文件(16比特量化)的數據與特殊WAVE文件所需的特定字節之和,有16,18或40

Compression Code:表明wave chunk中數據的壓縮方式:

Code Description
0(0x000000) Unknown
1(0x0001) PCM/uncompressed
2(0x0002) Mocrosoft ADPCM
6(0x0006) ITU G.711 a-law
7(0x0007) ITU G.711 Âμ-law
17(0x0011) IMA ADPCM
22(0x0016) ITU G.273 ADPCM(Yamaha)
49(0x0031) GSM 6.10
64(0x0040) ITU G.271 ADPCM
80(0x0050) MPEG
65534(0xFFFE) Determined by SubFormat
65535(0xFFFF) Experimental
採用不同壓縮編碼格式的音頻比特率之間的比較:

格式 比特率(kbit/s) 每分鐘數據量(iB)
11,025 Hz 16 bit PCM 176.4 1292
8,000 Hz 16 bit PCM 128 938
11,025 Hz 8 bit PCM 88.2 646
11,025 Hz µ-Law 88.2 646
8,000 Hz 8 bit PCM 64 469
8,000 Hz µ-Law 64 469
11,025 Hz 4 bit ADPCM 44.1 323
8,000 Hz 4 bit ADPCM 32 234

實例:


0x00 06:A-law壓縮方法,此時Format chunk中要有Extra Foemat Bytes以包含解碼所需的信息,fmt塊(標識符 0x)的大小也變爲18(0x00000012)字節,此時data塊的前面還要加入存儲壓縮碼信息的Fact chunk (詳見Fact chunk)


此例中採用μ-law(0x0007)壓縮方法,Format chunk中同樣含有Extra Foemat Bytes以包含解碼所需的信息,fmt塊(標識符 0x)的大小也爲18(0x00000012)字節,在data塊之前也有fact塊。


此例中通道數爲8,採樣率爲48kHz,壓縮方式爲0x FF FE(WAVE_FORMAT_EXTENSIBLE,主要用於定義多於2通道和高採樣率的WAVE文件的編碼方式),同時在data塊之前含有cue塊(詳見Cue Chunk


Number of channels:通道數,即在chunk中編碼傳輸的音頻信號的路數:mono signal和stereo signal WAVE_FORMAT_EXTENSIBLE,主要用於定義多於2通道和高採樣率的WEVE文件的編碼方式


實例:

mono - 16bit


stereo - 16bit


0x66 6D 74 20:表示標識符"fmt"

0x00 00 00 10:"fmt"塊的大小:16字節(PCM)

0x00 01:壓縮方式:PCM

0x00 02:通道數2(stereo)

0x00 00 AC 44:採樣率 44.1KHz

0x00 02 81 10:字節速率:176400

0x00 04:一個樣本的字節數:4

0x00 10:量化比特數:16


6通道


Sample rate:採樣率,與通道數無關。常用採樣頻率:CD:44.1kHz  DAT tapes:48kHz

Byte rate:每秒要傳輸到D/A轉化器的字節數,決定了數據是否可以從源以足夠高的速率傳輸以保證持續的播放,計算公式: Sample Rate*Block Align

Block Align:每個樣本的字節數 計算公式:BitsPerSample / 8 *Num channels

 Bits per Sample:指定用於定義每個樣本的比特數 ,通常爲8、16、24、32,如果不是8的倍數,就以離8的倍數最近的數爲準,未使用的字節設置爲0




8比特樣值爲無符號數0~255,其餘爲有符號數,如16比特的樣值範圍:-32768 - 32767

Extra Foemat Bytes:與解碼時需要的信息有關,如果壓縮方式爲0,此部分爲空,且此部分也需要字對齊(Word aligned)



Data Chunk - "data"

包含使用format Chunk  中定義的編碼方式編碼的數據(compression code爲1時,指未壓縮的原始音頻數據)

Wave List Chunk(wavl)中也可包含數據塊,且可包含多個(被壓縮後的數據)

Offset Length Type Description Value
0x00 4 Char[4] Chunk ID "data"(0x64617461)
0x04 4 DWORD Chunk Size 取決於樣本長度和壓縮樣本數
0x08  
Chunk Size:數據塊大小,計算公式:
NumSamples * NumChannels * BitsPerSample/8
實例:

                                       

多通道數字音頻數據以隔行方式存儲,在每個採樣週期內通過循環遍歷每個通道的採樣數據,以保證在全部數據被讀取完成之前便可播放文件,這使得在播放大音頻文件或在網絡上播放時十分方便。

音頻數據在data chunk中的存儲順序爲:

Time Channel Value
0 1(left)
2(right)
0x0053
0x0024
1 1(left)
2(right)
0x0057
0x0029
除此之外還有Fact Chunk,Cue Chunk,Playlist  Chunk,和Associated Data List  Chunk等

綜上,WAV文件的結構爲:





Chunk ID "RIFF"
Chunk Data size
 
RIFF Type ID "WAVE"


Chunk ID "fmt"
Chunk Data size
 
Sample Format Info


Chunk ID "data"
Chunk Data size
 
Digital Audio Samples


儘管未壓縮的WAV文件很大,但其廣泛用於存儲高質量的原始數據,WAV文件結構簡單。一些使用無磁帶系統的廣播電臺也會使用WAV文件,並且世界數字無線電聯盟將WAV文件作爲發射機仿真和接收機測試的非正式標準由於WAV文件的採樣率在1-4.3GHz之間變化,並且聲道數最多可達65535路,因此WAV文件也可用於非音頻文件。

侷限性:由於使用32比特的無符號整數記錄文件頭,WAV文件的大小限於4GB(部分則限於2GB),

參考資料:https://en.wikipedia.org/wiki/WAV

                 https://en.wikipedia.org/wiki/Resource_Interchange_File_Format

                        http://soundfile.sapp.org/doc/WaveFormat/                                                

                 http://www.topherlee.com/software/pcm-tut-wavformat.html

                 http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

多類型WAV文件下載:

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章