WAVEファイルの構造

今回はWAVEファイルの構造についての説明です。

■概要
WAVEファイルとは、Windowsで標準的に扱われている波形オーディオデータファイルです。
.wavまたは.waveの拡張子のファイルがこれに該当します。
一般的にはPCM(Pulse Code Modulation)と呼ばれる非圧縮データを格納していますが、MP3などの圧縮データも保持することが可能です。

■ファイル構造
WAVEファイルの中身は一般に以下のようになっています。

 [“RIFF” (4byte)]
 [ファイルサイズ-8 (4byte)]
 [“WAVE” (4byte)]
 [フォーマットチャンク]
 [データチャンク]
 ([LISTチャンク] 省略可)

これはRIFF(Resource Interchange File Format)と呼ばれるファイルフォーマットの一種です。
チャンクと呼ばれるデータの塊を連結させた構造になっています。

 [識別子の文字列 (4byte)]
 [データサイズ(n) (4byte)]
 [データ (n byte)]

識別子にはASCIIで4文字のチャンクの種類を識別するための文字列が入ります。
データサイズにはデータ部分のサイズが入ります。
これはチャンク全体サイズから識別子とデータサイズを差し引いた値となります。
したがって、
 データサイズ = チャンク全体サイズ – 8
という関係が成り立ちます。
チャンク内に子チャンクを持たせることも可能です。
WAVEファイルはRIFFチャンク内にフォーマットチャンクとデータチャンクを持つ構造になります。

RIFFチャンク以外にはLISTチャンクを持たせることも可能です。
これは音声データそのものには直接関係無い付加情報です。
したがって、音声データを読み込んであれこれしたい場合は無視してよい情報です。

フォーマットチャンクは以下のようになります。

 [“fmt ” (4byte)]
 [フォーマットサイズ (4byte)]
 [フォーマット]

フォーマット部分には、オーディオデータの形式情報が入ります。

PCM形式の場合、フォーマットにはWAVEFORMATEX構造体のデータが入り、
フォーマットの先頭2バイト(WAVEFORMATEX構造体のwFormatTagメンバ)がWAVE_FORMAT_PCM(=1)となります。
ここを調べることで、オーディオ形式を判断することが出来ます。

データチャンクは以下のような構造になっています。

 [“data” (4byte)]
 [データサイズ (4byte)]
 [データ]

データ部分に実際のオーディオデータが入ります。
これは前述のフォーマットに従ったデータとなります。
詳しい解説は割愛させていただきます。

ここまでがWAVEファイルで最低限必要になる情報です。
LISTチャンクもありますが、本記事では割愛させていただきます。

実際にWAVEファイルを読み込んで再生したい場合は、このチャンクを探索してフォーマットとデータを取得すれば良いです。
再生方法についてはまた別の機会にて説明できればと思います。

■参考サイト
WAV 【 WAVフォーマット 】 .wavファイル / WAVEファイル
RIFF について
RIFF (Resource Interchange File Format)