3

私たちのソフトウェアの1つの機能は、DirectShowでビデオを再生します。あるユーザーと社内のQAは、画面キャプチャユーティリティ(Captivate、Camstudio、AVS4Uのキャプチャユーティリティを含む)では、画面上で再生されているビデオを他の画面上のデータと一緒に記録できないことを発見しました。ビデオのある領域は、黒い長方形としてキャプチャされるか、最初のフレームのみが表示されます。

DirectShowビデオを画面にレンダリングして、ビデオキャプチャユーティリティが再生中のビデオを周囲のウィンドウ上の他のすべての画面上の(通常のGDI描画)データと一緒にキャプチャできるようにするにはどうすればよいですか?以下の問題に関する多くの詳細。

ノート:

  • 開発用コンピューターで問題を再現できないため、解決が少し難しくなっています。OSX上のVMWareFusion3で実行されているWindows7を使用しており、SnippingToolとPrintScreenキーを使用して静止画像をキャプチャし、CamStudioとAVS4Uを使用して画面ビデオをキャプチャしています。ただし、1人の顧客と2人のQAスタッフの両方が、Windows7をネイティブに実行している問題を再現できます。私のVMとそのPC上のすべてのドライバーなどは最新です。影響を受けるお客様の正確なハードウェアとドライバーの情報はありませんが、社内のQAスタッフのコンピューターで入手できます。

  • 私の理論では、ビデオはオーバーレイまたはその他のビデオハードウェアベースのメカニズムを使用してレンダリングされ、GDIを完全にバイパスしているため、キャプチャユーティリティはビデオデータを認識しません。また、何らかの理由で、これは次の場合に使用されるメカニズムではありません。 DirectShowは私のマシンで実行されます。これを確認する方法がわかりません。EC_VMR_RENDERDEVICE_SETグラフマネージャは、使用されているメカニズム(オーバーレイ、ビデオメモリ、またはシステムメモリ)を確認できるイベントを送信しません。

  • これを解決するための1つのアイデアは、フレームごとに送信されたイベント通知をリッスンし、それを使用IBasicVideo::GetCurrentImageして現在のフレーム画像(および位置)を取得し、GDIで画面にレンダリングすることでした。ただし、フレームごとにイベントが送信されるわけではないようです。具体的には、私が目にするイベントは次のとおりです。

    • ビデオウィンドウを開き、一時停止した静止ビデオを表示します。EC_VMR_RENDERDEVICE_SET

    • ビデオのステップ:EC_PAUSEDおよびEC_STEP_COMPLETE

    • ビデオの再生:何もありません-イベントをまったく発生させずに再生します。

  • もう1つのアイデアは、新しいグラフフィルターアイテムを挿入することです。これにより、フレームごとにフレームがキャプチャされ、GDIを使用して画面に描画されます。これが良いアプローチであるかどうか、またはそのようなアイテムをどこから書き始めるかはわかりません。これが最善の解決策である場合、優れた答えは、フレームデータを取得するための記述方法を示す短いコード例です。(これが最善の解決策であるかどうかはわかりませんが、最善ではなく、「a」の解決策を取得する必要があると思います。当然、可能であれば、正しい方法が何であれ、「正しい方法」を好みます。 )。

  • 別のアイデアは、代替のビデオレンダラーを作成することですが、MSDNはそのページで、代わりにビデオミキシングレンダラーまたは拡張ビデオレンダラーのいずれかを使用することを推奨しています。VMRはDirectXベースのように見えるので、問題に関する私の理論が正しければ、D3DXのようなものを使用して表面データを画像(?)として取得し、EVRがVista以降のみである場合を除いて、これを行うことはおそらく役に立ちません。AVRを書くことはかなり複雑に思えます、そしてそれが私がそれを書く前に私がしたいことを私が達成するのを助けるかどうか私は100%確信していません。

  • ビデオは現在、またはではなく、 IVideoWindowを介してレンダリングされます。もちろん、これらのインターフェース/実装の1つに、それが機能するのに役立つ何かがある場合は、これを変更できます。IVMRWindowlessControlIVMRWindowlessControl9

  • コードは.NetではなくネイティブC++で記述されていますが、どの言語のソリューションでも素晴らしいでしょう。サポートされる最小のクライアントはWindowsXPです。

この問題に関するアドバイスをいただければ幸いです。すばらしい答えがあれば、小さなコードサンプルが提供されます(動作することがわかっているものがあればよいでしょう)。

ビデオを取得するためのスクリーンキャプチャは完全に合法であることに注意する必要があります。私たちのソフトウェアは科学的な視覚化と分析のソフトウェアであり、私たちのユーザーが再生しているビデオは彼ら自身の記録です。当社のソフトウェアは、他のソースから記録された非ビデオデータと一緒にこのビデオを表示できます。スクリーンキャプチャツールは、デモ、プレゼンテーション、研究に関するオンラインビデオなどを記録するために使用されます。つまり、画面上の周囲のものと組み合わせてビデオ再生をキャプチャする正当な理由です。

ご協力ありがとうございました!

4

1 に答える 1

2

ビデオをレンダリングするときは、オーバーレイを使用しないでください。次のいくつかの方法があります。

  • カスタム レンダラーを使用します。キャプチャ機能を保証する GDI ベース -古い Windows SDK および/または DirectShow SDK でのSampVid Filterサンプル
  • フラグ/設定を設定して、オーバーレイの使用を防止します - IVMRFilterConfig::SetRenderingPrefsIDirectDrawVideo::SetSwitches
  • 実際の再生を開始する前に利用可能なすべてのオーバーレイをロックするために偽のグラフまたはフィルターを作成し、目的のビデオが標準のビデオ レンダラー コンポーネント内の非オーバーレイ コード パスを介して表示されるようにしますIDirectDrawVideo::GetSurfaceType。戻る
于 2012-11-09T00:33:24.603 に答える