音ファイル(拡張子:WAVファイル)のデータ構造について

 

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ファイルフォーマットについて