waveファイルに関係ないデータを埋め込む

 突然ですが、waveファイルがwaveファイルと認識されて演奏可能になる条件ってなんでしょうね?

詳細はちょいと不明ですが、大体↓な感じ。


・最低限のヘッダが構成されている。
 (RIFF/WAVE/fmt /dataの各チャンクが正確に定義されていること。)
・上記「RIFF」「data」チャンク内のサイズが正しいこと。
・上記「data」チャンク内に記入されているサイズ分のデータが
 ファイル内に存在すること。
要するに「必須ヘッダ」と「必須分のデータ」が確保されていればいいということ。





 で、ここからが今回の本題。

あえて二つ目の条件の所を「サイズが正しい」とぼかして書きました。

これは、一般的な解説では


RIFF … 以降のファイル全体のサイズ
data … 以降の波形データのサイズ
とされているかと思うのですが、

これが正確には少し違うようで、


RIFF … 以降のwaveフォーマットデータのサイズ
data … 以降の波形データのサイズ
とするのが正しいようです。

(少なくとも、WindowsMediaPlayerにおいては。他のプレイヤは要検証かもしれず。)



 このことを考慮すると、鳴らす音声データ以外もwaveファイルに埋め込むことができます。

具体的には、

鳴らす音声データ終了後に埋め込みたいデータを直接書き込んでしまえばOK。

(ヘッダに記述されている範囲外のデータになるので、プレイヤ側から触れることはない…ということなんですかね?)

 数秒しか鳴らないのに、異様にファイルサイズが大きい

…なんていうものがあった場合は、おそらくこの手法で何らかのデータが埋め込まれています。

(まぁ、そんなファイルを見たことはありませんが(苦笑))





 …で、こんなことをして何に使うんでしょう?

…実際の所、使い道はほとんどありません(何)

何らかの形で、音声とセットで持たせておきたいデータとかスクリプトがある場合は有効かもしれないですが…。

(ちなみに、範囲外アクセスよろしくBufferOverRunの可能性ですが、前述の通りヘッダで記述されている範囲外になるせいか、ほとんど考えなくていいみたいです。)