2018年11月26日 星期一

WAV檔案格式學習心得

WAV檔案格式學習心得

前言

  最近接合Audio API到遊戲引擎上,但Audio API都不提供Parse檔案相關的功能,所以必須要自己Parse後萃取出raw data,再將raw data送入Audio API。以下是學習心得,在此做個紀錄。

內容

  WAV檔的格式是由很多的RIFF chunk所組成,檔案組成的概況如下圖
WAV檔的組成
每個RIFF chunk裡都包含了RIFF header與Content,每個RIFF header會用chunkID來表明資料的型態,而size所表明的是RIFF chunk裡的Content資料有多少Bytes。在Parse時,常常需要知道現在的RIFF chunk有多少Bytes,計算法如下
size_t riffChunkSize=riffHeader.size+sizeof(CRIFFHeader);

  接著來看看WAV檔裡的Chunk的Content,Content有多少種呢?不幸的很多種,所以這裡只列出我有遇到的種類。
chunkID是個32位元的資料,也就是4個Bytes,通常會將每個Byte表達成char,這樣就可以4個char來表達資料種類。

  第一種的chunkID為'R','I','F','F',這個很特別,它通常會是第一個RIFF chunk,特別的是它的content,一定是一個int32_t,且內容是'W','A','V','E',但是它的RIFF header裡的size的內容並不是4,而是整個WAV檔的大小減8,這個8其實就是RIFF header的大小,有點類似資料夾的概念,這個chunk包住了其它的chunk。

  第二種的chunkID為'f','m','t',' ',這裡的Content可以參考WAVEFORMATEX structure,但要注意struct裡的"cbSize",這個欄位不一定存在,所以這個chunk的size不是固定的!請依據chunk裡的size來Parsem。

  第三種的chunkID為'f','a','c','t',這個chunk的內容我並不知它的Content是什麼,我選擇直接跳過它!請注意這個chunk並不是一定存在,parse時請考慮這點。

  第四種的chunkID為'd','a','t','a',這裡就是raw data,也就是Audio API吃的資料。

  最後把前述的種類排列起來就會像下圖
Wav檔的Chunk排列

參考資料

WAVE PCM soundfile format
WAVEFORMATEX structure

沒有留言:

張貼留言