WAV檔案格式學習心得
前言
最近接合Audio API到遊戲引擎上,但Audio API都不提供Parse檔案相關的功能,所以必須要自己Parse後萃取出raw data,再將raw data送入Audio API。以下是學習心得,在此做個紀錄。內容
WAV檔的格式是由很多的RIFF chunk所組成,檔案組成的概況如下圖WAV檔的組成 |
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 formatWAVEFORMATEX structure
沒有留言:
張貼留言