WAV音檔分釋與讀取

WAV音檔分釋與讀取

WAV音頻格式由Electronic Arts(電子協會)創建.它基於.IFF(Interchange File Format)對等交換文件格式.允許不同音檔格式通過鑲套技術進行編碼.

上兩編文章『DirectSound』與『DirectSound3D』均從WAV音檔中讀音頻數據.WAV音檔好再於結構簡單無需解壓. 我建議先把所有WAV音檔數據格式統一. 改為『單聲道Mono』(因為你只有一個咪頭)、採樣頻率11025Hz、採樣精度8bit.後再由遊戲引擎載入.

.WAV數據由以下三部份組成:

數據 簡序
RIFF .IFF標記
FORMAT 音頻格式
DATA 音頻數據

 

RIFF數據 所占空間(BYTE) 簡序
chunkID 4 塊ID,必須為’RIFF’
chunkSize 4 塊長度(不包含chunkID[4]和chunkSize所占空間)

 

FORMAT數據 所占空間(BYTE) 簡序
waveID 4 WAVE ID,必須為’WAVE’
chunkID 4 塊ID,必須為’fmt ‘
chunkSize 4 塊長度(不包含chunkID[4]和chunkSize所占空間)
wFormatTag 2 壓縮(格式)標誌默認WAVE_FORMAT_PCM脈衝編碼格式
wChannels 2 聲道:『單聲道Mono』或『雙聲道Stereo』
dwSamplesPerSec 4 採樣頻率(11025Hz,22050Hz,44100Hz)
dwAvgBytesPerSec 4 每秒播放字節數(SamplesPerSec * BlockAlign)
wBlockAlign 2 字節對齊,單聲道8bit占1byte.雙聲道16bit占4yte.
wBitsPerSample 2 每個採樣點位精度.有8bit、16bit、24bit、32bit
information 2 附加信息(未必有此數據)

 

數據塊 所占空間(BYTE) 簡序
chunkID 4 塊ID,必須為’data’
chunkSize 4 音頻數據長度
Data chunkSize 音頻數據

讀取WAV數據.wav指向文檔數據.size為文檔長度

bool Load_WAV(SOUND3D_PTR sound3D, PBYTE wav, int size){

1.數格塊

RIFF_PTR          riff;

WAVE_FORMAT_PTR   format;

WAVE_DATA_PTR     data;

2.讀取RIFF數據

riff = (RIFF_PTR)wav;

3.判斷是否RIFF

if (riff->id != WAVE_RIFF_ID)

return false;        // 返回出錯!

4.讀取WAVE_FORMAT_CHUNK

format = (WAVE_FORMAT_PTR)((PBYTE)wav + sizeof(RIFF));

if (format->waveID != WAVE_ID ||

format->chunkID != WAVE_FMT_ID ||

format->wFormatTag != WAVE_FORMAT_PCM)

return(false);   // 返回出錯!

5.讀取數據塊

data = (WAVE_DATA_PTR)((PBYTE)wav + sizeof(RIFF) + (int)format->chunkSize + sizeof(WAVE_CHUNK));

if (data->chunkID != WAVE_DATA_ID)

return(false);   // 返回出錯!

6.獲取音頻數據

PBYTE audio = (PBYTE)malloc(data->chunkSize);

memcpy(audio, &data->data, data->chunkSize);

return true;

}

評論