次の方法で共有


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

これまでの説明では、さまざまなファイル フォーマットにビデオをキャプチャする方法を取り上げた。「ビデオのプレビュー」では、ライブ プレビュー グラフを作成する方法を説明している。しかし、多くのアプリケーションでは両方を同時に行う必要がある。プレビューとファイル書き込みを組み合わせたグラフを作成するには、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 のビデオ キャプチャ フィルタ」で説明した理由により、各サンプルはタイム スタンプを取り去ってから送信する。

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