FC2ブログ

WAVフォーマットを理解しておく

12/02/05初稿

 本稿は、14/08/26に別稿から独立させたものです。
 同時に、本entry-15の元々の内容(リッピングイジワル実験)はentry-14に統合しました。


■WAVファイルフォーマット詳説

 本来は違うのですが、WAV形式は一般的に「リニアPCM」のことで定着していますので、リニアPCMかつ特殊拡張がないファイル形式として事実上限定できると思います。
 その前提で、WAVファイルのフォーマット…つまり“中身”を解説してみたいと思います。

・WAVバイナリの読み方
 その前に予備知識をひとつ。
 ≪WaveCompare≫での差異部分表記やWAVファイルをバイナリで覗いた時に見える16進数って、そのまま波形レベルを表していますが、0000h周辺に0100hとかFFFFhとかFEFFhとか出現しているのが観察できるファイルがあります。0000h=ゼロ=無音なのにいきなりFEFFhってなに? って思いますよね。
 以下に例を挙げます。

Intel形式


 これについては、まず「バイトの並び規格」について知っておく必要があります。通常WAVフォーマットのバイトオーダはIntel形式なので上位と下位の8bitをひっくり返して16bitとして読む必要があるのです(AIFFはIntel出身ではないのでひっくり返しません)。なので、FEh・FFhという並びはデータの値としてはFFFEhを示しています。
 で、何でゼロ近傍のハズなのにFFFEhかと言うと、これって補数表記(MSBが0だとプラス、1だとマイナス)だからです。
 0000h(0)~7FFFh(+32767)までがプラスで、FFFFh(-1)~8000h(-32768)まではマイナス。よって、FFFEhは-2となります。

・WAVデータの読み方
 以下は、とあるWAVファイルのヘッダ部分です。最後に4Byte分「00」が見えますが、ここから波形データが始まっています。基本的にそこまでの44Byteがヘッダになっており、それ以降は波形データというシンプルな作りになっています。

WAVヘッダ


 上記を例に。

(1)0000~0003h:4Byte:[52 49 46 74]
 アスキーコードの文字データです。“RIFF”と入っています。本来のファイル形式の名前ですね。

(2)0004~0007h:4Byte:[74 3E C0 02]
 0008h以降のファイルサイズです。
 Intel形式ですのでByte単位でひっくり返し、「02C03E74h」がファイルサイズとなります。
 0007hまでを含みませんので、通常、ファイルサイズから8Byte少ない数になります。

(3)0008~000Bh:4Byte:[57 41 56 45]
 アスキーコードです。“WAVE”と入っています。RIFFの種類がWAVEだという意味です。

(4)000C~000Fh:4Byte:[66 6D 74 20]
 アスキーコードです。“fmt ”と入っています。これからフォーマットを記すぞという意味ですね。
 ちなみにアスキーコード20h=32は「スペース(空白)」です。

(5)0010~0013h:4Byte:[10 00 00 00]
 (4)で宣言したフォーマット記述(fmt)のバイト数です。この後(0014h以降)から何バイトがフォーマット記述に割り当てられているのかを示しています。Byte単位でひっくり返して000010hになる通り、通常16Byteです。
 よって、本例では(6)0014h~(11)0023hまでの値はフォーマット記述であることを示しています。拡張したい場合は16Byte以上にして(12)の領域を確保します。

(6)0014~0015h:2Byte:[01 00]
 別途定義されているフォーマットIDです。リニアPCMは1です。
 Byte単位でひっくり返して、1になります。

(7)0016~0017h:2Byte:[02 00]
 チャンネル数です。ひっくり返して、2ですね。

(8)0018~001Bh:4Byte:[44 AC 00 00]
 サンプリングレート[Hz単位]です。
 44.1kHzなら10進数の44100を表す16進数です。Byte単位でひっくり返して0000AC44hですので44100になります。

(9)001C~001Fh:4Byte:[10 B1 02 00]
 意味的にはビットレートですが数字としては“バイトレート”です。Byte単位でひっくり返しで0002B110hとなりますから、それを10進数に直すと176400ですね。2ch×2Byte(16bit)×44.1kHz=176400です。

(10)0020~0021h:2Byte:[04 00]
 同時再生するデータブロックサイズ(Byte)です。ビット深度16bitのサンプル=2Byteのstereoなら 2x2=4です。ひっくり返して4になっています。

(11)0022~0023h:2Byte:[10 00]
 サンプルのビット深度です。ひっくり返して0010hなので16bitですね。

(12)この間に(5)で定義できる「拡張部分」があり得ますが、一般的には存在しないようです(マルチchにはある模様)。

(13)0024~0027h:4Byte:[64 61 74 61]
 アスキーコードで“data”です(ひっくり返しません(笑))。この後は波形データ本体について記すぞ、という区切りですね。

(14)0028~002Bh:4Byte:[50 3E C0 02]
 (15)で宣言した波形データ(data)のバイト数です。この後(002Ch以降)波形データが何Byte続くかを示しています。
 上記の例ですと、Byte単位でひっくり返して02C03E50h Byteになります。
 fmtもそうですが、「この後これについて記述するぞ」と(小文字で)宣言した直後、その記述容量について提示するコンセプトになっているのですね。
 通常、この波形データが終わったところでWAVファイルはオシマイです。


 波形データ本体のバイナリ一致か否かを調べる時の前提知識として。

・上記ヘッダ構造を見れば、「“コンペアのレベル”によって一致不一致結果が異なる」なんて概念はPCの世界にはないことが解るかと思います。

・原則的に規格通りの記述しかできないことが解ると思いますので、そこから、通常なら(オプション記述をしないなら)どんなリッピングソフトでも上記ヘッダがオリジナルになる余地はないことも解ると思います。

・ただし、ヘッダではなく“波形データの後(フッタ?)”に独自の情報を付記するリッパーもあるようです。

・ちなみに、上記“とあるWAVファイル”は≪iTunes≫でリップしたものですが、同じトラックを≪EAC≫でリップしたファイルのヘッダも全く同じでした。WAVデータの後に何も付いてないのも同じです。


■WAVE vs AIFF

 12/06/11追記:WAVEと並ぶ非圧縮PCMフォーマット、AIFFとWAVEを比較してみました。
 以下、BDR-S05Jパーフェクトモードにてあるトラックをリッピングした結果です。
 ヘッダ部とフッタ部はバイナリエディタで覗いた結果です。

1.≪iTunes10≫:WAVE形式:46,153,340 バイト
2.≪iTunes10≫:AIFF形式:46,155,518 バイト  #フッタに情報付加あり
3.≪WMP(Win7付属)≫:WAVE形式:46,153,550 バイト  #ヘッダに情報付加あり
4.≪Power2Go6≫:WAVE形式:46,153,486 バイト  #フッタに情報付加あり
5.1を≪foobar2000≫のConvert機能でAIFF形式に変換:46,153,350 バイト
6.2を≪foobar2000≫のConvert機能でWAVE形式に変換:46,153,340 バイト
7.3を≪foobar2000≫のConvert機能でAIFF形式に変換:46,153,350 バイト
8.4を≪foobar2000≫のConvert機能でAIFF形式に変換:46,153,350 バイト

 出自からしてかなり似ているフォーマットとのことですが、バイトオーダは決定的に違っていて、AIFFはビッグエンディアン、WAVEはリトルエンディアンです。バイナリエディタで覗く時は注意、です。

 1と6はヘッダ・フッタに何も付いていないプレーンなWAVEファイルです。ファイルコンペアしても一致します。AIFF形式はよく解りませんが、プレーンなWAVEを変換した5はおそらくプレーンAIFF形式ではないでしょうか。7も8も同じ容量になっていますし。
 ということで5と6(1と同じ)をバイナリエディタで比べると、AIFFの方が波形データの開始までに10Byte多いようです。

 AIFF陣営(?)の≪iTunes≫、WAVE陣営(?)の≪WMP≫はそれぞれ自陣のフォーマットには利便性向上のための情報付加してプレーンな状態ではない(オプションデータ付き)ファイルを生成するようです。≪iTunes≫」はWAVEはプレーンなものを出力しました。
 「敵陣営(?)のフォーマットには利便性なんか考えてやらない」ということでしょうか(笑)。

 つまり、別に「WAVEは長年の積み重ねでフォーマットが肥大化している」なんてことはないのです。
 実際、上記の通り≪WMP≫が作るWAVEより≪iTunes≫が作るAIFFの方が圧倒的に肥大化してます(プレーン状態での差は10Byteです)。単純にリッパーに依存するってことですね。
 そういう意味でも、≪iTunes≫でWAVE形式リッピングはやっぱりオススメです。


メインメニューへ

テーマ : オーディオ
ジャンル : 趣味・実用

最新記事
ERIへようこそ

Author:らかせ
「最新記事」または
「メインメニュー」からどうぞ

・ファイルへの直接リンク以外はリンクフリー(連絡不要)です

・一応、拍手にコメント(非公開)付けられるようにしてあります

・DB的に利用しており、過去記事もガシガシ書き換えています。特に「最新記事」は初稿から一週間くらいは直してることが多く、大幅に変わっちゃうことも。ご了承ください

・ということもありますし、記すまでもないですが無断転載(ファイル含む)はご遠慮ください

・引用の考え方については「007:諸事」をご参照ください

・ハイパーリンクは当Blog記事のみです(054:節電記事のみ例外)

・Amazonアソシエイトに参加しています(アフィリエイトはAmazonのみです)

カテゴリ
検索フォーム
FC2カウンター