次の方法で共有


ビデオ キャプチャとプレビューの組み合わせ

[DirectShow このページに関連付けられている機能は、従来の機能です。 次のものに置き換えられました: MediaPlayerIMFMediaEngine、および Media Foundation でのオーディオ/ビデオキャプチャ 。 これらの機能は、Windows 10 および Windows 11 用に最適化されています。 新しいコードでは、可能な場合は、DirectShowではなく、Media Foundation 内で MediaPlayerIMFMediaEngine Audio/Video Capture を使用することを強くお勧めします。 従来の API を使用する既存のコードは、可能であれば新しい API を使用するように書き直すよう提案しています。

前のセクションでは、ビデオをさまざまなファイル形式にキャプチャする方法について説明します。 ビデオのプレビュー セクションでは、ライブ プレビュー グラフを作成する方法について説明します。 ただし、多くのアプリケーションでは、両方を一度に実行する必要があります。 プレビューとファイル書き込みのグラフを組み合わせて構築するには、ICaptureGraphBuilder2::RenderStreamを 2 回呼び出すだけです。

// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, 
    NULL, NULL);

// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap, 
    NULL, pMux);

このコードでは、Capture Graph Builder によっていくつかの詳細が非表示になっています。

  • キャプチャ フィルターにプレビュー ピンまたはビデオ ポートピンとキャプチャ ピンがある場合、次の図に示すように、RenderStream メソッドは単に両方のピンをレンダリングします。

    グラフ のキャプチャとプレビュー

  • フィルターにキャプチャ ピンしかない場合、キャプチャ グラフ ビルダーは Smart Tee フィルターを使用してキャプチャ ストリームを分割します。 次の図は、スマート ティーを含むグラフを示しています。

    スマート ティー フィルターを使用したグラフのキャプチャとプレビュー

Smart Tee フィルターには、キャプチャ ピンとプレビュー ピンがあります。 キャプチャ フィルターから 1 つのビデオ ストリームを取得し、キャプチャ用とプレビュー用の 2 つのストリームに分割します。 キャプチャ ピンのスループットを維持するために、プレビュー ピンは必要に応じてフレームをドロップします。 また、DirectShow ビデオ キャプチャ フィルター のトピックで説明されている理由から、各サンプルからタイム スタンプを配信する前に削除します。

スマートティーはストリームを分割しますが、ビデオデータを物理的に複製することはありません。 代わりに、バッファーを共有するカスタム メディア サンプル オブジェクトを使用します。 サンプルは、ダウンストリーム フィルターがデータに書き込まないよう、"読み取り専用" とマークされています。

キャプチャ グラフにプレビュー ウィンドウがある場合は、キャプチャ ストリームを含め、フィルター グラフ マネージャーによってグラフ全体が停止される可能性があります。

  • コンピューターのロック。
  • ドメインのメンバーであるコンピューターで Ctrl + Alt + DELETE キーを押します。
  • ゲームやスクリーン セーバーなどの全画面表示の Direct3D アプリケーションを実行する。
  • モニターの切り替えまたはディスプレイの解像度の変更。
  • Windows にユーザー アカウント制御 (UAC) ダイアログが表示されるプログラムを実行しています。 (Windows Vista 以降)。
  • 全画面表示の DOS ウィンドウを実行しています。

これらのイベントのいずれかがキャプチャ セッションを中断し、データが失われる可能性があります。 (内部的な動作を次に示します。ビデオ レンダラーは、必要な Direct3D または DirectDraw リソースを失います。これらのリソースを復旧するプロセスでは、ビデオ レンダラーがアップストリーム フィルターに再接続して、フィルター グラフ マネージャーがグラフを停止する必要があります)。

この問題に対して考えられる解決策は次の 2 つあります。

  • プレビュー ストリームは含めないでください。 ただし、ICaptureGraphBuilder2::RenderStream メソッドは、キャプチャ デバイスにビデオ ポート ピンがある場合にプレビュー ウィンドウを自動的に追加します。 ファイル キャプチャ ビデオ ポート ピンを参照してください。
  • ストリーム バッファー エンジンを使用して、別のプロセスでプレビュー ストリームをグラフに送信します。

ビデオをファイル にキャプチャする