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 |
---|
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 |
---|
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 |
NumSamples * NumChannels * BitsPerSample/8
實例:
多通道數字音頻數據以隔行方式存儲,在每個採樣週期內通過循環遍歷每個通道的採樣數據,以保證在全部數據被讀取完成之前便可播放文件,這使得在播放大音頻文件或在網絡上播放時十分方便。
音頻數據在data chunk中的存儲順序爲:
Time | Channel | Value |
0 | 1(left) 2(right) |
0x0053 0x0024 |
1 | 1(left) 2(right) |
0x0057 0x0029 |
綜上,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