非圧縮WAVファイルの構造と読み方
非圧縮WAVファイルは、音声データとその形式を示す情報をチャンクとして格納したファイルです。
非圧縮WAVの基本構造
非圧縮WAVはRIFF形式のコンテナです。先頭のRIFFとWAVEに続き、チャンクが並びます。各チャンクは通常「4 byteのID」「4 byteのサイズ」「サイズ分の内容」で構成されます。fmt は音声形式の情報、dataは音声データを表し、ほかのチャンクが含まれることもあります。
RIFF | RIFFサイズ(4 byte) | WAVE
fmt | fmtサイズ(4 byte) | 音声フォーマット情報
data | dataサイズ(4 byte) | 音声サンプル
チャンクIDとそのサイズを使って順に読みます。数値は通常リトルエンディアンです。
今回確認したRIFFサイズ
RIFFの後ろにあるCC BA 06 00は4 byteのサイズ値です。リトルエンディアンとして読むと次のとおりです。
- 値:
0x0006BACC - 10進数: 441,036 byte
- RIFFサイズに含まれるのは、サイズ欄の直後からRIFFチャンク末尾までです。
RIFFの4 byteとサイズ欄自身の4 byteは含みません。 - ファイル全体のサイズは通常、RIFFサイズに先頭の8 byteを足した441,044 byteです。
fmt チャンクの内容
fmt の直後の10 00 00 00はfmtチャンクのサイズで、16 byteを表します。続く16 byteは以下のように解釈できます。
| バイト列 | 項目 | 値 |
|---|---|---|
01 00 |
音声形式 | 1(PCM・非圧縮) |
01 00 |
チャンネル数 | 1(モノラル) |
44 AC 00 00 |
サンプルレート | 44,100 Hz |
88 58 01 00 |
バイトレート | 88,200 byte/秒 |
02 00 |
ブロックサイズ | 2 byte/サンプルフレーム |
10 00 |
ビット深度 | 16 bit |
つまり、この音声は44.1 kHz・16 bit・モノラルのPCMです。バイトレートは44,100 × 1 × 2 = 88,200 byte/秒になります。
dataチャンクと音声サンプル
dataチャンクのサイズが示す範囲が音声データです。今回の形式では1サンプルが16 bit(2 byte)なので、2 byteずつのリトルエンディアンの符号付き整数として読みます。たとえばバイト34 12は値0x1234です。
ステレオの場合は左右チャンネルのサンプルが交互に並びます。音声の復号ではチャンネル数・ビット深度・形式に合わせて解釈してください。