次の方法で共有


DirectShow での WDDM キャプチャの使用

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

このトピックは、Windows Vista 以降に適用されます。

一部のビデオ カードには、ビデオ キャプチャ機能が統合されています。 これらのカードでは、キャプチャされたビデオ フレームがビデオ メモリ (VRAM) に配置されます。 Windows Vista より前は、フレームが VRAM に残っている間、フレームを処理するための標準的なメカニズムはありませんでした。 代わりに、データをシステム メモリにコピーし、処理してから、表示のために VRAM にコピーし直す必要がありました。 Windows Vista では、DirectShow では、キャプチャから表示まで、処理パイプライン全体でビデオ フレームを VRAM に保持するためのメカニズムがサポートされるようになりました。

KsProxy フィルターは、ドライバーが KSPROPERTY_PREFERRED_CAPTURE_SURFACE プロパティのドライバーに対してクエリを実行して、VRAM サーフェス キャプチャをサポートしているかどうかを判断します。 (このプロパティは、Windows Driver Kit のドキュメントに記載されています)。ドライバーが VRAM サーフェス キャプチャをサポートしている場合、KsProxy は Direct3D サーフェスへのポインターを保持する特別な種類のメディア サンプルを割り当てます。

次に、KsProxy は、ダウンストリーム フィルターが DirectX ビデオ アクセラレーション (DXVA) 2.0 をサポートしているかどうかを次のように判断します。

  1. KsProxy は、 IMFGetService インターフェイスのダウンストリーム入力ピンに対してクエリを実行します。
  2. PIN で IMFGetService が公開されている場合、KsProxy は IDirect3DDeviceManager インターフェイスに対して IMFGetService::GetService を呼び出します。 サービス idier がMR_VIDEO_ACCELERATION_SERVICE。

これらのインターフェイスはどちらも Media Foundation SDK ドキュメントに記載されています。

ダウンストリーム フィルターが DXVA 2.0 をサポートしていない場合、KsProxy は追加のシステム メモリ バッファーを割り当てます。 このバッファーを使用して、VRAM からシステム メモリにビデオ フレームをコピーします。 メディア サンプルの IMediaSample::GetPointer メソッドは、このシステム メモリ バッファーへのポインターを返します。

ただし、ダウンストリーム フィルターで DXVA 2.0 がサポートされている場合、KsProxy はシステム メモリ バッファーを割り当てません。 その場合、 GetPointer メソッドはE_NOTIMPLを返します。 代わりに、ダウンストリーム フィルターはサンプルの Direct3D サーフェスに直接アクセスすることが期待されます。 ダウンストリーム フィルターでサーフェスへのポインターを取得する方法は 2 つあります。どちらも同等です。

  • IMFGetService インターフェイスのサンプルに対してクエリを実行し、IDirect3DSurface9 インターフェイスの GetService を呼び出します。 サービス識別子がMR_BUFFER_SERVICE。
  • IMediaSample2Config インターフェイスのサンプルに対してクエリを実行し、IMediaSample2Config::GetSurface を呼び出します。

高度なキャプチャに関するトピック