音声ファイルの種類としてはmp3などと並んで有名なwave(.wav)だが、その中身を見てみようと思ったので書く(実際に短いwavファイルをバイナリエディタで見るなどすると理解に良いかもしれない)。
※基本的にバイトオーダーはリトルエンディアンになっているので注意されたし。
1.RIFFチャンク
RIFFチャンクにはこのファイルの主なデータが格納されていて、ヘッダーは12Byte。内訳は以下の通り:
- 4Byte - このファイルがRIFFファイルであることを示す"RIFF"(0x52494646)。
- 4Byte - これ以降のRIFFチャンクのサイズ(=全ファイルサイズ-8Byte)。
- 4Byte - このファイルがwaveファイルであることを示す"wave"(0x57415645)。
※そもそもRIFFファイルとは:Resource Interchange File Formatの略で、AVIなどもこの形式。RIFFチャンク内のサブチャンクにデータが格納されていく。
2.fmtチャンク
ここからはwaveファイルのフォーマットを指定するfmtチャンクが続く。フィールドは以下の通り:
- 4Byte - fmtチャンクの識別子"fmt "(0x666d7420)
- 4Byte - これ以降のfmtチャンクのサイズ。PCM、32bit floatなら16(0x10000000)
- 2Byte - フォーマットのタイプ。PCMでは1(0x0100)、32bit floatなら3(0x0300)。
- 2Byte - チャンネル数。モノラルなら1(0x0100)、ステレオなら2(0x0200)。
- 4Byte - サンプリングレート(Hz)。44.1kHzなら44100(0x44ac0000)。
- 4Byte - バイトレート(Byte/s)。44.1kHz、ステレオ、16bitなら1秒に44100(Hz)*2(ch)*2(Byte)=176400(0x10b10200)になる。
- 2Byte - ブロックサイズ(Byte)。ステレオ、16bitなら2(ch)*2(Byte)=4(0x0400)。
- 2Byte - サンプルサイズ(bit)。16bitなら16(0x1000)、24bitなら24(0x1800)。
3.dataチャンク
ここにはwaveファイルのメインの音声データが入っている。先頭4Byteにチャンク識別子"data"(0x64617461)、続く4Byteにこれ以降のdataチャンクのサイズが格納されている。
あとはひたすら音声データが続く。ステレオの場合は1サンプル時間ごとにLRLRLR...の順に格納される。
簡単に図にするとこんな感じである(やっつけ)。四角の中が格納されているデータ。
というわけでざっとwaveフォーマットの中身について書いてみた。単純なだけあってわかりやすいのは良いが、おかげでファイルサイズが馬鹿にならない。まあ音質も良いが...
次回は実際に音声データを読み込んで波形を表示してみる。
薄学なので誤り等あればご指摘ください。
waveフォーマットの仕組み