Windows で動画を作るとき、lameなどの外部エンコーダで生成した VBR MP3 を動画の音声として使いたいというのは、よくある要求でしょう。例えば、IIS MP3 192Kbps CBR のようなソフトウェアからすぐ使える音声圧縮を使うより、
lame -m j -q 0 -V 0
などとしたほうが、おそらく、より高音質なサウンドでオーディオ部分のファイルサイズは減少し、同じ仕上がりサイズで考えるとそのぶん映像部分により多くのビットをまわすことができて映像の品質も向上します。また、より高圧縮にしてオーディオ部分のサイズを節約したい場合でも、外部エンコーダでVBRを使うのが効果的かもしれません。これらの点については、すでに多くの情報があるかと思われます。
以下では、Nandub や Virtual Dub MP3(vdub_mp3_freeze.zip)などを使ってAVIビデオとMP3ファイルを合成(Mux = Multiplex)した場合、同一設定で同じ映像ストリームと同じ音声ストリームをそれぞれ Direct Stream Copy しているにもかかわらず、まったく同じ操作を2度、繰り返したとき、生成されるファイルが厳密には一致しない現象について説明します。
Lameなどで外部的に用意したMP3ファイルと、あるAVI(DivX, XviD, MS-Mpeg4, etc.)の映像を mux する同じ操作を繰り返した場合、完全に同じ設定で同じ mux をしているにもかかわらず、生成されるAVI動画は、一般に、そのたびごとに異なったものになります。具体的にいうと、生成されたファイルのサイズは何度やっても完全に一致し、映像、音声とも内容は厳密に一致するにもかかわらず、MD5やCRCは、一般に、Muxのたびごとに異なってます。
2つの原因があります。
注意: ここで「ファイルが異なる」というのはバイナリレベルで1バイトずつ比較した厳密なファイル内容が等しくない、という意味であり(言い換えれば、ファイルのMD5値やCRCが一致しない)、そのファイルを再生したときの「表現型」(映像、音声)は全部のフレームが完全に同じです。いわゆる「エンコードの結果が異なる」(例: ノイズの出方が違う)のでは、ありません。
以下は Nandub がヘッダに埋め込むコメントのダンプ例です。(ダンプリストを読まずに次へ進む。)
ADDRESS 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF ------------------------------------------------------------------------------ 000022D0 00 00 00 00 00 00 4C 49 53 54 1C 00 00 00 49 4E ......LIST....IN 000022E0 46 4F 49 53 46 54 0F 00 00 00 4E 61 6E 64 75 62 FOISFT....Nandub 000022F0 20 76 31 2E 30 72 63 32 00 00 4A 55 4E 4B FE 04 v1.0rc2..JUNK.. 00002300 00 00 4E 61 6E 64 75 62 20 62 75 69 6C 64 20 31 ..Nandub build 1 00002310 38 35 32 2F 72 65 6C 65 61 73 65 00 00 00 00 00 852/release.....
次の画像は、vdub-mp3 で同じ設定で書き出した2つのファイルの相違部分をバイナリエディタで検査した例です。
この問題は映像、音声、ファイルサイズのいずれにも実質的な影響を及ぼさないので無視することができますが、生成されるファイルのCRCが(実質的には無意味な部分の違いにより)一致しないという事実に注意します。例えば、友人に映像用のAVIと音声のMP3をべつべつに送って、むこうで mux してもらう場合、あなたが手元で mux したものと向こうで作ったものとで md5 などを照合しても一般には必ず一致しません。ですので、単に上のようなどうでもいい理由でCRCが合わないのか、それとも何かの実質的なトラブルが起きているのか、md5 や CRC では切り分けができないことになります。このようにmd5やcrcがあてにならない状況下において、ネットワーク越しにファイルの整合性を照合する必要がある場合、必要なら、zidrav などを使うことができます。区間ごとにチェックサムをとると、もし mux 自体は正常なら CDP パッチは非常に小さなファイルになるはずです。このCDPパッチによって、友人のファイルと手元のファイルを、無意味バイトまで含めて完全に一致させることもできます。
VBR の MP3 を mux した場合、完成したAVIファイルを一般のツールでひらいて再編集すると、音ズレの原因になります。VBR の MP3 をサポートしないツールでは、これをVBRの平均値のCBRであるかのように扱うからです。とくに、ノーマル版の Virtual Dub では「VBR audio stream detected」という警告がでて、次の例のように言われます。
VirtualDub has detected an improper VBR audio encoding in the source AVI file and will rewrite the audio header with standard CBR values during processing for better compatibility. This may introduce up to 8951 ms of skew from the video stream. If this is unacceptable, decompress the *entire* audio stream to an uncompressed WAV file and recompress with a constant bitrate encoder. (bitrate: 157.8 ± 30.8 kbps)
この例では、最大8951ミリ秒の音ズレが生じる可能性があると予告しています。(なお、Vdub のダイアログボックスのなかの ± [0xB1] の字は日本語環境のOSでは半角カタカナの「ア」に文字化けするかもしれません。)
つまり、一般のツールでは、MP3 VBRの場合、「音声はそのままで画像だけ再圧縮」のような、簡単にできそうなことができません(できるけれど、音ズレが生じる)。例えば640x480の350MBのファイルがあるとして、そんなに必要なファイルでないけれど、いちおう資料用に、320x240の80MBくらいに再圧縮してCD-Rかなにかに残しておく、というようなことをやる場合、もとファイルの音声がVBRだと音ズレが起きる可能性が高いです。
このような場合、Virtual Dub は「いっかい wav に戻してからCBRで再圧縮」をすすめてきます。が、それでは時間も手間もかかるし音質はそのままでいい場合でもファイルサイズが同じで音質が悪化してしまいます。ので、こういうときは、VBR MP3 をサポートしている vdub-mp3 か nundub などを使うのが良いでしょう。注意点として、Virtual Dub で「Direct Stream Copy」を選んだ場合であっても、実際には Direct にコピーされずヘッダが書き換えられてしまいます。AviUtlの場合は、特に警告ないまま CBR化されるようです。
このメモの内容は手元で独自に調べたものであり、無保証です。何らかの意味で間違っているかもしれません。