第五章 WAVE 音效檔
5.1 WAVE 檔案資料結構
WAVE 文件是以 RIFF 格式為標準的多媒體音訊文件格式之一,所有的 WAVE 文件都有一個記錄音訊資料的檔頭(以下簡稱 Header),並且文件是 由許多資料塊(以下簡稱 Chunk)所組成的。WAVE 文件起始的 Header 裡面 包含了此音效文件的編碼格式(如 PCM 或 IEEE Float)與播放參數(如資料區 容量、聲道數、取樣頻率、取樣位元數)等參數。在 Header 後接著的是資料 區,其儲存音訊資料,其中雙聲道的存放次序為左聲道、右聲道。在進行 播放音效之前需將這些參數解碼後,並載入播放器中才能夠播放正確音 效。底下將對WAVE 文件的各區域進行說明 [11]。
RIFF chunk
RIFF 是多媒體文件的標準格式之一,檔案開頭以“RIFF”作為識別標 示,而RIFF 支援多種多媒體資料格式,其中就包括 WAV 音樂格式,並以
“WAVE”作為識別標示。表 5-1 為 RIFF-WAVE 文件的資料結構,開頭的 Chunk 識別碼為“RIFF",用來標示屬於 RIFF 文件格式,然後為 Chunk size 容量標示欄位,該容量數值為 WAVE chunks 大小加上 4 位元組。最後為 WAVE 資料區,包含以“WAVE” 為標示的 Chunk ID,與存放音樂資料的 WAVE chunk (包括 Format 和 Sampled data) [12]。
表 5-1 WAVE 文件結構 [12]
WAVE File Format Structure
Field Length Contents
Chunk ID 4 Chund ID : “RIFF”
Chunk Size 4 Chunk size : 4 + n bytes
Format chunk
為WAVE chunk 的子資料塊(簡稱為 sub-chunk),表 5-2 為 Format chunk 的資料結構,其以“fmt ”作為開始標示,然後為容量欄位元,該數值為 16,
18 或 40,用來表示整個 chunk 的資料容量,接著為編碼方式、聲道數、
取樣頻率及取樣位元數等資訊。
表 5-2 WAVE Format chunk 格式 [12]
WAVE Format Chunk
Field Length Description
SubChunk1ID 4 Contains the letters "fmt "(0x666d7420 big-endian form).
SubChunk1Size 4 This is the size of the rest of the Subchunk Chunk size : 16, 18 or 40, (16 for PCM.) AudioFormat 2 Format code, PCM = 1 (i.e. Linear quantization)
NumChannels 2 Mono = 1, Stereo = 2, etc.
SampleRate 4 8000, 44100, etc.
ByteRate 4 SampleRate * NumChannels * BitsPerSample / 8
BlockAlign 2 NumChannels * BitsPerSample / 8
BitsPerSample 2 8 bits = 8, 16 bits = 16, etc.
ExtensionSize 2 Size of the extension (0 or 22) ValidBitsPerSample 2 Number of valid bits
ChannelMask 4 Speaker position mask
SubFormat 16 GUID, including the data format code
WAVE format chunk 的 Audio Format 參數如表 5-3 所列,是用來表示音 訊的編碼格式。
表 5-3 WAVE 編瑪方式 [12]
Format code Preprocessor Symbol Data
0x0001 WAVE_FORMAT__PCM PCM
0x0003 WAVE_FORMAT__IEEE_FLOAT IEEE float
0x0006 WAVE_FORMAT__ALAW 8-bit ITU-T G.711 A-law
0x0007 WAVE_FORMAT__MULAW 8-bit ITU-T G.711 u-law
Fact chunk
所有的非 PCM 編碼格式都必須要有此 Fact chunk,其以“fact”作為標 示,表5-4 為其資料結構,是由某些特殊軟體在轉換音訊時產生的,一般 並不常在 WAVE 文件中見到。
表 5-4 WAVE fact chunk 結構 [12]
Fact Chunk
Field Length Contents
Chunk ID 4 Chund ID : “fact”
Chunk Size 4 Chunk size : minimum 4
SampleLength 4 Number of samples (per channel)
Data chunk
表 5-5 為 Data chunk 的資料結構,以“data”作為開始標示,然後為音 訊資料的容量欄位,接著就是編瑪過的音訊資料,如果資料容量為奇數,
則最後會多一個 pad byte。
表 5-5 WAVE data chunk 結構 [12]
Data Chunk
Field Length Contents
Chunk ID 4 Chund ID : “data”
Chunk Size 4 Chunk size : n
Sample data n Samples
Pad byte 0 or 1 Padding byte if n is odd
Data Chunk 是實際存放 wav 音訊資料的地方,根據 Format Chunk 中的聲道數以及取樣位元數,wave 資料的位置配置方式如圖 5-1,可以 分成四種配置形式,圖(a)為 8 位元單聲道,(b)為 8 位元雙聲道,(c)為 16 位元單聲道,(d)為 16 位元雙聲道。
單聲道 Sample 1 Sample 2 Sample 3 Sample 4 Sample 5 Sample 6
Field Length Contents
Chunk ID 4 Chund ID : “RIFF”
Chunk size 4 Chunk size : 4 + n
Wave ID 4 Wave chunk ID : “WAVE”
Sub chunk ID 4 Chunk ID : “fmt “
Sub chunk size 4 Chunk size : 16
`` AudioFormat 2 WAVE_FORMAT_PCM = 0x0001
NumChannels 2 Nch
圖5-2 為 Wave header 內容範例,我們可以看到 Header 開頭前 4 bytes Chunk ID 一定是”RIFF”,而且 Format 內容為”WAVE”,接著可得到聲道數 為雙聲道,取樣頻率為 22050Hz,取樣位元數為 8 bits,音效資料容量為 9770498 bytes 等資訊。
chunk descriptor = ‘RIFF’ chunk size = 9770534 fmt subchunk = ‘fmt ‘ 52
Subchunk1 size = 16 Audio Format
= 1 (PCM)
Data subchunk = ‘data’ Subchunk2Size = 9770498 Sample 1 (L/R)