WAVファイルはWindows標準の音データファイルで、RIFF形式で作られています。Wavファイルのデータ構造を知るにはRIFF形式を理解する必要があります。
RIFF(Resource Interchange File Format) 形式とは、画像や音声などのデータを1つのファイルに格納するための共通フォーマットになります。
RIFFにはチャンク(chunk)と呼ばれる考え方があります。チャンクとはデータの論理的な単位でデータの集まりのようなものです。WAVファイルはいくつかのチャンクを1つにまとめた集合体になります。
チャンク(chunk)の例
項目 | サイズ(byte) | 説明 |
---|---|---|
識別子(ID) | 4 | チャンクを識別するための4文字のコード。1~4文字のアルファベットで構成。固定長なので残った個所はスペース文字が入る。リトルエンディアン方式(後ろのバイトデータが前に記録される方式)で記録される |
サイズ(Size) | 4 | データサイズを指定する |
データ(Data) | n | データの本体 |
識別子(ID)によってチャンクのデータ構造が定義されます。先頭から8バイトがチャンクのヘッダ情報、それ以降がチャンクのデータになります。
WAVファイルの中身を覗いてみる
それでは実際に音ファイル(拡張子:Wav)の中身を覗いてみましょう。以下より音ファイルをダウンロードして下さい。再生する際は音量に気をつけて下さいね。
※上の右端スピーカー横にある所をクリックすると音ファイルをダウンロードできます。
上記方法でダウンロード出来ない場合は、下記の “音ファイルダウンロード” リンク上で右クリックして、”名前を付けてリンク先を保存(K)”をクリックしてください。
音ファイルダウンロード
それでは、Binaryファイルエディタを利用して中身をのぞいて見ましょう。
Wavファイルのヘッダー情報を見るだけで以下の事がわかります。
- ファイルサイズ:176,444バイト
- サンプリング周波数:44.1kHz
- ビット数:16bit
- 音声:モノラル(チャンネル1)
次のWAVファイルデータ構造と、今回ダウンロードした例を突き合わせて確認してみましょう。
WAVファイルデータ構造(フォーマット)の例
項目 | サイズ (byte) | データ部 |
---|---|---|
RIFF識別子 | 4 | “RIFF”(0x52494646)で固定。 |
チャンク サイズ | 4 | ファイル全体サイズからRIFFとWAVEのバイト数(8Byte)を引いた数。この情報をもとにWavファイルのファイルサイズを算出できる。 |
フォーマット | 4 | WAVファイルの場合は“WAVE”(0x57415645)で固定。AVIファイルの場合は“AVI”が入る |
fmt識別子 | 4 | “fmt “(0x666D7420)で固定。 |
fmtチャンクのバイト数 | 4 | リニアPCMならば16(0x10000000) その他は、16 + 拡張パラメータ |
音声フォーマット | 2 | 非圧縮のリニアPCMフォーマットは1(0x0100)。A-lawは6、μ-lawは7。それ以外はこちらを参照。 |
チャンネル数 | 2 | モノラルは1(0x0100)、ステレオは2(0x0200) |
サンプリング周波数(Hz) | 4 | 8kHzの場合は(0x401F0000)、44.1kHzの場合なら(0x44AC0000) |
1 秒あたりバイト数の平均 | 4 | サンプリング周波数 * ブロックサイズで求める 44.1kHz、16bit、モノラルならば44100x2x1=88,200(0x88580100) |
ブロックサイズ | 2 | チャンネル数 * 1サンプルあたりのビット数 / 8で求める。モノラル16bitなら1*16bit = 16bit = 2byte(0x0200)、ステレオ16bitなら4(0x0400) |
ビット/サンプル | 2 | 1サンプルに必要なビット数。8ビットの場合は8(0x0800)、16ビットの場合は16(0x1000)など。 |
拡張パラメータのサイズ | (2) | リニア PCM (音声フォーマットが1) の場合は未使用。 |
拡張パラメータ | (*) | リニア PCM (音声フォーマットが1) の場合は未使用。 |
サブチャンク② 識別子 | 4 | “data” (0x64617461)で固定。 |
サブチャンク② サイズ | 4 | 波形データのバイト数(総ファイルサイズ – 126) |
データ | * | 波形データを格納。リニアPCMの場合は時間順に格納される。ステレオは左→右→左→右…のように格納される。8ビットの場合は符号無し整数 (0 – 255)、16ビットの場合は符号付き整数 (-32768 – 32767) で表わす。 |
ftmチャンク、dataチャンクはWAVファイルには必ず入っている項目です。その他にも以下のチャンクがあります。次のチャンクは必須ではなくオプションになります。
- 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ファイルのファイルサイズ(チャンクサイズ)の求め方
どうやって、ファイルサイズを求めるか?
Windowsパソコン上で今回取り込んだ音ファイルのサイズを見てみます。
パソコン上では176,444バイトになっています。
Binaryエディタでは、RIFFチャンクのサイズ(バイト数)は、0x34B10200 になっていましたね。Oxは16進数なのでプログラマー電卓(Windows PCは標準装備)でHEXを選択した状態で2B13Cと打ってみましょう。すると結果は以下のようになります。
HEX(16進数) 2B13C
DEC(10進数) 176,436 ←これに8バイトを足せばファイルサイズに!
OCT(08進数) 530 474
0x34B10200 を 2B13C と打つ。つまり後ろから2桁ずつ入力して16進数から10進数に変換すれば良いのですね。
参考になりましたか? 良ければいいね!をよろしくお願いします。
参考サイト:
WAVE (WAV) ファイル フォーマット
RIFFファイルフォーマットについて