詳解WAVE音頻檔案格式
WAVE音效檔格式是目前Windows最直接儲存聲音資料的檔案格式.在涉及聲音訊號處理時大多是對WAV檔案直接操作,有必要搞清楚所研究聲音的檔案格式.
1 RIFF檔案與WAV檔案在Windows環境下,大部分多媒體檔案都依循著一種結構來存放資訊,稱為資源互換檔案格式(Resources Interchange File Format),簡稱RIFF。比如聲音的WAV檔案,視頻的AVI檔案,動畫的MMM檔案等均是由此結構衍生出來的.所以,要掌握多媒體檔案格式,首先得認識RIFF的結構.
RIFF是一種樹狀結構,其基本組成單位是chunk(即塊),每個chunk由辨識碼,資料大小和資料群組成,如。可以看出,一個chunk的長度,就是資料的大小加上8Byte.
一般而言,chunk本身不允許內部再包含chunk,但有兩個例外:以"RIFF"和以"UST"為辨識碼的chunk。針對這兩種chunk,RIFF又從原先的"裸資料"中切出4Byte作為"格式辨別碼",如所示.
對RIFF的樹狀結構有所瞭解之後,可以知道它相當於一個根目錄,而格式辨識碼則相當於具體的盤符如C:,D:等等.Windows下的各種多媒體檔案格式就如同在磁碟機下規定只能存放怎樣的目錄,而在該目錄下僅能存放何種資料.
2 WAV檔案頭
顧名思義,WAV就是波形音頻檔案(Wave Audio),是Windows中用來表示數字化聲音的一種標準格式,其副檔名為.wav,是一種非常簡單的RIFF檔案,格式辨識碼為"WAVE".整個WAV檔案分成兩部分:檔案頭和資料區塊.WAV格式檔案主要有兩種檔案頭.
2.1標準的44位元組檔案頭
這種WAV是最簡單的一種RIFF格式,包含兩個chunk:<fmt—chunk>,<wave—data>,這兩個子塊都是一個WAV檔案必須包含的.
RIFF WAVE Chunk
以'RIFF'作為標示,然後緊跟著為size欄位,該size是整個wav檔案大小減去ID和Size所佔用的位元組數,即FileLen - 8 =Size.然後是Type欄位,為'WAVE',表示是wav檔案.結構定義如下:
struct RIFF_HEADER {char szRiffID[4]; // 'R','I','F','F'DWORD dwRiffSize;char szRiffFormat[4]; // 'W','A','V','E' };
Format Chunk
以'fmt '作為標示.一般情況下Size為16,此時最後附加資訊沒有;如果為18則最後多了2個位元組的附加資訊.主要由一些軟體製成的wav格式中含有該2個位元組的
struct WAVE_FORMAT {WORD wFormatTag;WORD wChannels;DWORD dwSamplesPerSec;DWORD dwAvgBytesPerSec;WORD wBlockAlign;WORD wBitsPerSample; }; struct FMT_BLOCK {char szFmtID[4]; // 'f','m','t',' 'DWORD dwFmtSize;WAVE_FORMAT wavFormat; };
為了產生出能夠正確讀出的WAV檔案,必須嚴格注意以下幾個分量間的特定關係,否則產生出的檔案將無法正常播放:
2.2 58位元組檔案頭如果不是Windows的標準WAV檔案,而是經過了一些軟體處理的,往往就是58位元組的檔案頭,如所示.
它比44位元組的多了一個fact子塊.<fact—ck>儲存了關於WAV檔案內容的重要訊息.該子塊定義如下:
Fact Chunk
Fact Chunk是可選欄位,一般當wav檔案由某些軟體轉化而成,則包含該Chunk.結構定義如下:
struct FACT_BLOCK {char szFactID[4]; // 'f','a','c','t'DWORD dwFactSize; };
3 "data"子塊資料安排方式
"data"子塊中裝的是真正的聲音資料.除非安裝其它特殊軟體,否則Windows目前僅提供WAVE_FORMAT_PCM一種資料格式,即脈衝編碼調製(Pulse Code Modulation).針對此慚式,Windows中"data"子塊中資料存放的形式如所示,根據聲道數不同及取樣位元的不同,安排4位的位置.
Data Chunk頭結構定義如下:
struct DATA_BLOCK {char szDataID[4]; // 'd','a','t','a'DWORD dwDataSize; };
注意:Windows中將16位值的範圍定為[-32768,32767].另外,0並不一定代表無聲,而是由中間數值來決定,即8位的時候為128,l6位時0才是無聲.所以,編程中需要放入無聲的資料時,必須先認清聲音格式是l6位還是8位. 通常解壓縮後得到的檔案僅僅是裸資料,不能正常播放聲音.瞭解了WAV檔案格式後,就可以按照標準的44位元組格式,在解碼資料前編寫一個正確的WAV檔案頭,使其成為一個有效WAV檔案.
4 執行個體檔案分析 下面我們來分析一個真正的WAVE檔案(http://download.csdn.net/detail/ce123/5771797).
對照前面的講解,看懂這個檔案的結構應該非常容易