概述
WAVE檔案是計算機領域最常用的數位化聲音檔案格式之一,它是微軟專門為Windows系統定義的波形檔案格式(Waveform Audio),由於其擴展名為"*.wav"。
WAVE是錄音時用的標準的WINDOWS檔案格式,檔案的擴展名為“WAV”,數據本身的格式為PCM或壓縮型。
WAV檔案格式是一種由微軟和IBM聯合開發的用於音頻數字存儲的標準,它採用RIFF檔案格式結構,非常接近於AIFF和IFF格式。符合 PIFF Resource Interchange File Format規範。所有的WAV都有一個檔案頭,這個檔案頭音頻流的編碼參數。
WAV對音頻流的編碼沒有硬性規定,除了PCM之外,還有幾乎所有支持ACM規範的編碼都可以為WAV的音頻流進行編碼。
多媒體套用中使用了多種數據,包括點陣圖、音頻數據、視頻數據以及外圍設備控制信息等。RIFF為存儲這些類型的數據提供了一種方法,RIFF檔案所包含的數據類型由該檔案的擴展名來標識,能以RIFF檔案存儲的數據包括:
音頻視頻交錯格式數據(.AVI) 、波形格式數據(.WAV) 、點陣圖格式數據(.RDI) 、MIDI格式數據(.RMI) 、調色板格式(.PAL) 、多媒體電影(.RMN) 、動畫游標(.ANI) 、其它RIFF檔案(.BND)。
wave檔案有很多不同的壓縮格式,所以,正確而詳細地了解各種WAVE檔案的內部結構是成功完成壓縮和解壓縮的基礎,也是生成特有音頻壓縮格式檔案的前提。
最基本的WAVE檔案是PCM(脈衝編碼調製)格式的,這種檔案直接存儲採樣的聲音數據沒有經過任何的壓縮,是音效卡直接支持的數據格式,要讓音效卡正確播放其它被壓縮的聲音數據,就應該先把壓縮的數據解壓縮成PCM格式,然後再讓音效卡來播放 。
內部結構
註:由於WAV格式源自Windows/Intel環境,因而採用Little-Endian位元組順序進行存儲。
WAVE檔案是以RIFF(Resource Interchange File Format, "資源互動檔案格式")格式來組織內部結構的。
RIFF檔案結構可以看作是樹狀結構,其基本構成是稱為"塊"(Chunk)的單元,最頂端是一個“RIFF”塊,下面的每個塊有“類型塊標識(可選)”、“標誌符”、“數據大小”及“數據”等項所組成。塊的結構如下表所示:
名稱 | Size | 備註 |
塊標誌符 | 4 | 4個小寫字元(如 "fmt ", "fact", "data" 等) |
數據大小 | 4 | DWORD類型,表示後接數據的大小(N Bytes) |
數據 | N | 本塊中正式數據部分 |
上面說到的“類型塊標識”只在部分chunk中用到,如 "WAVE" chunk中,這時表示下面嵌套有別的chunk。
當使用了 "類型塊標識" 時,該chunk就沒有別的項(如塊標誌符,數據大小等),它只作為檔案讀取時的一個標識。先找到這個“類型塊標識”,再以它為起點讀取它下面嵌套的其它chunk。
每個檔案最前端寫入的是RIFF塊,每個檔案只有一個RIFF塊。從 Wave檔案格式詳細說明 中可以看到這一點。
非PCM格式的檔案會至少多加入一個 "fact" 塊,它用來記錄數據(注意是數據而不是檔案)解壓縮後的大小。這個 "fact" 塊一般加在 "data" 塊的前面。
WAVE檔案是由若干個Chunk組成的。按照在檔案中的出現位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可選), Data Chunk。具體見下圖:
-------------------------------------------
| RIFF WAVE Chunk |
| ID = "RIFF" |
| RiffType = "WAVE" |
-------------------------------------------
| Format Chunk |
| ID = "fmt " |
-------------------------------------------
| Fact Chunk(optional) |
| ID = "fact" |
-------------------------------------------
| Data Chunk |
| ID = "data" |
-------------------------------------------
圖 Wav格式包含Chunk示例
Fact Chunk
=======================================
| |所占位元組數|具體內容 |
=======================================
| ID | 4Bytes | "fact" |
---------------------------------------
| Size | 4Bytes | 4 |
---------------------------------------
| data | 4Bytes |解壓後的音頻數據的大小(B)|
---------------------------------------
檔案格式
別名 位元組數 類型 注釋
ckid 4 char "RIFF" 標誌, 大寫
cksize 4 int32 檔案長度。這個長度不包括"RIFF"標誌 和檔案長度 本身所占位元組, 下面的 子塊大小也是這樣。
fcc type 4 char "WAVE" 類型塊標識, 大寫。
ckid 4 char 表示"fmt" chunk的開始。此塊中包括檔案內部格式信息。小寫, 最後一個字元是空格。
cksize 4 int32 檔案內部格式信息數據的大小。
FormatTag 2 int16 音頻數據的編碼方式。1 表示是 PCM 編碼
Channels 2 int16 聲道數,單聲道為1,雙聲道為2
SamplesPerSec 4 int32 採樣率(每秒樣本數), 比如 44100 等
BytesPerSec 4 int32 音頻數據傳送速率, 單位是位元組。其值為採樣率×每次採樣大小。播放軟體 利用此值可以估計緩衝區的大小。
BlockAlign 2 int16 每次採樣的大小 = 採樣精度*聲道數/8(單位是位元組); 這也是位元組對齊的最小單位, 譬如 16bit 立體聲在這裡的值是 4 位元組。播放軟體需要一次處理多個該值大小的位元組數據,以便將其值用於緩衝區的調整。
BitsPerSample 2 int16 每個聲道的採樣精度; 譬如 16bit 在這裡的值就是16。如果有多個聲道,則每個聲道的採樣精度大小都一樣的。
[cbsize] 2 int16 [可選]附加數據的大小。
[...] x
[ckid] 4 char "fact".
[cksize] 4 int32 "fact" chunk data size.
[fact data] 4 int32 解壓後的音頻數據的大小(Bytes).
ckid 4 char 表示 "data" chunk的開始。此塊中包含音頻數據。小寫。
cksize 4 int32 音頻數據的長度
...... 檔案聲音信息數據(真正聲音存儲部分)
[......] 其它 chunk