ビデオ キャプチャとプレビューの組み合わせ
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の 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 を使用したグラフを示しています。
Smart Tee フィルターには、キャプチャ ピンとプレビュー ピンがあります。 キャプチャ フィルターから 1 つのビデオ ストリームを取得し、キャプチャ用とプレビュー用の 2 つのストリームに分割します。 キャプチャ ピンのスループットを維持するために、プレビュー ピンは必要に応じてフレームをドロップします。 また、 DirectShow ビデオ キャプチャ フィルターに関するトピックで説明されている理由から、各サンプルからタイム スタンプを配信する前に削除します。
スマートティーはストリームを分割しますが、ビデオデータを物理的に複製することはありません。 代わりに、バッファーを共有するカスタム メディア サンプル オブジェクトを使用します。 サンプルは、ダウンストリーム フィルターがデータに書き込みないことを確認するために、"読み取り専用" とマークされます。
キャプチャ グラフにプレビュー ウィンドウがある場合は、フィルター グラフ マネージャーによって、キャプチャ ストリームを含むグラフ全体が停止する可能性があります。
- コンピューターをロックしています。
- ドメインのメンバーであるコンピューターで Ctrl + Alt + Delete キーを押します。
- ゲームやスクリーン セーバーなどの全画面表示の Direct3D アプリケーションを実行する。
- モニターの切り替えまたはディスプレイ解像度の変更。
- Windows でユーザー アカウント制御 (UAC) ダイアログが表示されるプログラムを実行しています。 (Windows Vista 以降)。
- 全画面表示の DOS ウィンドウを実行しています。
これらのイベントのいずれかがキャプチャ セッションを中断し、データが失われる可能性があります。 (内部的に起こることを次に示します。ビデオ レンダラーでは、必要な Direct3D または DirectDraw リソースが失われます。これらのリソースを回復するプロセスでは、ビデオ レンダラーがアップストリーム フィルターと再接続し、フィルター グラフ マネージャーによってグラフが停止する必要があります)。
この問題に対して考えられる解決策は次の 2 つあります。
- プレビュー ストリームは含めないでください。 ただし、キャプチャ デバイスにビデオ ポート ピンがある場合、 ICaptureGraphBuilder2::RenderStream メソッドはプレビュー ウィンドウを自動的に追加します。 「ファイル キャプチャのビデオ ポート ピン」を参照してください。
- ストリーム バッファー エンジンを使用して、別のプロセスでグラフにプレビュー ストリームを送信します。
関連トピック