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

IMFCaptureSink

COM
IID72d6135b-35e9-412c-b926-fd5265f2a885継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

キャプチャシンクを制御します。キャプチャシンクは、キャプチャデバイスから 1 つ以上のストリームを受け取るオブジェクトです。

解説(Remarks)

キャプチャエンジンは、次のキャプチャシンクを作成します。

キャプチャシンクへのポインターを取得するには、IMFCaptureEngine::GetSink を呼び出します。各キャプチャシンクは、IMFCaptureSink から派生したインターフェイスを実装します。派生インターフェイスへのポインターを取得するには、QueryInterface を呼び出します。
シンク インターフェイス
フォトシンク IMFCapturePhotoSink
プレビューシンク IMFCapturePreviewSink
録画シンク IMFCaptureRecordSink

アプリケーションがキャプチャシンクを直接作成することはできません。

画像ストリームのネイティブメディアタイプが JPEG に設定されている場合、フォトシンクはネイティブソース形式と同一の形式で構成する必要があります。JPEG ネイティブタイプはパススルーのみです。

画像ストリームのネイティブタイプが JPEG に設定されている場合、エフェクトを追加するには、画像ストリームのネイティブタイプを非圧縮のビデオメディアタイプ(NV12 や RGB32 など)に変更してからエフェクトを追加します。

録画ストリームのネイティブタイプが H.264 の場合、録画シンクは同じメディアタイプで構成する必要があります。H.264 ネイティブタイプはパススルーのみであり、デコードできません。

H.264 を公開する録画ストリームは、他のタイプを一切公開しません。H.264 の録画ストリームはエフェクトと併用できません。エフェクトを追加するには、代わりに AddStream を使用してプレビューストリームを録画シンクに接続します。

メソッド 5

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

vtbl 3 HRESULT GetOutputMediaType(DWORD dwSinkStreamIndex, IMFMediaType** ppMediaType)

このキャプチャシンク上のストリームの出力形式を取得します。

dwSinkStreamIndexDWORDinクエリするストリームの 0 から始まるインデックス。このインデックスは、IMFCaptureSink::AddStream メソッドの pdwSinkStreamIndex パラメーターで返されます。
ppMediaTypeIMFMediaType**outoptionalIMFMediaType インターフェイスへのポインターを受け取ります。呼び出し元はこのポインターを解放する必要があります。

戻り値

このメソッドは、次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDSTREAMNUMBER
dwSinkStreamIndex パラメーターが無効です。
vtbl 4 HRESULT GetService(DWORD dwSinkStreamIndex, GUID* rguidService, GUID* riid, IUnknown** ppUnknown)

基になる Sink Writer オブジェクトに対してインターフェイスをクエリします。

dwSinkStreamIndexDWORDinクエリするストリームの 0 から始まるインデックス。このインデックスは、IMFCaptureSink::AddStream メソッドの pdwSinkStreamIndex パラメーターで返されます。
rguidServiceGUID*inサービス識別子 GUID。現在、この値は GUID_NULL でなければなりません。
riidGUID*inサービス識別子 GUID。現在、この値は IID_IMFSinkWriter でなければなりません。
ppUnknownIUnknown**outoptionalIUnknown インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは、次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
E_INVALIDARG
引数が無効です。
MF_E_INVALIDREQUEST
無効な要求です。
MF_E_INVALIDSTREAMNUMBER
ストリーム番号が無効です。
vtbl 5 HRESULT AddStream(DWORD dwSourceStreamIndex, IMFMediaType* pMediaType, IMFAttributes* pAttributes, DWORD* pdwSinkStreamIndex)

キャプチャソースからのストリームを、このキャプチャシンクに接続します。

dwSourceStreamIndexDWORDin

接続するソースストリーム。値は次のいずれかを指定できます。

意味
0–0xFFFFFFFB
ストリームの 0 から始まるインデックス。ストリーム数を取得するには、IMFCaptureSource::GetDeviceStreamCount を呼び出します。
MF_CAPTURE_ENGINE_FIRST_SOURCE_PHOTO_STREAM
0xFFFFFFFB
最初の画像ストリーム。
MF_CAPTURE_ENGINE_FIRST_SOURCE_VIDEO_STREAM
0xFFFFFFFC
最初のビデオストリーム。
MF_CAPTURE_ENGINE_FIRST_SOURCE_AUDIO_STREAM
0xFFFFFFFD
最初のオーディオストリーム。
pMediaTypeIMFMediaType*in

出力ストリームの目的の形式を指定する IMFMediaType ポインター。形式の詳細はキャプチャシンクによって異なります。

  • フォトシンク: Windows Imaging Component (WIC) と互換性のある静止画像形式。
  • プレビューシンク: 非圧縮のオーディオまたはビデオ形式。
  • 録画シンク: 出力ファイルに書き込まれるオーディオまたはビデオ形式。
pAttributesIMFAttributes*inoptional

IMFAttributes インターフェイスへのポインター。圧縮ストリームの場合、このパラメーターを使用してエンコーダーを構成できます。このパラメーターは NULL にすることもできます。

プレビューシンクの場合、このパラメーターを NULL に設定します。

pdwSinkStreamIndexDWORD*outoptionalキャプチャシンク上の新しいストリームのインデックスを受け取ります。このインデックスは必ずしも dwSourceStreamIndex の値と一致するとは限らないことに注意してください。

戻り値

このメソッドは、次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDMEDIATYPE
pMediaType で指定された形式は、このキャプチャシンクに対して無効です。
MF_E_INVALIDSTREAMNUMBER
dwSourceStreamIndex パラメーターが無効であるか、指定されたソースストリームが既にこのシンクに接続されています。
vtbl 6 HRESULT Prepare()

エンコーダー、ビデオプロセッサー、メディアシンクなど、必要なパイプラインコンポーネントを読み込むことで、キャプチャシンクを準備します。

戻り値

このメソッドは、次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDREQUEST
無効な要求です。

解説(Remarks)

このメソッドの呼び出しは省略可能です。このメソッドは、パイプラインコンポーネントが使用される前にそれらを構成する機会をアプリケーションに提供します。このメソッドは非同期です。メソッドが成功コードを返した場合、呼び出し元は IMFCaptureEngineOnEventCallback::OnEvent メソッドを通じて MF_CAPTURE_SINK_PREPARED イベントを受け取ります。このイベントを受け取った後、IMFCaptureSink::GetService を呼び出して個々のコンポーネントを構成します。

このメソッドを呼び出す前に、少なくとも 1 つのストリームを追加してキャプチャシンクを構成してください。ストリームを追加するには、IMFCaptureSink::AddStream を呼び出します。

キャプチャシンクが現在使用中の場合、Prepare メソッドは失敗します。たとえば、キャプチャエンジンが現在プレビュー中である場合、プレビューシンクに対して Prepare を呼び出すと失敗します。

vtbl 7 HRESULT RemoveAllStreams()

キャプチャシンクからすべてのストリームを削除します。

戻り値

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

解説(Remarks)

このメソッドを使用して、シンクを再構成できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IMFCaptureSink "{72D6135B-35E9-412C-B926-FD5265F2A885}"
#usecom global IMFCaptureSink IID_IMFCaptureSink "{}"
#comfunc global IMFCaptureSink_GetOutputMediaType  3 int,sptr
#comfunc global IMFCaptureSink_GetService          4 int,var,var,sptr
#comfunc global IMFCaptureSink_AddStream           5 int,sptr,sptr,var
#comfunc global IMFCaptureSink_Prepare             6
#comfunc global IMFCaptureSink_RemoveAllStreams    7
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。