はじめに
Windows WAVファイルは、RIFFというファイルフォーマットで作成されています。
以下では、RIFFファイルフォーマットについて、記載いたします。
RIFFとは
RIFF(Resource Interchange File Format)は、タグ付きの画像や音声などのデータを1つのファイルに格納するための汎用ファイルフォーマットです。RIFFは、チャンク(chunk)と呼ばれる論理的なデータ単位で各データを記載します。
チャンクには、以下のような種類があります。WAVファイルでは、RIFFチャンク、fmtチャンク及びdataチャンクが使用されています。
データは、下位バイトから順に配置するリトルエンディアンで記載します。
- RIFFチャンク(必須)
- fmtチャンク(必須)
- factチャンク(PCMフォーマットでは、オプション)
- peakチャンク(オプション)
- dataチャンク(必須)
- など
チャンクのデータ構造について
項目 | サイズ (バイト) | 説明 |
---|---|---|
ckID | 4 | チャンクを識別するための4文字の固定長のコードです。 1~4文字で構成されます。 4文字未満の場合は、余りをスペース(空白)にします。 |
ckSize | 4 | データサイズnをバイト単位で指定します。 |
data | n | データ本体を格納します。 |
各チャンクのデータ構造について
各チャンクのデータ構造について、以下に記載します
【RIFFチャンク】
項目 | サイズ (バイト) | 説明 |
---|---|---|
ckID | 4 | チャンクID:”RIFF”を記述します。 (0x52,0x49,0x46,0x46) |
ckSize | 4 | チャンクサイズ:4+nを記載いたします。 (ckIDとckSizeを除いたファイル全体のサイズ) |
format | 4 | WAVEファイルの場合は、”WAVE”を記載します。 (0x57,0x41,0x56,0x45) |
Data | n | データ本体を記載します。 |
【fmtチャンク】
項目 | サイズ (バイト) | 説明 |
---|---|---|
ckID | 4 | チャンクID:”fmt”を記載します。 (0x66,0x6d,0x74,0x20) |
ckSize | 4 | チャンクサイズ:nを記載します。 (ckIDとckSizeを除いたチャンクサイズ) |
wFormatTag | 2 | データのフォーマットを記載します。 0x01:PCM(0x01,0x00) 0x06:G.711 A-law(0x06,0x00) 0x07:G.711 μ-law(0x07,0x00) |
nChannels | 2 | チャネル数を記載します。 0x01:モノラル(0x01,0x00) 0x02:ステレオ(0x02,0x00) |
nSamplePerSec | 4 | サンプリングレートを記載します。 |
nAvgBytesPerSec | 4 | 平均バイトレートを記載します。 サンプリングレート*1ブロックのバイト数 |
nBlockAlign | 2 | 1ブロックのバイト数を記載します。 1サンプル当たりのバイト数*チャネル数。 |
nBitsPerSample | 2 | 1サンプルあたりのビット数を記載します。 8ビット:0x08、16ビット:0x10 |
cbSize | 2 | 追加情報のサイズを記載します。 追加情報がない場合は、0。 |
追加情報 | n | 追加情報を記載します。 |
【factチャンク】
項目 | サイズ (バイト) | 説明 |
---|---|---|
ckID | 4 | チャンクID:”fact”を記載します。 (0x66,0x61,0x63,0x74) |
ckSize | 4 | チャンクサイズ:4を記載します。 (ckIDとckSizeを除いたチャンクサイズ) |
dwSampleLength | 4 | 1チャネルあたりのサンプル数を記載します。 |
【dataチャンク】
項目 | サイズ (バイト) | 説明 |
---|---|---|
ckID | 4 | チャンクID:”data”を記載します。 (0x50,0x45,0x41,0x4b) |
ckSize | 4 | チャンクサイズ:n or n+1 (ckIDとckSizeを除いたチャンクサイズ) |
samleData | n | サンプルデータを記載します。 |
(padingData) | 0 or 1 | ckSizeが奇数の場合にのみ追加します。 |