WAVE文件格式分析
來源:
http://soundfile.sapp.org/doc/WaveFormat/
http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf
Wave文件是用於多媒體文件存儲的Microsoft RIFF(Resource Interchange File Format 資源交換檔案標準)規範的子集之一。一個RIFF文件以一個文件頭(File Header)開始,接着是一系列數據塊(data chunk)。一個Wave文件常常是一個帶有一個單“WAVE”塊的RIFF文件。該“WAVE”chunk由兩個子快組成,一個“fmt”chunk用於詳細說明數據格式,一個“data”chunk包含實際的樣本數據。這種形式我們稱爲規範形式。
Offset | Size | Name | Description |
---|---|---|---|
0 | 4 | ChunkID | ASCII碼”0x52494646”對應字母”RIFF” |
4 | 4 | ChunkSize | 塊大小是指除去ChunkID與ChunkSize的剩餘部分有多少字節數據。注意:小尾字節序數。 |
8 | 4 | Format | ASCII碼”0x57415645”對應字母”WAVE”。該塊由兩個子快組成,一個“fmt”chunk用於詳細說明數據格式,一個“data”chunk包含實際的樣本數據。 |
12 | 4 | Subchunk1ID | ASCII碼”0x666d7420”對應字母”fmt “。 |
16 | 4 | Subchunk1Size | 如果文件採用PCM編碼,則該子塊剩餘字節數爲16。 |
20 | 2 | AudioFormat | 如果文件採用PCM編碼(線性量化),則AudioFormat=1。AudioFormat代表不同的壓縮方式。 |
22 | 2 | NumChannels | 聲道數,單聲道(Mono)爲1, 雙聲道(Stereo)爲 2。 |
24 | 4 | SampleRate | 取樣率,例:44.1kHz,48kHz。 |
28 | 4 | ByteRate | 傳輸速率,單位:Byte/s。 |
32 | 2 | BlockAlign | 一個樣點(包含所有聲道)的字節數。 |
34 | 2 | BitsPerSample | 每個樣點對應的位數。 |
2 | ExtraParamSize | 如果採用PCM編碼,該值不存在。 | |
X | ExtraParams | 用於存儲其他參數。如果採用PCM編碼,該值不存在。 | |
36 | 4 | Subchunk2ID | ASCII碼”0x64617461”對應字母”data”。 |
40 | 4 | Subchunk2Size | 實際樣本數據的大小(單位:字節)。 |
44 | * | Data | 實際的音頻數據 。 |
上圖所示例子,該WAVE文件採用PCM編碼。該音頻具有雙聲道,每個樣點進行16位量化編碼,雙聲道的一個樣點佔4字節,存儲順序是每個樣點的左右聲道交替存儲。
Q & A
8bit與16bit樣值的二進制編碼表示是一樣的嗎?
8bit樣值以無符號形式存儲,取值範圍0-255 。而16bit樣值以有符號的補碼形式存儲,取值範圍-32768 to 32767。
現有的WAV支持哪幾種音頻壓縮方法
AudioFormat | Description |
---|---|
0 (0x0000) | Unknown |
1 (0x0001) | PCM/uncompressed |
2 (0x0002) | Microsoft ADPCM |
6 (0x0006) | ITU G.711 a-law |
7 (0x0007) | ITU G.711 µ-law |
17 (0x0011) | IMA ADPCM |
20 (0x0016) | ITU G.723 ADPCM (Yamaha) |
49 (0x0031) | ITU G.721 ADPCM |
80 (0x0050) | MPEG |
65,536 (0xFFFF) | Experimental |