Win32 API 日本語リファレンス
ホームMedia.DirectShow › ICaptureGraphBuilder2

ICaptureGraphBuilder2

COM
IID93e5a4e0-2d50-11d2-abfa-00a0c9c6e38d継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

ICaptureGraphBuilder2 インターフェースは、キャプチャグラフやその他のカスタムフィルタグラフを構築します。

メソッド 9

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT SetFiltergraph(IGraphBuilder* pfg)

SetFiltergraph メソッドは、キャプチャグラフビルダーが使用するフィルタグラフを指定します。

pfgIGraphBuilder*inフィルタグラフの IGraphBuilder インターフェースへのポインター。

戻り値

HRESULT 値を返します。指定可能な値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
E_UNEXPECTED
予期しないエラーです。

解説(Remarks)

このメソッドを呼び出さない場合、キャプチャグラフビルダーは必要になったときに自動的にフィルタグラフを作成します。キャプチャグラフビルダーがすでにフィルタグラフを保持している場合、このメソッドは E_UNEXPECTED を返します。

vtbl 4 HRESULT GetFiltergraph(IGraphBuilder** ppfg)

GetFiltergraph メソッドは、キャプチャグラフビルダーが使用しているフィルタグラフを取得します。

ppfgIGraphBuilder**outIGraphBuilder インターフェースポインターを受け取ります。

戻り値

次のいずれかの HRESULT 値を返します。

リターンコード 説明
S_OK
成功しました。
E_POINTER
NULL ポインター引数です。
E_UNEXPECTED
フィルタグラフがありません。

解説(Remarks)

初期状態では、キャプチャグラフビルダーはフィルタグラフへのポインターを保持していません。このメソッドは、次のいずれかのメソッドが呼び出されるまで E_UNEXPECTED を返します。

このメソッドは IGraphBuilder インターフェースの参照カウントをインクリメントします。使用が終わったら必ずインターフェースを解放してください。
vtbl 5 HRESULT SetOutputFileName(GUID* pType, LPWSTR lpstrFile, IBaseFilter** ppf, IFileSinkFilter** ppSink)

SetOutputFileName メソッドは、フィルタグラフのファイル書き込み部分を作成します。

pTypeGUID*in

出力のメディアサブタイプ、またはマルチプレクサフィルタもしくはファイルライターフィルタのクラス識別子 (CLSID) のいずれかを表す GUID へのポインター。メディアサブタイプを指定する場合は、次のいずれかである必要があります。

説明
MEDIASUBTYPE_Avi Audio-Video Interleaved (AVI)
MEDIASUBTYPE_Asf Advanced Systems Format (ASF)
lpstrFileLPWSTRin出力ファイル名を格納するワイド文字列へのポインター。
ppfIBaseFilter**outマルチプレクサの IBaseFilter インターフェースを受け取るポインターのアドレス。
ppSinkIFileSinkFilter**outoptionalファイルライターの IFileSinkFilter インターフェースを受け取るポインターのアドレス。NULL でもかまいません。

戻り値

HRESULT 値を返します。指定可能な値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_FAIL
失敗しました。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

このメソッドは、pType パラメーターの値に基づいてマルチプレクサフィルタを作成します。AVI の場合は AVI Mux Filter を作成します。ASF の場合は WM ASF Writer を作成します。それ以外の値の場合は、CLSID で識別されるフィルタを作成します。マルチプレクサをフィルタグラフに追加し、その IBaseFilter インターフェースへのポインターを ppf パラメーターで返します。

マルチプレクサが IFileSinkFilter インターフェースをサポートしている場合、このメソッドは IFileSinkFilter::SetFileName を呼び出し、lpwstrFile パラメーターで指定された値を使用して出力ファイル名を設定します。マルチプレクサが IFileSinkFilter インターフェースをサポートしていない場合、このメソッドは File Writer Filter をフィルタグラフに追加し、マルチプレクサをファイルライターに接続し、ファイルライターの IFileSinkFilter インターフェースを使用して SetFileName を呼び出します。pSink パラメーターが NULL でない場合、そこに IFileSinkFilter インターフェースへのポインターが格納されます。

ppf パラメーターで返されるマルチプレクサフィルタへのポインターは、ICaptureGraphBuilder2::RenderStream メソッドの pSink パラメーターとして使用できます。

カスタムのマルチプレクサフィルタの場合、入力ピンが接続される前に出力ピンでの接続をフィルタがサポートしていないと、このメソッドは失敗します。たとえば、SDK に含まれる WavDest Filter Sample にはこの制限があります。

メソッドが成功した場合、ppf パラメーターで返される IBaseFilter インターフェースには未解放の参照カウントが残ります。メソッドが成功し、かつ pSinkNULL でない場合、IFileSinkFilter インターフェースにも未解放の参照カウントが残ります。使用が終わったら必ず両方のインターフェースを解放してください。

vtbl 6 HRESULT FindInterface(GUID* pCategory, GUID* pType, IBaseFilter* pf, GUID* riid, void** ppint)

FindInterface メソッドは、指定されたフィルタを起点として、指定されたインターフェースをグラフ内で検索します。

pCategoryGUID*inoptional

検索条件を指定する GUID へのポインター。詳細については「解説」を参照してください。次の値を指定できます。

詳細については「解説」を参照してください。
pTypeGUID*inoptional出力ピンのメジャーメディアタイプを指定する GUID へのポインター、または NULL
pfIBaseFilter*inフィルタの IBaseFilter インターフェースへのポインター。メソッドはこのフィルタから検索を開始します。
riidGUID*in検索するインターフェースのインターフェース識別子 (IID)。
ppintvoid**outインターフェースポインターを受け取る変数のアドレス。インターフェースの使用が終わったら、取得したインターフェースポインターを必ず解放してください。

戻り値

HRESULT 値を返します。指定可能な値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
E_FAIL
失敗しました。
E_NOINTERFACE
そのようなインターフェースはサポートされていません。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

キャプチャグラフでは、さまざまなフィルタやピンが、圧縮パラメーター (IAMVideoCompression) やストリーム形式 (IAMStreamConfig) などのプロパティを設定するためのインターフェースを公開している場合があります。キャプチャデバイスによっては、アナログ信号を経路制御する IAMCrossbar や、TV チューナーデバイスを制御する IAMTVTuner など、他にも役立つインターフェースが含まれることがあります。このメソッドを使用すると、グラフを走査する特別なコードを記述することなくインターフェースを見つけられます。

重要 IVideoWindow インターフェースポインターを取得するためにこのメソッドを呼び出さないでください。このインターフェースは常にフィルタグラフマネージャーに問い合わせてください。そうしないと、フィルタグラフマネージャーが画面解像度の変更やその他のイベントに正しく応答しなくなります。
pCategory パラメーターが NULL の場合、このメソッドはグラフ全体から要求されたインターフェースを検索します。pf パラメーターで指定されたフィルタを起点として、グラフ内の次のオブジェクトに問い合わせます。 pCategory パラメーターと pType パラメーターを次のように設定することで、検索を制限できます。 さらに、pCategoryNULL 以外の場合、メソッドは pf で指定されたフィルタの上流に特定の Windows Driver Model (WDM) フィルタを追加することがあります。詳細については、このセクションの「Supporting Filters」の解説を参照してください。

ピンカテゴリは、キャプチャフィルタのピンインターフェースを見つけるのに役立ちます。たとえば、キャプチャフィルタにはキャプチャ用とプレビュー用の別々のピンがある場合があります。ピンカテゴリを指定する場合は、メソッドが正しいフィルタとピンを選択するように、メディアタイプも指定してください。

一部のビデオキャプチャフィルタには、プレビューピンの代わりにビデオポートピン (PIN_CATEGORY_VIDEOPORT) があります。PIN_CATEGORY_PREVIEW と MEDIATYPE_Video を指定すると、メソッドはビデオポートピンをプレビューピンとして扱います。アプリケーションでこの可能性を判定する必要はありません。

Supporting Filters。キャプチャデバイスが Windows Driver Model (WDM) ドライバーを使用している場合、グラフには WDM Video Capture フィルタの上流に、TV Tuner フィルタや Analog Video Crossbar フィルタなどの特定のフィルタが必要になる場合があります。pCategory パラメーターが NULL 以外の場合、このメソッドは必要な WDM フィルタをグラフに自動的に挿入します。そのために、キャプチャフィルタの入力ピンに問い合わせてサポートするミディアムを判定し、一致するフィルタに接続します。pCategory パラメーターが NULL の場合、メソッドは上流のフィルタを追加しません。

vtbl 7 HRESULT RenderStream(GUID* pCategory, GUID* pType, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer)

RenderStream メソッドは、ソースフィルタの出力ピンを、必要に応じて中間フィルタを経由してシンクフィルタに接続します。

pCategoryGUID*inoptional

Pin Property Set に列挙されているピンカテゴリのいずれかを指定する GUID へのポインター。カテゴリに関係なく任意のピンに一致させるには、このパラメーターを NULL に設定します。代表的な値は次のとおりです。

pTypeGUID*in出力ピンのメディアタイプを指定するメジャータイプ GUID へのポインター。メディアタイプに関係なく任意のピンを使用する場合は NULL を指定します。指定可能な値の一覧については、Major Types を参照してください。
pSourceIUnknown*in接続の起点となるフィルタ、または出力ピンへのポインターを指定します。
pfCompressorIBaseFilter*in圧縮フィルタなどの中間フィルタの IBaseFilter インターフェースへのポインター。NULL でもかまいません。
pfRendererIBaseFilter*inレンダラーやマルチプレクサ (mux) フィルタなどのシンクフィルタの IBaseFilter インターフェースへのポインター。値が NULL の場合、メソッドは既定のレンダラーを使用します (「解説」を参照)。

戻り値

HRESULT 値を返します。返される可能性のある値には次のものがあります。

リターンコード 説明
S_OK
成功しました。
VFW_S_NOPREVIEWPIN
プレビューは Smart Tee Filter を通じてレンダリングされました。
E_FAIL
失敗しました。
E_INVALIDARG
無効な引数です。
E_POINTER
NULL ポインター引数です。
VFW_E_NOT_IN_GRAPH
フィルタがフィルタグラフに存在しません。このエラーは、AddFilter を呼び出して pSourcepIntermediate、または pSink をグラフに追加しなかった場合に発生することがあります。また、SetFiltergraph を呼び出してグラフを Capture Graph Builder に接続しなかった場合にも発生することがあります。この場合、Capture Graph Builder オブジェクトは独自のフィルタグラフを自動的に作成します。About the Capture Graph Builder を参照してください。

解説(Remarks)

このメソッドは、2 つ以上のフィルタをチェーン状に接続することでストリームをレンダリングします。

メソッドは pSourcepIntermediate に接続し、次に pIntermediatepSink に接続します。pIntermediateNULL の場合、メソッドは単に pSourcepSink に接続します。pSourcepIntermediatepSink で指定されるすべてのフィルタは、メソッドを呼び出す前にグラフに追加しておく必要があります。メソッドは Intelligent Connect を使用するため、デコーダーなどの追加フィルタがグラフに追加されることがあります。

pSink パラメーターが NULL の場合、メソッドは既定のレンダラーを使用しようとします。ビデオの場合は Video Renderer を、オーディオの場合は DirectSound Renderer を使用します。

pSource がフィルタの場合、メソッドはそのフィルタ上の出力ピンを検索します。その場合は、pCategory パラメーターと pType パラメーターを使用して検索を絞り込みます。たとえば、フィルタにプレビュー用とキャプチャ用の別々のピンがある場合は、PIN_CATEGORY_CAPTURE または PIN_CATEGORY_PREVIEW のいずれかを指定できます。pSource が出力ピンの場合は、pCategorypTypeNULL に設定します。

いずれの場合も、メソッドは未接続のピンを検索します。指定された条件を満たすピンが複数ある場合、メソッドは最初に見つかったピンを使用します。

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

RenderStream メソッドは、キャプチャグラフに必要な詳細の多くを処理します。

Smart Tee。一部のキャプチャフィルタにはキャプチャピンはあってもプレビューピンがありません。プレビューを行うには、キャプチャピンを Smart Tee Filter に接続する必要があります。このフィルタはデータをキャプチャストリームとプレビューストリームの 2 つのストリームに分割します。PIN_CATEGORY_PREVIEW または PIN_CATEGORY_CAPTURE を指定すると、必要に応じてメソッドが Smart Tee フィルタを挿入します。その後、Smart Tee フィルタ上で指定されたストリームをレンダリングします。プレビューストリームをレンダリングし、メソッドが Smart Tee フィルタを使用した場合は、VFW_S_NOPREVIEWPIN を返します。

Closed Captioning。このメソッドを使用して、クローズドキャプションをキャプチャまたはプレビューできます。キャプチャフィルタには、垂直帰線期間 (VBI) データを提供するものと、クローズドキャプションデータを提供するものがあります。どちらの場合にも対応するには、PIN_CATEGORY_VBI を使用する場合と PIN_CATEGORY_CC を使用する場合の 2 回メソッドを呼び出します。メソッドは、VBI データをクローズドキャプションに変換するのに必要なフィルタを挿入します。データをプレビューするには、pSink パラメーターを NULL に設定します。データをファイルにキャプチャするには、マルチプレクサフィルタの IBaseFilter インターフェースポインターを使用します。同じグラフでデータのキャプチャとプレビューの両方を行うことができます。NULL を使用して 1 回、マルチプレクサを使用してもう 1 回メソッドを呼び出します。pIntermediate パラメーターは NULL に設定します。

Video Port Pins。ビデオポート拡張 (VPE) ビデオキャプチャハードウェアで動作するフィルタには、プレビューピンの代わりにビデオポートピン (PIN_CATEGORY_VIDEOPORT) がある場合があります。プレビューまたはキャプチャを機能させるには、ビデオポートピンを Overlay Mixer Filter に接続する必要があります。メソッドはこの詳細を処理します。PIN_CATEGORY_VIDEOPORT を指定する必要はありません。PIN_CATEGORY_PREVIEW または PIN_CATEGORY_CAPTURE を指定すれば、メソッドがピンを正しく接続します。同様に、一部のフィルタはビデオポートピン (PIN_CATEGORY_VIDEOPORT_VBI) を使用して VBI データを提供します。PIN_CATEGORY_VIDEOPORT の場合と同様に、メソッドはこの詳細を処理します。PIN_CATEGORY_VIDEOPORT_VBI を指定する必要はありません。

Supporting Filters。キャプチャデバイスが Windows Driver Model (WDM) ドライバーを使用している場合、グラフには WDM Video Capture Filter の上流に、TV Tuner FilterAnalog Video Crossbar Filter などの特定のフィルタが必要になる場合があります。このメソッドがストリームのレンダリングに成功すると、グラフに必要な WDM フィルタも挿入されます。メソッドは、キャプチャフィルタの入力ピンに問い合わせてサポートするミディアムを判定し、一致するフィルタに接続します。

サンプルコード

一般的なキャプチャグラフでは、中間フィルタなしでプレビューピンを既定のレンダラーに接続します。
C++
// Video: 
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, 
    pCaptureFilter, NULL, NULL); 
// Audio:
pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Audio, 
    pCaptureFilter, NULL, NULL); 
出力するファイルの種類に応じて、キャプチャピンをマルチプレクサ (mux) フィルタまたはファイルライターフィルタに接続します。AVI ファイルの場合は AVI Mux フィルタを使用します。ASF ファイルの場合は WM ASF Writer フィルタを使用します。通常、このフィルタへのポインターは ICaptureGraphBuilder2::SetOutputFileName メソッドの ppf パラメーターから取得します。
C++
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"C:\\Example.avi", 
    &ppf, &pSink);
pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
    pCaptureFilter, NULL, ppf);

ファイルソース

このメソッドを使用して、ファイルのトランスコードや再圧縮を行うことができます。以下の説明では、ファイルに含まれるビデオストリームとオーディオストリームがそれぞれ最大 1 つ、あるいは単一のインターリーブストリームであることを前提としています。そうでない場合、メソッドは正しく動作しません。

ファイルソースには出力ピンが 1 つあるため、pCategorypTypeNULL に設定します。メソッドを 2 回呼び出します。1 回はビデオストリームをレンダリングするため、もう 1 回はオーディオストリームをレンダリングするためです。最初の呼び出しでは、ソースフィルタをパーサーフィルタに接続し、パーサーフィルタの出力ピンの 1 つをレンダリングします。2 回目の呼び出しでは、パーサーの残りの出力ピンをレンダリングします。一方のストリームだけを圧縮する場合は、必ず最初の呼び出しで圧縮フィルタを指定してください。メソッドは圧縮の種類に基づいて正しいストリームを自動的に選択します。

C++
pBuilder->RenderStream(NULL, NULL, pSrc, pCompressor, pMux);
pBuilder->RenderStream(NULL, NULL, pSrc, NULL, pMux);
完全な例については、Recompressing an AVI File を参照してください。
vtbl 8 HRESULT ControlStream(GUID* pCategory, GUID* pType, IBaseFilter* pFilter, LONGLONG* pstart, LONGLONG* pstop, WORD wStartCookie, WORD wStopCookie)

ControlStream メソッドは、キャプチャされたデータの 1 つ以上のストリームに対して開始時刻と停止時刻を設定します。

pCategoryGUID*inPin Property Set に列挙されているピンカテゴリのいずれかを指定する GUID へのポインター。このパラメーターの値を NULL にすることはできません。
pTypeGUID*inメディアタイプを指定するメジャータイプ GUID へのポインター、または NULL。このパラメーターが NULL の場合は、pFilter パラメーターも NULL に設定してください。そうしないと、誤ったピンを制御して予期しない結果になる可能性があります。
pFilterIBaseFilter*in制御対象のフィルタを指定する IBaseFilter インターフェースへのポインター。グラフ内のすべてのキャプチャフィルタを制御するには、このパラメーターを NULL に設定します。
pstartLONGLONG*inoptional開始時刻を格納する変数へのポインター。値が MAXLONGLONG (0x7FFFFFFFFFFFFFFF) の場合、メソッドは以前の開始要求をキャンセルします。値が NULL の場合、グラフの実行時にピンは直ちに開始します。
pstopLONGLONG*inoptional停止時刻を格納する変数へのポインター。値が MAXLONGLONG の場合、メソッドは以前の停止要求をすべてキャンセルします。値が NULL の場合、ピンは直ちに停止します。
wStartCookieWORDinEC_STREAM_CONTROL_STARTED イベント通知の 2 番目のパラメーターとして送信される値。詳細については「解説」を参照してください。
wStopCookieWORDinEC_STREAM_CONTROL_STOPPED イベント通知の 2 番目のパラメーターとして送信される値。詳細については「解説」を参照してください。

戻り値

HRESULT 値を返します。指定可能な値には次のものがあります。

リターンコード 説明
S_FALSE
少なくとも 1 つの下流レンダラーが停止通知を送信しません。
S_OK
成功しました。
E_FAIL
一致するピンが見つからなかったか、ピンがストリーム制御をサポートしていませんでした。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

このメソッドは、メソッド呼び出しで指定した検索条件を使用して、キャプチャフィルタの出力ピンを特定します。次に、それらのピンに対して IAMStreamControl のメソッドを呼び出します。このメソッドにより、アプリケーションはグラフ内のフィルタやピンを列挙することなくストリームを制御できます。

フレーム単位で正確なキャプチャを行う場合や、キャプチャとプレビューを個別に制御する場合にこのメソッドを使用します。たとえば、ディスクへのキャプチャを停止しつつ、ビデオプレビューは実行したままにできます。

最初の 3 つのパラメーターで、制御対象のピンを指定します。キャプチャグラフには複数のキャプチャフィルタが存在する場合があります。たとえば、ビデオ、オーディオ、クローズドキャプションデータ用のフィルタを持つことがあります。また、キャプチャフィルタは複数の出力ピンを持つことがあります。一部のキャプチャフィルタには、プレビュー用とキャプチャ用の別々のピン、またはビデオのみのデータ用とオーディオビデオインターリーブデータ用の別々のピンがあります。たとえば、ビデオプレビューを制御するには、pCategoryPIN_CATEGORY_PREVIEWpType に MEDIATYPE_Video を指定します。

注意

ピンカテゴリが PIN_CATEGORY_PREVIEW の場合、プレビューピンが配信するサンプルにはタイムスタンプがないため、具体的な開始時刻と停止時刻を設定できません (Time Stamps を参照)。代わりに、値 NULLMAXLONGLONG を使用して、目的の時刻にピンを開始および停止してください。

また、デバイスがビデオポートピンを使用している場合、プレビューではこのメソッドはサポートされません。その場合、デバイスはプレビューサンプルをハードウェア経由で直接配信しているためです。

ピンを制御するために、このメソッドは IAMStreamControl::StartAt メソッドと IAMStreamControl::StopAt メソッドを呼び出します。各ピンは、開始時に EC_STREAM_CONTROL_STARTED イベント通知を送信します。このイベント通知の 2 番目のパラメーターは、wStartCookie で指定された値です。ピンが停止すると、EC_STREAM_CONTROL_STOPPED イベント通知を送信します。そのイベント通知の 2 番目のパラメーターは、wStopCookie で指定された値です。

このメソッドは一致するピンを見つけると、IAMStreamControl をサポートする別のフィルタ (通常はマルチプレクサ) を下流方向に検索します。見つかった場合は、そのフィルタにも開始時刻と停止時刻を設定します。これにより、キャプチャフィルタ用と下流フィルタ用の 2 組の停止通知が生成されます。wStopCookie パラメーターを使用するのは、下流フィルタからの停止通知だけです。このイベントを待機することで、下流フィルタが最後のサンプルを確実に受け取ることが保証されます。

下流フィルタが IAMStreamControl をサポートしていない場合、メソッドは S_FALSE を返します。その場合、最後のサンプルがレンダリングされる前に停止通知を受け取ることがあります。

MAXLONGLONG は、指定可能な最大の REFERENCE_TIME 値です。DirectShow の基底クラスライブラリでは、定数 MAX_TIME としても定義されています。

vtbl 9 HRESULT AllocCapFile(LPWSTR lpstr, ULONGLONG dwlSize)

AllocCapFile メソッドは、キャプチャファイルを指定したサイズに事前割り当てします。最良の結果を得るには、常にキャプチャデータのサイズより大きく、断片化されていない事前割り当て済みのキャプチャファイルにキャプチャしてください。

lpstrLPWSTRin作成またはサイズ変更するファイルの名前を格納するワイド文字列へのポインター。
dwlSizeULONGLONGin割り当てるファイルのサイズ (バイト単位)。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

ファイルが読み取り専用の場合、このメソッドは失敗します。

可能な限り多くの領域を割り当てることが最適です。理想的には必要以上に割り当てます。ただし、その結果、比較的少ないデータしか含まないきわめて大きなファイルになることがあります。たとえば、1 ギガバイト (GB) のキャプチャファイルに、キャプチャされたビデオが数メガバイトしか含まれていないこともあります。データを新しいファイルにコピーするには、ICaptureGraphBuilder2::CopyCaptureFile メソッドを使用します。このメソッドはデータのみをコピーし、元のファイルの空の部分は無視します。

このメソッドを使用してファイルを事前割り当てする場合は、ファイルライターフィルタに対して値 0 を指定して IFileSinkFilter2::SetMode を呼び出します。フィルタが AM_FILE_OVERWRITE に設定されていると、事前割り当てされたファイルが削除されます。一部のファイルライターフィルタはモード 0 をサポートしていないことに注意してください。

vtbl 10 HRESULT CopyCaptureFile(LPWSTR lpwstrOld, LPWSTR lpwstrNew, INT fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback)

CopyCaptureFile メソッドは、キャプチャファイルから有効なメディアデータをコピーします。

lpwstrOldLPWSTRinコピー元のファイル名を格納するワイド文字列へのポインター。
lpwstrNewLPWSTRinコピー先のファイル名を格納するワイド文字列へのポインター。有効なデータがこのファイルにコピーされます。
fAllowEscAbortINTinESC キーを押すとコピー操作をキャンセルするかどうかを指定するブール値。値が TRUE で、ユーザーが ESC キーを押すと、操作が停止します。値が FALSE の場合、メソッドは ESC キーを無視します。
pCallbackIAMCopyCaptureFileProgress*in進捗情報を表示するための IAMCopyCaptureFileProgress インターフェースへのポインター、または NULL。詳細については「解説」を参照してください。

戻り値

HRESULT 値を返します。指定可能な値には次のものがあります。

リターンコード 説明
S_FALSE
操作が完了する前にユーザーがキャンセルしました。
S_OK
成功しました。
E_FAIL
失敗しました。
E_INVALIDARG
コピー元ファイルまたはコピー先ファイルを開けませんでした。
E_OUTOFMEMORY
メモリが不足しています。
E_POINTER
NULL ポインター引数です。

解説(Remarks)

通常、最初に大きな事前割り当て済みのファイルにキャプチャします。このメソッドは有効なデータだけを新しいファイルにコピーします。その結果、新しいファイルは元のファイルよりもはるかに小さくなります。

コピー元ファイルとコピー先ファイルは AVI ファイルである必要があります。その他のファイル形式はサポートされていません。

コピー操作の進捗を表示するには、IAMCopyCaptureFileProgress インターフェースを実装し、そのインターフェースへのポインターを pCallback パラメーターで渡します。pCallbackNULL 以外の場合、このメソッドは完了率を示す 0 から 100 までの整数を引数として、IAMCopyCaptureFileProgress::Progress メソッドを定期的に呼び出します。

vtbl 11 HRESULT FindPin(IUnknown* pSource, PIN_DIRECTION pindir, GUID* pCategory, GUID* pType, BOOL fUnconnected, INT num, IPin** ppPin)

FindPin メソッドは、フィルタ上の特定のピンを取得するか、指定されたピンが指定された条件に一致するかどうかを判定します。

pSourceIUnknown*inフィルタ上のインターフェース、またはピン上のインターフェースへのポインター。
pindirPIN_DIRECTIONinピンの方向 (入力または出力) を指定する PIN_DIRECTION 列挙体のメンバー。
pCategoryGUID*inoptionalPin Property Set に列挙されているピンカテゴリのいずれかを指定する GUID へのポインター。カテゴリに関係なく任意のピンに一致させるには、このパラメーターを NULL に設定します。
pTypeGUID*inoptionalメディアタイプを指定するメジャータイプ GUID へのポインター。任意のメディアタイプに一致させるには NULL を使用します。
fUnconnectedBOOLinピンが未接続である必要があるかどうかを指定するブール値。TRUE の場合、ピンは未接続である必要があります。FALSE の場合、ピンは接続済みでも未接続でもかまいません。
numINTin一致するピンの集合の中から取得するピンの、0 から始まるインデックス。pSource がフィルタへのポインターで、検索条件に一致するピンが複数ある場合、このパラメーターでどのピンを取得するかを指定します。pSource がピンへのポインターの場合、このパラメーターは無視されます。
ppPinIPin**out一致するピンの IPin インターフェースを受け取るポインターのアドレス。

戻り値

一致するピンが見つかった場合は S_OK を返し、それ以外の場合は E_FAIL を返します。

解説(Remarks)

pSource がフィルタへのポインターの場合、メソッドはそのフィルタ上で検索条件に一致する n 番目のピンを検索します。ここで nnum パラメーターで指定されます。メソッドが一致するピンを見つけると、そのピンへのポインターを ppPin パラメーターで返します。

pSource がピンへのポインターの場合、メソッドはそのピンを検索条件に照らして検証します。ピンが条件に一致する場合、メソッドは S_OK を返し、そのピンの IPin インターフェースへのポインターを ppPin パラメーターで返します。それ以外の場合は E_FAIL を返します。

いずれの場合も、メソッドが成功すると、ppPin パラメーターで返される IPin インターフェースには未解放の参照カウントが残ります。使用が終わったら必ずインターフェースを解放してください。

通常、アプリケーションでこのメソッドを使用する必要はありません。これは、ICaptureGraphBuilder2::RenderStream メソッドではフィルタグラフを構築できないような、非常に複雑なタスクのために提供されています。このメソッドを使用してキャプチャフィルタから目的のピンを取得し、その後グラフの残りの部分を手動で構築します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ICaptureGraphBuilder2 "{93E5A4E0-2D50-11D2-ABFA-00A0C9C6E38D}"
#usecom global ICaptureGraphBuilder2 IID_ICaptureGraphBuilder2 "{}"
#comfunc global ICaptureGraphBuilder2_SetFiltergraph     3 sptr
#comfunc global ICaptureGraphBuilder2_GetFiltergraph     4 sptr
#comfunc global ICaptureGraphBuilder2_SetOutputFileName  5 var,wstr,sptr,sptr
#comfunc global ICaptureGraphBuilder2_FindInterface      6 var,var,sptr,var,sptr
#comfunc global ICaptureGraphBuilder2_RenderStream       7 var,var,sptr,sptr,sptr
#comfunc global ICaptureGraphBuilder2_ControlStream      8 var,var,sptr,var,var,int,int
#comfunc global ICaptureGraphBuilder2_AllocCapFile       9 wstr,int64
#comfunc global ICaptureGraphBuilder2_CopyCaptureFile    10 wstr,wstr,int,sptr
#comfunc global ICaptureGraphBuilder2_FindPin            11 sptr,int,var,var,int,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。