ICaptureGraphBuilder2::RenderStream

RenderStream メソッドは、ソース フィルタの出力ピンを、オプションで中間フィルタを経由して、シンク フィルタに接続する。

構文

  HRESULT RenderStream(
  const GUID *pCategory,
  const GUID *pType,
  IUnknown *pSource,
  IBaseFilter *pIntermediate,
  IBaseFilter *pSink
);

パラメータ

pCategory

[in] ピン カテゴリを指定する、ピン プロパティ セットAMPROPERTY_PIN_CATEGORY 構造体のメンバへのポインタ。または、カテゴリに関係なく、任意のピンを使う場合は NULL を指定する。通常は、次の値を指定する。

  • PIN_CATEGORY_CAPTURE
  • PIN_CATEGORY_PREVIEW
  • PIN_CATEGORY_CC

pType

[in] 出力ピンのメディア タイプを指定するメジャー タイプ GUID へのポインタ。メディア タイプに関係なく、任意のピンを使う場合は NULL を指定する。指定できる値の一覧については、「メジャー タイプ」を参照すること。

pSource

[in] 接続の先頭フィルタへのポインタか、または出力ピンへのポインタを指定する。

pIntermediate

[in] 圧縮フィルタなど中間フィルタの IBaseFilter インターフェイスへのポインタ。NULL も可。

pSink

[in] レンダラや Mux フィルタなど、シンク フィルタの IBaseFilter インターフェイスへのポインタ。値が NULL の場合、メソッドはデフォルトのレンダラ (「注意」を参照) を使う。

戻り値

HRESULT 値を返す。可能な戻り値は次のとおりである。

戻りコード 説明
S_OK 成功。
VFW_S_NOPREVIEWPIN スマート ティー フィルタを経由してプレビューがレンダリングされた。
E_FAIL 失敗。
E_INVALIDARG 無効な引数。
E_POINTER NULL ポインタ引数。
VFW_E_NOT_IN_GRAPH フィルタがフィルタ グラフに含まれていない。AddFilter を呼び出して、グラフに pSourcepIntermediate、または pSink を追加していないと、このエラーが起きる。SetFiltergraph を呼び出してグラフを Capture Graph Builder に接続していなかった場合も、このエラーは起きる。この場合、Capture Graph Builder オブジェクトは独自のフィルタ グラフを自動的に作成する。「Capture Graph Builder について」を参照すること。

注意

このメソッドは、チェーンの複数のフィルタを接続して、ストリームをレンダリングする。

  • pSource 引数では、チェーン先頭 (フィルタまたは出力ピン)を指定する。
  • pIntermediate 引数では、中間フィルタ (通常は圧縮フィルタ) を指定する。NULL も可。
  • pSink 引数では、チェーン終端フィルタを指定する。通常、このフィルタはプレビュー用のレンダラか、ファイル キャプチャ用の Mux である。

メソッドは、pSourcepIntermediate に接続し、次に pIntermediatepSink に接続する。pIntermediate が NULL の場合、メソッドは pSource を単に pSink に接続する。pSourcepIntermediatepSink で指定されるフィルタはすべて、必ずメソッドを呼び出す前にグラフに追加しておく必要がある。メソッドは、インテリジェント接続を使っているので、デコーダなどの追加フィルタが追加される場合がある。

pSink 引数が NULL の場合、メソッドはデフォルト レンダラを使おうとする。ビデオの場合はビデオ レンダラを使い、オーディオの場合は DirectSound レンダラを使う。

pSource がフィルタの場合、メソッドはそのフィルタの出力ピンを検索する。その場合、pCategory 引数と pType 引数を使って検索を絞り込むこと。たとえば、フィルタがプレビュー用とキャプチャ用にそれぞれ独立したピンを持っている場合は、PIN_CATEGORY_CAPTURE または PIN_CATEGORY_PREVIEW のいずれかを指定できる。pSource が出力ピンの場合は、pCategory および pType を NULL に設定する。

すべての場合において、メソッドは接続されていないピンを検索する。複数のピンが指定された条件に適合する場合、メソッドは最初に見つけたピンを使う。

DV キャプチャで、メディア タイプが MEDIATYPE_Interleaved で pSink 引数が NULL の場合、メソッドはインターリーブされたストリームをオーディオ ストリームとビデオ ストリームに分割し、それらのストリームを両方ともレンダリングする点に注意すること。

RenderStream メソッドは、次のようなキャプチャ グラフに必要な細かい処理の大半を実行する。

**スマート ティー。**一部のキャプチャ フィルタにはキャプチャ ピンはあるが、プレビュー ピンがない。プレビューを行うには、キャプチャ ピンがスマート ティー フィルタに接続されている必要がある。このフィルタは、データをキャプチャ ストリームとプレビュー ストリームの 2 つのストリームに分割する。PIN_CATEGORY_PREVIEW または PIN_CATEGORY_CAPTURE を指定すると、必要に応じて、メソッドがスマート ティー フィルタを挿入する。次に、メソッドは、スマート ティー フィルタ上で指定されたストリームをレンダリングする。プレビュー ストリームをレンダリングするときにメソッドがスマート ティー フィルタを使う場合、メソッドは VFW_S_NOPREVIEWPIN を返す。

**クローズド キャプション。**このメソッドを使ってクローズド キャプションのキャプチャまたはプレビューを行うことができる。一部のキャプチャ フィルタは垂直同期間隔 (VBI) データを出力し、別のキャプチャ フィルタはクローズド キャプション データを出力する。いずれの場合も、1 回は PIN_CATEGORY_VBI を使って、もう 1 回は PIN_CATEGORY_CC を使って、メソッドを 2 回呼び出す。メソッドは、VBI データをクローズド キャプションに変換するのに必要なすべてのフィルタを挿入する。データのプレビューを行うには、pSink 引数を NULL に設定する。データをファイルにキャプチャするには、マルチプレクサ フィルタの IBaseFilter インターフェイス ポインタを使う。同じグラフでデータのキャプチャとプレビューを行うことができる。1 回目は NULL を使い、2 回目はマルチプレクサを使ってメソッドを呼び出す。pIntermediate 引数を NULL に設定する。

**ビデオ ポート ピン。**ビデオ ポート エクステンション (VPE) ビデオ キャプチャ ハードウェアを使うフィルタは、プレビュー ピンの代わりにビデオ ポート ピン (PIN_CATEGORY_VIDEOPORT) を備えている。プレビューやキャプチャを機能させるには、ビデオ ポート ピンがオーバーレイ ミキサ フィルタに接続されている必要がある。細部はメソッドが処理する。PIN_CATEGORY_VIDEOPORT を指定する必要はない。PIN_CATEGORY_PREVIEW または PIN_CATEGORY_CAPTURE を指定すれば、メソッドがピンを正しく接続する。これと同様に、一部のフィルタは、ビデオ ポート ピン (PIN_CATEGORY_VIDEOPORT_VBI) を使って VBI データを出力する。PIN_CATEGORY_VIDEOPORT の場合と同様に、メソッドが細部を処理する。PIN_CATEGORY_VIDEOPORT_VBI を指定する必要はない。

**サポートするフィルタ。**キャプチャ デバイスが Windows Driver Model (WDM) ドライバを使う場合、グラフは、TV チューナー フィルタアナログ ビデオ クロスバー フィルタ など、WDM ビデオ キャプチャ フィルタのアップストリームにある特定のフィルタを必要とすることがある。このメソッドがストリームを正しくレンダリングすれば、メソッドは、必要になるすべての WDM フィルタをグラフに挿入する。メソッドは、キャプチャ フィルタの入力ピンに問い合わせて、入力ピンがサポートするメディアを判別し、それらのメディアを適合するフィルタに接続する。

サンプル コード

一般的なキャプチャ グラフの場合、中間フィルタを経由しないで、プレビュー ピンをデフォルト レンダラに接続する。

// ビデオ :
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// オーディオ :
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 

出力先のファイル タイプに応じて、キャプチャ ピンを Mux フィルタまたはファイル ライタ フィルタに接続する。AVI ファイルの場合は、AVI Mux フィルタを使う。ASF ファイルの場合は、WM ASF ライタ フィルタを使う。通常、このフィルタへのポインタは、ICaptureGraphBuilder2::SetOutputFileName メソッドの ppf 引数から取得する。

pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

他の使用例については、「ビデオ キャプチャ」を参照すること。

**ファイル ソース。**このメソッドはファイルのトランスコードや再圧縮に使える。以下の説明では、ファイルには最大でも 1 つのビデオ ストリームと 1 つのオーディオ ストリームまたは 1 つのインターリーブ ストリームが含まれているものとする。それ以外の条件では、メソッドは正しく機能しない。

ファイル ソースの出力ピンは 1 つなので、pCategorypType を NULL に設定する。1 回はビデオ ストリームをレンダリングするために、もう 1 回はオーディオ ストリームをレンダリングするために、計 2 回メソッドを呼び出す。最初の呼び出しでは、ソース フィルタがパーサー フィルタに接続され、パーサー フィルタの出力ピンの中の 1 つがレンダリングされる。2 回目の呼び出しでは、パーサーの残りの出力ピンがレンダリングされる。1 つのストリームを圧縮し、もう 1 つのストリームを圧縮しない場合は、必ず最初の呼び出しでコンプレッサ フィルタを指定すること。メソッドは、圧縮タイプに基づいて自動的に正しいストリームを選択する。

pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);

詳しい使用例については、「AVI ファイルの再圧縮」を参照すること。

参照