ビデオ キャプチャとプレビューの組み合わせ
これまでの説明では、さまざまなファイル フォーマットにビデオをキャプチャする方法を取り上げた。「ビデオのプレビュー」では、ライブ プレビュー グラフを作成する方法を説明している。しかし、多くのアプリケーションでは両方を同時に行う必要がある。プレビューとファイル書き込みを組み合わせたグラフを作成するには、ICaptureGraphBuilder2::RenderStream を 2 回呼び出せばよい。
// プレビュー ストリームをビデオ レンダラにレンダリングする。
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
NULL, NULL);
// キャプチャ ストリームを Mux にレンダリングする。
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
NULL, pMux);
Capture Graph Builder により、このコードの次のような詳細部分は見えなくなっている。
キャプチャ フィルタにプレビュー ピンまたはビデオ ポート ピン、およびキャプチャ ピンがあると、次の図のように、RenderStream メソッドは両方のピンをレンダリングする。
フィルタにキャプチャ ピンしかない場合、Capture Graph Builder はスマート ティー フィルタを使ってキャプチャ ストリームを分割する。次の図は、スマート ティーがあるグラフを示す。
スマート ティー フィルタにはキャプチャ ピンとプレビュー ピンがある。キャプチャ フィルタから 1 つのビデオ ストリームを受け取り、キャプチャ用とプレビュー用の 2 つのストリームに分割する。キャプチャ ピンのスループットを維持するため、プレビュー ピンは必要に応じてフレームをドロップする。また、「DirectShow のビデオ キャプチャ フィルタ」で説明した理由により、各サンプルはタイム スタンプを取り去ってから送信する。
スマート ティーはストリームを分割するが、ビデオ データを物理的には複製しない。代わりに、バッファを共有するカスタム メディア サンプル オブジェクトを使う。ダウンストリーム フィルタがデータに書き込まないように、サンプルは "読み取り専用" とマークされる。