解像度の変更でフルスクリーンにすると音声つきの動画の再生に失敗する
音声なしのmp4(x264)、音声ありのmp4(x264)、音声なしのAVI、音声ありのAVIを用意したところ、
ウインドウの拡大表示(GPUでの拡大)では全て再生できたのに対し、解像度の変更(モニタでの拡大)では音声ありのmp4と音声ありのAVIは再生できませんでした。
(AVIのコーデックは「Lagarith Lossless Codec」を使用しました。)
ご連絡いただきありがとうございました。こちらでも再現できました。調べてみます。
取り急ぎ、
FDK/コード/04.グラフィックス/CDirectShow.cs の
public static void ConnectNullRendererFromSampleGrabber(IGraphBuilder graphBuilder, IBaseFilter sampleGrabber)の最初のtryの中ですぐに出てくる
if (videoRenderer != null && audioRendererInputPin != null)は
if (videoRenderer != null && videoRendererInputPin != null)
であると思われ。
ただし、そこを直しても問題は解決せず。そこのifブロックの中の最後の方の
hr = grabberOutputPin.ConnectedTo(out grabberOutputConnectedPin);で例外発生しているようです。
起票いただいた問題は、動画ファイルの中の音声データがあると動画再生できないというものですが、 上記の通り音声データがないとこのifブロックの中に入らないため、たまたま問題発生していなかった、というのが実際のところかと思います。
上記を修正することにより、動画再生が全滅します。
ということで、ifブロックの中の問題と思われますので、調べてみます。
(そして、おそらく次のaudioのifブロックの中にも、類似問題がある可能性があります)
うちの環境ではどうも、GPUスケーリングの場合は、Sample Grabber以降のフィルタグラフが
Sample Grabber -> Color Space Converter -> Video (Null) Renderer
となるのに対して、モニタスケーリングの場合は
Sample Grabber -> Video (Null) Renderer
となっています。そして、後者のように、Sample Grabberとレンダラが直結している場合に、この問題が発生するようです。
(実際のソースコードでも、レンダラのinと、レンダラのinに入れているout を両方disconnectしてから、その後grabberのoutと、grabberのoutにつながっているinを両方disconnectしていますが、grabberとレンダラが直結していると、後者が失敗して例外が発生しています)
Rev. 1b481ac2d8aa7dd675a7628cff8850ef2667b479 で修正しました。(当方環境と同じ原因で問題発生していたものと仮定しています。)
ただ、稀に動画読み込みで動作がロックすることがあるようです。(CTRL+ALT+DELしてESCすれば先には進む)
今自宅の環境では再現できなくなっているのですが、まだ調査が必要そうです。
対応ありがとうございます。先日試した4パターン全てにおいて正常に再生することを確認できました。
テスト回数が少なくて動作ロックについてはまだ遭遇していませんので、後日またテストしてみます。
動作確認いただき、ありがとうございます。
こちらの環境では、FDKのCDirectShow.csの
public static void ConnectNullRendererFromSampleGrabber(IGraphBuilder graphBuilder, IBaseFilter sampleGrabber)の最初の方の
// それらを切断。前段の出力ピンとビデオレンダラの入力ピンを切断する。双方向から切断しないとグラフから切り離されないので注意。 hr = videoRendererInputPin.Disconnect();で、かなりの確率で固まります。
# 曲データにフォーカスを合わせて、3秒ほど待ってから決定するのが、再現させるポイントです。
この手の「帰ってこない」系の対処としては、タイムアウトを設けるのが常道ですが・・・DirectShow関連のメソッドは同じスレッド上で実行しないと意味がないでしょうから、別スレッドに実行を逃がしてタイムアウト待ちするというパターンが使えないのですよね。さて、どうしたものか・・・。
どこか初期設定をとちっているという話ならまだ手の打ちようがあるのですが、ただのDisconnect()だしなぁ・・・
もう少し対策検討してみます。
選曲画面のプレビュー動画でも、同じところで固まります。こちらは演奏画面以上に再現が容易で、一度再現しなくても、別の曲データにフォーカスを移してから元の曲データに戻す、を1,2回繰り返すだけで再現できました。
私の環境だけでしょうかねぇ・・・?
私はK-Lite Codecを使っていて、今回最新版に入れなおす(旧版をアンインストールし、最新版をインストール)ことも実行しましたが、現象変わらずです。
後はグラフドライバを最新版にしてみるくらいですが・・・Haswellのチップセット内蔵グラフなので、この辺りの更新があるとは思えない・・・ダメもとで試してみますが、それでもだめだったら私はギブっす。
# まあ、いい加減、DirectShowを使うのをやめて、MediaFoundation に移行しろ、という話かもですが
現行方式での問題は修正できたため、このチケットはクローズします。
解像度変更方式にて発生する問題は、#37280 (フルスクリーン化方式の切り替え機能) にてトレースします。
Release 109にて対応済み。
解像度の変更(モニタでの拡大)方式でフルスクリーンにした時、音声が含まれる動画ファイルを再生することができない。
(現在は100シリーズでこの拡大方式を使用していないのですが、チケット#37280で両方とも使えるようにすると書いていたので...)