IMFCaptureSink
COM公式ドキュメント
キャプチャシンクを制御します。キャプチャシンクは、キャプチャデバイスから 1 つ以上のストリームを受け取るオブジェクトです。
解説(Remarks)
キャプチャエンジンは、次のキャプチャシンクを作成します。
- フォトシンク。静止画像ファイルをエンコードします。
- プレビューシンク。ライブのオーディオまたはビデオをプレビューします。
- 録画シンク。圧縮されたオーディオ/ビデオファイル、または圧縮されたオーディオ/ビデオストリームを作成します。
| シンク | インターフェイス |
|---|---|
| フォトシンク | 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。
このキャプチャシンク上のストリームの出力形式を取得します。
| dwSinkStreamIndex | DWORD | in | クエリするストリームの 0 から始まるインデックス。このインデックスは、IMFCaptureSink::AddStream メソッドの pdwSinkStreamIndex パラメーターで返されます。 |
| ppMediaType | IMFMediaType** | outoptional | IMFMediaType インターフェイスへのポインターを受け取ります。呼び出し元はこのポインターを解放する必要があります。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| dwSinkStreamIndex パラメーターが無効です。 |
基になる Sink Writer オブジェクトに対してインターフェイスをクエリします。
| dwSinkStreamIndex | DWORD | in | クエリするストリームの 0 から始まるインデックス。このインデックスは、IMFCaptureSink::AddStream メソッドの pdwSinkStreamIndex パラメーターで返されます。 |
| rguidService | GUID* | in | サービス識別子 GUID。現在、この値は GUID_NULL でなければなりません。 |
| riid | GUID* | in | サービス識別子 GUID。現在、この値は IID_IMFSinkWriter でなければなりません。 |
| ppUnknown | IUnknown** | outoptional | IUnknown インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 引数が無効です。 | |
| 無効な要求です。 | |
| ストリーム番号が無効です。 |
キャプチャソースからのストリームを、このキャプチャシンクに接続します。
| dwSourceStreamIndex | DWORD | in | 接続するソースストリーム。値は次のいずれかを指定できます。
| ||||||||||
| pMediaType | IMFMediaType* | in | 出力ストリームの目的の形式を指定する IMFMediaType ポインター。形式の詳細はキャプチャシンクによって異なります。
| ||||||||||
| pAttributes | IMFAttributes* | inoptional | IMFAttributes インターフェイスへのポインター。圧縮ストリームの場合、このパラメーターを使用してエンコーダーを構成できます。このパラメーターは NULL にすることもできます。 プレビューシンクの場合、このパラメーターを NULL に設定します。 | ||||||||||
| pdwSinkStreamIndex | DWORD* | outoptional | キャプチャシンク上の新しいストリームのインデックスを受け取ります。このインデックスは必ずしも dwSourceStreamIndex の値と一致するとは限らないことに注意してください。 |
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| pMediaType で指定された形式は、このキャプチャシンクに対して無効です。 | |
| dwSourceStreamIndex パラメーターが無効であるか、指定されたソースストリームが既にこのシンクに接続されています。 |
エンコーダー、ビデオプロセッサー、メディアシンクなど、必要なパイプラインコンポーネントを読み込むことで、キャプチャシンクを準備します。
戻り値
このメソッドは、次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 無効な要求です。 |
解説(Remarks)
このメソッドの呼び出しは省略可能です。このメソッドは、パイプラインコンポーネントが使用される前にそれらを構成する機会をアプリケーションに提供します。このメソッドは非同期です。メソッドが成功コードを返した場合、呼び出し元は IMFCaptureEngineOnEventCallback::OnEvent メソッドを通じて MF_CAPTURE_SINK_PREPARED イベントを受け取ります。このイベントを受け取った後、IMFCaptureSink::GetService を呼び出して個々のコンポーネントを構成します。
このメソッドを呼び出す前に、少なくとも 1 つのストリームを追加してキャプチャシンクを構成してください。ストリームを追加するには、IMFCaptureSink::AddStream を呼び出します。
キャプチャシンクが現在使用中の場合、Prepare メソッドは失敗します。たとえば、キャプチャエンジンが現在プレビュー中である場合、プレビューシンクに対して Prepare を呼び出すと失敗します。
キャプチャシンクからすべてのストリームを削除します。
戻り値
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
このメソッドを使用して、シンクを再構成できます。
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 指定が可能。#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,sptr,sptr,sptr #comfunc global IMFCaptureSink_AddStream 5 int,sptr,sptr,sptr #comfunc global IMFCaptureSink_Prepare 6 #comfunc global IMFCaptureSink_RemoveAllStreams 7 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。