wav數據格式詳解

1. 音頻簡介

 

經常見到這樣的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.

44100HZ 16bit stereo: 每秒鐘有 44100 次採樣, 採樣數據用 16 位(2字節)記錄, 雙聲道(立體聲);

22050HZ 8bit  mono: 每秒鐘有 22050 次採樣, 採樣數據用 8 位(1字節)記錄, 單聲道;

 

當然也可以有 16bit 的單聲道或 8bit 的立體聲, 等等。

 

採樣率是指:聲音信號在“模→數”轉換過程中單位時間內採樣的次數。採樣值是指每一次採樣週期內聲音模擬信號的積分值。

 

對於單聲道聲音文件,採樣數據爲八位的短整數(short int 00H-FFH);

而對於雙聲道立體聲聲音文件,每次採樣數據爲一個16位的整數(int),高八位(左聲道)和低八位(右聲道)分別代表兩個聲道。

 

人對頻率的識別範圍是 20HZ - 20000HZ, 如果每秒鐘能對聲音做 20000 個採樣, 回放時就足可以滿足人耳的需求. 所以 22050 的採樣頻率是常用的, 44100已是CD音質, 超過48000的採樣對人耳已經沒有意義。這和電影的每秒 24 幀圖片的道理差不多。

 

每個採樣數據記錄的是振幅, 採樣精度取決於儲存空間的大小:

1 字節(也就是8bit) 只能記錄 256 個數, 也就是隻能將振幅劃分成 256 個等級;

2 字節(也就是16bit) 可以細到 65536 個數, 這已是 CD 標準了;

4 字節(也就是32bit) 能把振幅細分到 4294967296 個等級, 實在是沒必要了.

如果是雙聲道(stereo), 採樣就是雙份的, 文件也差不多要大一倍.

 

這樣我們就可以根據一個 wav 文件的大小、採樣頻率和採樣大小估算出一個 wav 文件的播放長度。

 

譬如 "Windows XP 啓動.wav" 的文件長度是 424,644 字節, 它是 "22050HZ / 16bit / 立體聲" 格式(這可以從其 "屬性->摘要" 裏看到),

那麼它的每秒的傳輸速率(位速, 也叫比特率、取樣率)是 22050*16*2 = 705600(bit/s), 換算成字節單位就是 705600/8 = 88200(字節/秒), 
播放時間:424644(總字節數) / 88200(每秒字節數) ≈ 4.8145578(秒)。

但是這還不夠精確, 包裝標準的 PCM 格式的 WAVE 文件(*.wav)中至少帶有 42 個字節的頭信息, 在計算播放時間時應該將其去掉, 
所以就有:(424644-42) / (22050*16*2/8) ≈ 4.8140816(秒). 這樣就比較精確了.

 

關於聲音文件還有一個概念: "位速", 也有叫做比特率、取樣率, 譬如上面文件的位速是 705.6kbps 或 705600bps, 其中的 b 是 bit, ps 是每秒的意思;

 

壓縮的音頻文件常常用位速來表示, 譬如達到 CD 音質的 MP3 是: 128kbps / 44100HZ.


2.格式解析
WAV文件遵循RIFF規則,其內容以區塊(chunk)爲最小單位進行存儲。WAV文件一般由3個區塊組成:RIFF chunk、Format chunk和Data chunk。另外,文件中還可能包含一些可選的區塊,如:Fact chunk、Cue points chunk、Playlist chunk、Associated data list chunk等。
本文將只介紹RIFF chunk、Format chunk和Data chunk。

常見的wave文件的格式圖示

2.1 RIFF區塊

名稱 偏移地址 字節數 端序 內容
ID 0x00 4Byte 大端 'RIFF' (0x52494646)
Size 0x04 4Byte 小端 fileSize - 8
Type 0x08 4Byte 大端 'WAVE'(0x57415645)


以'RIFF'爲標識
Size是整個文件的長度減去ID和Size的長度
Type是WAVE表示後面需要兩個子塊:Format區塊和Data區塊
2.2 FORMAT區塊


以'fmt '爲標識
Size表示該區塊數據的長度(不包含ID和Size的長度)
AudioFormat表示Data區塊存儲的音頻數據的格式,PCM音頻數據的值爲1
NumChannels表示音頻數據的聲道數,1:單聲道,2:雙聲道
SampleRate表示音頻數據的採樣率
ByteRate每秒數據字節數 = SampleRate * NumChannels * BitsPerSample / 8
BlockAlign每個採樣所需的字節數 = NumChannels * BitsPerSample / 8
BitsPerSample每個採樣存儲的bit數,8:8bit,16:16bit,32:32bit
[注意] 這個區域只需要關心 NumChannels SampleRate BitsPerSample 三個參數就可以了,其它的都是依據這三個計算出來的。

2.3 DATA區塊

名稱 偏移地址 字節數 端序 內容
ID 0x00 4Byte 大端 'data' (0x64617461)
Size 0x04 4Byte 小端 N
Data 0x08 NByte 小端 音頻數據


以'data'爲標識
Size表示音頻數據的長度,N = ByteRate * seconds
Data音頻數據

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