トップ 検索 一覧 ヘルプ RSS ログイン

DVD FlickへのWMV・ASF入力の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!DVDFlickへのWMV・ASF入力の音ズレに関して

DVD Flickにwmv/asfファイルを投入すると、出来上がったDVDでは音ズレするという報告が数多くあるようだ。これの修正方法のメモ。'''ただし、予測でしかない。'''

Avisynth経由でDVD Flickに動画を読み込ませると、例えDVD Flickが直接サポートしていない動画・音声の形式でも、DirectShowを使用して''Windows Media Playerで再生できる動画・音声なら何でも読み込める''(もちろんDRM付きの物はダメ)ようになる。DVD Flickを使う上では欠かせないテクニックだ。実例を挙げると、テストの結果、''Windows Media Audio Professional v9''(2Ch, 44.1kHz, 24bit)の音声も読み込めた。

!!修正方法

''Avisynth + DirectShowSourceプラグイン経由で入力する。以上。''

具体的に言えば、まずは[Avisynth|http://avisynth.org/]の[SourceForgeのページ|http://sourceforge.net/project/showfiles.php?group_id=57023&package_id=72557]でAvisynthを取得・インストールし、avsスクリプトを書いてDVD Flickに投入する。avsスクリプトを書くのが面倒な方は下記のツールで作るといい。

{{ref_size makeavs0.0.0.0.7z}} (2009/01/21)

makeavs-ds.wsfに動画ファイルをドロップすると小さなavsファイルが作成されるので、このavsファイルをDVD Flickに投入すればOKだ。

実は、DVD Flickに含まれているffmpegでwmvが音ズレするというのは、DVD Flick以外(携帯動画変換君など)でも結構メジャーな話だ。そして、それらの解決方法としてAvisynthが紹介されるのも定番だ。

''ただし、ここでavs経由で修正可能と言っているのは予測でしかない。''猫科研究所では音ズレするという問題自体を確認できていない。''何の保証も無いことに注意。''

!!音ズレの原因
!!中身の話
''(ここから先は内部の話なので知的好奇心を満たす意味しかありません。一般のユーザが読む必要はありません。)''

これではつまらないので、多少解説すると、''問題はffmpegのwmaデコーダ''にあると思われる。もっと正確に言うとffmpegのコンテナスプリッタ→デコーダのインターフェースにあると思われる。
AvisynthはDirectShowSourceというプラグインを標準で持っており、これはWindowsのDirectShowを使用してwmv(とwma)をデコードする。このとき使われる''スプリッタ・デコーダはMicrosoft/Windows純正のものなので、Windows Media Playerで再生した場合と全く同一の映像・音声''が得られる。つまり、デコード結果の映像と音声がずれることもないはずだ。

DirectShow等の現代的なマルチメディアシステムは、データの受け渡しに関して、「スプリッタからデコーダに渡す方式(push)」と「デコーダがスプリッタに要求する方式(pull)」の両方をサポートする。
…と言いつつ、それでもずれる場合はあるらしい。一応、DVD Flick以外のffmpegでは、avsでDirectShowSourceにconvertfps等のオプションを追加すればずれないという話もある。が、どうしても駄目なケースはある模様。ここまで来るともう原因は不明だ…。一応、上記のmakeavsで作成するavsはconvertfpsを付けてある。

え、どちらもデータが渡れば同じじゃないのかって?それが違うのだ。''wmvでの音ズレは、ffmpegが構造的にpush方式に固定されていることが原因''と考えられる。
'''…た・だ・し、'''これらは全て予測でしかない。猫科研究所では問題の音ズレが発生するようなwmaファイルが無く、''実際の動作は一切検証できていない''。解説も的はずれかも知れないので注意。

昔の動画・音声圧縮形式というのは、コンテナのスプリッタが、ファイルからある単位(''フレーム''などと呼ばれる)でデータを切り出すと、それは一定時間分のデータであることが保証されていた。このため、コンテナスプリッタはある一定時間ごとに、デコーダに1フレームずつデータを送り出せば再生が間に合っていた。この''スプリッタがデータ受け渡しの主導権を握っているのがpush方式''だ。
!!追加情報

その後、圧縮技術は複雑さを増し、1フレームに必ず一定時間分のデータを収めるのは''無駄が大きい''と考えられるようになった。フレームのサイズを固定でなく可変にすればいいのだが、そうすると途中再生・シークなどの処理が難しくなる。結果として、コンテナからは固定サイズ(固定長のフレーム単位)に見えるが、内部的にはフレーム間にまたがるデータを使う、というハイブリッドな方式になる。すると、ある''フレームが一定時間分のデータを含んでいるという保証はなくなり''、1フレームを受け取ってもデコーダが十分なデータを出力できない事態が生じる。こうなってくると必然、スプリッタが「これでいいでしょ」とデータを渡すのではなく、''デコーダが「これだけデータをくれ」と主導権を握るpull方式''になる。
Avisynth経由でDirectShowSource入力を行ってもずれる場合に関して、以下の方法で修正できるとの情報を頂きました。

ffmpegのwmaデコーダのコードを見る限り、wmaはこのフレーム間にまたがるデータを持っており、必然的にpull方式になる。しかし、''ffmpegではデコーダがスプリッタにデータを要求する手段がない''。では、どうするか。wmaデコーダは本来の時刻にデータを出さず、必要なデータが揃ってから出力する。つまり、''音声の遅延につながる''というわけだ。
*AviUtlかVirtualDubでいっぺんcfr なaviに変換する(音声はPCMにする)。
*DSMux(GDSMux)でmkvにしてから DirectShowSourceで読み込む。

では、''なぜAvisynth経由で修正可能なのか''。AvisynthはDirectShowSourceというプラグインを標準で持っており、これはWindowsのDirectShowを使用してwmv(とwma)をデコードする。このとき使われる''スプリッタ・デコーダはMicrosoft/Windows純正のものなので、Windows Media Playerで再生した場合と全く同一の映像・音声''が得られる。つまり、デコード結果の映像と音声がずれることもないはずだ。

…と言いつつ、それでもずれる場合はあるらしい。一応、DVD Flick以外のffmpegでは、avsでDirectShowSourceにconvertfps等のオプションを追加すればずれないという話もある。が、どうしても駄目なケースはある模様。ここまで来るともう原因は不明だ…。一応、上記のmakeavsで作成するavsはconvertfpsを付けてある。

'''…た・だ・し、'''これらは全て予測でしかない。猫科研究所では問題の音ズレが発生するようなwmaファイルが無く、''実際の動作は一切検証できていない''。解説も的はずれかも知れないので注意。
情報提供者に確認してないのでお名前は一応伏せておきます(いずれにせよハンドルネームですが)。