こんにちは。
W.Deeです。
いまムービー拡張を吉里吉里本体に組み込ませて頂いています。 大変ありがとうございます。
trunk に組み込んでいます。アドレスは https://sv.kikyou.info/svn/kirikiri2/trunk です。
当方、VC++6.0しか持っていないのでVC++6.0でコンパイルするために DShowException.cpp / DShowException.h に少し変更を加えました。 (詳しくはコミットログを見て頂けると幸いです)
----------------------
コンパイルはうまくいったのですが、問題が発生しました。 openメソッドで
krmovie.dll/krflash.dll 内でエラーが発生しました/Unknown error
というエラーが出ます。
こちらで配布されているサンプル内のlake.mpgでこのエラーが発生します (エラーが出ないムービーも あります)。
こちらで試したのは ( MediaPlayer では全て再生できます ) [1] lake.mpg MPEG1 320x240 30.00fps 1:1 1843.20kb/s MPEG1-LayerII 44.10kHz 128.00kb/s CBR Stereo 00:00:04 [2] 某ゲームのOP MPEG1 640x480 29.97fps 1:1 4000.00kb/s MPEG1-LayerII 44.10kHz 192.00kb/s CBR Stereo 00:01:30 [3] 某昔のMADビデオ AVI1.0 640x240 24Bit Radius Cinepak 15.00fps 1377f 3877.48kb/s PCM 22.05kHz 8Bit 2ch 352.80kb/s 00:01:31 [4] AVI1.0 640x480 24Bit DivX3/MS MPEG4-V3(DIV3) 30.00fps 22909f 603.99kb/s PCM 44.10kHz 16Bit 2ch 1411.20kb/s 00:12:43 です。
krmovie.dll では [1] × [2] ○ [3] ○ [4] ○
krlmovie.dll では [1] × [2] ○ [3] △ [4] ×
となりました。 ×は全て同様のエラーとなります。 ( △は、再生はできるが、画像にブロック状の残像のようなノイズが乗る )
ちなみに、krlmovie.dll で lake.mpg が再生できないのは、こちらで 配布されているサンプルでも同様です。
krmovie.dll でエラーの出る箇所を追うと、tTVPDSMovie::BuildMPEGGraph の
if( FAILED(hr = ConnectFilters( pMPEG1Splitter, pMPEGVideoCodec )) ) return L"Failed to call ConnectFilters.";
の箇所で例外が発生しています。
tTVPDSMovie::ConnectFilters を追うと、upstream の Audio と downstream の Input をつなごうとしてエラーが発生しています ( ループ内で PinInfoUpstream.achName が L"Audio" で、PinInfoDownstream.achName が L"Input" のとき、 m_GraphBuilder->Connect を行っている 最中にこのエラーが出ているようです )。
ログ(VC++の「デバッグ」ペイン)を見ると
'C:\af\npp1\Qn.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 'C:\af\npp1\Waves.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 'C:\WINDOWS\system32\comdlg32.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 例外処理 (初回) は tvpwin32.exe (QN.DLL) にあります: 0xC0000005: Access Violation。 例外処理 (初回) は tvpwin32.exe (QN.DLL) にあります: 0xC0000005: Access Violation。 'C:\af\npp1\Qn.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 例外処理 (初回) は tvpwin32.exe (C1.DLL) にあります: 0xC0000005: Access Violation。 例外処理 (初回) は tvpwin32.exe (C1.DLL) にあります: 0xC0000005: Access Violation。 (略) 'C:\Program Files\illiminable\oggcodecs\vorbis.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 'C:\Program Files\illiminable\oggcodecs\ogg.dll' をロードしました、合致するシンボル情報は見つかりませんでした。 例外処理 (初回) は tvpwin32.exe (LIBFISHSOUND.DLL) にあります: 0xC0000005: Access Violation。 例外処理 (初回) は tvpwin32.exe (KERNEL32.DLL) にあります: 0x0EEFFACE: (名前がありません)。 例外処理 (初回) は tvpwin32.exe (KERNEL32.DLL) にあります: 0x0EEFFACE: (名前がありません)。 (略)
のようなエラーが大量に記録されています。 QN.DLL とか C1.DLL は DirectShow のオーディオ系のエフェクトフィルタで、 illiminable\oggcodecs\vorbis.dll などは http://www.illiminable.com/ogg/ ここのフィルタです。
ビデオデコーダをスプリッタにつなぎたいのに、スプリッタのオーディオ出力と ビデオデコーダの入力をつなごうとしておかしくなってるんでしょうか...
ちなみに tTVPDSMovie::BuildMPEGGraph 内での順序を変え、オーディオをビデオよりも先に 接続するようにするとエラーは起きなくなりますが、根本的な解決になってなさそうなので やるのはやめています。
# Radius Cinepak コーデックでノイズが乗るのは デコーダ側の問題のような気がます # いまさら使われることもなさそうなので非サポートにしてしまおうかと思います
----------------------
で、すこし探っていくと うちの環境では、標準で MPEG1 スプリッタに "MainConcept MPEG Splitter"が使われてしまうことがわかりました。 SoundForge という音声編集系ソフトウェアについてくるものです。 これのメリット値を http://hp.vector.co.jp/authors/VA032094/DFTool.html ここのツールで下げ、標準のスプリッタが選ばれるようにすると 状況が以下のように変わりました。
krmovie.dll では [1] ○ [2] ○ [3] ○ [4] ○
krlmovie.dll では [1] × [2] ○ [3] △ [4] ×
となりました (krmovie.dll での lake.mpg の再生が可能になった )。
うちの環境が悪いと言えば悪いのですが、より多くの環境での安定動作を 求めるならばスプリッタも標準の物を指定してフィルタグラフを構築する べきなのかもしれません。
----------------------
現状はこんなところです。 こちらでも引き続き調査しますが、なにかご助言をいただければ幸いです。
では長くなり読みづらいかも知れませんが申し訳ありません。 よろしくお願い致します。
- 関連一覧ツリー
(▼ をクリックするとツリー全体を一括表示します)
- 返信フォーム
(この記事に返信する場合は下記フォームから投稿して下さい)
|