WAVファイルのデータ構造について

WAVファイルはRIFF形式で作られています。

RIFF (Resource Interchange File Format) とは、画像や音声などのデータを1つのファイルに格納するための共通フォーマットです。

RIFFにはチャンク(chunk)と呼ばれる考え方があります。
チャンクとはデータの論理的な単位で、データの集まりのようなものです。
チャンクの中にチャンクを含むことが出来るので、含まれるチャンクをサブチャンク(sub-chunk)と呼びます。RIFFは、このいくつかのチャンクを1つにまとめた集合体になります。

チャンク(chunk)の例

項目 サイズ(byte) 説明
識別子(ID) 4 チャンクを識別するための4文字のコード
サイズ(Size) 4 データサイズを指定する
データ(Data) n データの本体

識別子は1~4文字のアルファベットで構成されます。固定長なので残った個所はスペース文字を入れます。サイズは4バイトのリトルエンディアン、データ構造はそれぞれのチャンクタイプによって定義されます。

先頭から8バイトがチャンクのヘッダ情報、それ以降がチャンクのデータになります。より詳しくは知りたい方はこちらより。図を用いて丁寧に説明されています⇒RIFFファイルフォーマット

 

WAVファイルデータ構造(フォーマット)の例

項目 サイズ (byte) データ部
チャンク識別子 4 “RIFF”(0x52494646)で固定。
チャンク サイズ 4 ファイル全体サイズからRIFFとWAVEのバイト数(8Byte)を引いた数
フォーマット 4 WAVファイルの場合は“WAVE”(0x57415645)で固定。AVIファイルの場合は“AVI”が入る
サブチャンク①識別子 4 “fmt “(0x666D7420)で固定。
サブチャンク①サイズ 4 16 + 拡張パラメータのサイズ。デフォルト値は16
音声フォーマット 2 非圧縮のPCMフォーマットは1。A-lawは6、μ-lawは7。それ以外はこちらを参照。
チャンネル数 2 モノラルは1、ステレオは2
サンプリング周波数 4 8kHzの場合は8000、44.1kHzの場合なら44100
1 秒あたりバイト数の平均 4 サンプリング周波数 * ブロックサイズで求める
ブロックサイズ 2 チャンネル数 * 1サンプルあたりのビット数 / 8で求める。ステレオ16bitなら16bit*2 = 32bit = 4byte
ビット/サンプル 2 1サンプルに必要なビット数。8ビットの場合は8、16ビットの場合は16など。
拡張パラメータのサイズ (2) リニア PCM (音声フォーマットが1) の場合は未使用。
拡張パラメータ (*) リニア PCM (音声フォーマットが1) の場合は未使用。
サブチャンク② 識別子 4 “data” (0x64617461)で固定。
サブチャンク② サイズ 4 波形データのバイト数(総ファイルサイズ – 126)
データ * 波形データを格納。リニアPCMの場合は時間順に格納される。ステレオは左→右→左→右…のように格納される。8ビットの場合は符号無し整数 (0 – 255)、16ビットの場合は符号付き整数 (-32768 – 32767) で表わす。

ftmチャンク、dataチャンクは必須項目ですが、他にも以下のチャンクがあります。次のチャンクは必須ではなくオプションになります。

  • fact チャンク
  • cue チャンク
  • plst チャンク
  • list チャンク
  • labl チャンク
  • note チャンク
  • ltxt チャンク
  • smpl チャンク
  • inst チャンク

次に上記図に、一目でわかるように項目の開始位置情報を追加します。

項目 開始位置
(byte)
サイズ
(byte)
チャンク識別子 0 4
チャンク サイズ 4 4
フォーマット 8 4
サブチャンク①識別子 12 4
サブチャンク①サイズ 16 4
音声フォーマット 20 2
チャンネル数 22 2
サンプリング周波数 24 4
1 秒あたりバイト数の平均 28 4
ブロックサイズ 32 2
ビット/サンプル 34 2
拡張パラメータのサイズ (2)
拡張パラメータ (*)
サブチャンク② 識別子 36 4
サブチャンク② サイズ 40 4
データ 44 *

それでは次の記事『 Wavファイルを読み込むサンプルプログラム(VB.net)』で、実際の音声ファイルを読み込んでみましょう。

参考サイト:WAVE (WAV) ファイル フォーマット