IMFSinkWriter
COM公式ドキュメント
Microsoft Media Foundation のシンクライター オブジェクトによって実装されます。
解説(Remarks)
シンクライターを作成するには、次のいずれかの関数を呼び出します。
あるいは、IMFReadWriteClassFactory インターフェイスを使用します。このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
Windows 8 では、このインターフェイスは IMFSinkWriterEx によって拡張されています。
メソッド 11
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
シンクライターにストリームを追加します。
| pTargetMediaType | IMFMediaType* | in | メディアタイプの IMFMediaType インターフェイスへのポインター。このメディアタイプは、ファイルに書き込まれるサンプルの形式を指定します。入力形式と一致している必要はありません。入力形式を設定するには、IMFSinkWriter::SetInputMediaType を呼び出します。 |
| pdwStreamIndex | DWORD* | out | 新しいストリームの 0 から始まるインデックスを受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
シンクライター上のストリームに対する入力形式を設定します。
| dwStreamIndex | DWORD | in | ストリームの 0 から始まるインデックス。このインデックスは、IMFSinkWriter::AddStream メソッドの pdwStreamIndex パラメーターによって受け取られます。 |
| pInputMediaType | IMFMediaType* | in | メディアタイプの IMFMediaType インターフェイスへのポインター。このメディアタイプは入力形式を指定します。 |
| pEncodingParameters | IMFAttributes* | inoptional | 属性ストアの IMFAttributes インターフェイスへのポインター。この属性ストアを使用してエンコーダーを構成します。このパラメーターは NULL にできます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 基になるメディアシンクがその形式をサポートしていないか、変換が不可能であるか、または動的な形式変更が不可能です。 | |
| dwStreamIndex パラメーターが無効です。 | |
| エンコード先の形式に対応するエンコーダーが見つかりませんでした。 |
解説(Remarks)
入力形式は、メディアシンクに書き込まれるターゲット形式と一致している必要はありません。形式が一致しない場合、このメソッドは入力形式からターゲット形式へエンコードできるエンコーダーの読み込みを試みます。
ストリーミングの開始後、つまり IMFSinkWriter::WriteSample の最初の呼び出しの後は、いつでもこのメソッドを呼び出して入力形式を変更できます。ただし、基になるエンコーダーとメディアシンクが動的な形式変更をサポートしている必要があります。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
書き込みのためにシンクライターを初期化します。
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求が無効です。 |
解説(Remarks)
入力ストリームを構成した後、シンクライターにデータを送信する前に、このメソッドを呼び出します。
次のいずれかのメソッドを呼び出す前に、BeginWriting を呼び出す必要があります。
- IMFSinkWriter::Finalize
- IMFSinkWriter::Flush
- IMFSinkWriter::NotifyEndOfSegment
- IMFSinkWriter::PlaceMarker
- IMFSinkWriter::SendStreamTick
- IMFSinkWriter::WriteSample
BeginWriting が成功した後は、BeginWriting をさらに呼び出しても MF_E_INVALIDREQUEST が返されます。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
シンクライターにサンプルを渡します。
| dwStreamIndex | DWORD | in | このサンプルの対象となるストリームの 0 から始まるインデックス。 |
| pSample | IMFSample* | in | サンプルの IMFSample インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求が無効です。 |
解説(Remarks)
このメソッドを呼び出す前に、IMFSinkWriter::BeginWriting を呼び出す必要があります。そうでない場合、このメソッドは MF_E_INVALIDREQUEST を返します。
既定では、シンクライターは WriteSample メソッド内で呼び出し元のスレッドをブロックすることにより、受信データのレートを制限します。これにより、アプリケーションがサンプルを過度に速く渡すのを防ぎます。この動作を無効にするには、シンクライターの作成時に MF_SINK_WRITER_DISABLE_THROTTLING 属性を設定します。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
入力ストリーム内のギャップを示します。
| dwStreamIndex | DWORD | in | ストリームの 0 から始まるインデックス。 |
| llTimestamp | LONGLONG | in | データのギャップが発生するストリーム内の位置。値は、ストリームの先頭を基準とした 100 ナノ秒単位で指定します。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ビデオの場合は、欠落しているフレームごとにこのメソッドを 1 回呼び出します。オーディオの場合は、オーディオのギャップの間、少なくとも 1 秒に 1 回このメソッドを呼び出します。ギャップの後の最初のメディアサンプルに MFSampleExtension_Discontinuity 属性を設定します。
内部的に、このメソッドはメディアシンク上で IMFStreamSink::PlaceMarker を呼び出します。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
指定したストリームにマーカーを配置します。
| dwStreamIndex | DWORD | in | ストリームの 0 から始まるインデックス。 |
| pvContext | void* | in | アプリケーション定義の値へのポインター。このパラメーターの値は、呼び出し元の IMFSinkWriterCallback::OnMarker コールバックメソッドの pvContext パラメーターで呼び出し元に返されます。このデータに関連するメモリの割り当ては、アプリケーションが責任を負います。このパラメーターは NULL にできます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求が無効です。 |
解説(Remarks)
このメソッドを使用するには、シンクライターの作成時に非同期コールバックを指定する必要があります。そうでない場合、このメソッドは MF_E_INVALIDREQUEST を返します。詳細については、MF_SINK_WRITER_ASYNC_CALLBACK を参照してください。
マーカーは、メディアシンクがストリーム内の特定の地点までのすべてのサンプルを消費したときに通知を受け取る手段を提供します。メディアシンクは、マーカーより前のすべてのサンプルを処理し終えるまで、マーカーを処理しません。メディアシンクがマーカーを処理すると、シンクライターはアプリケーションの OnMarker メソッドを呼び出します。このコールバックが呼び出されると、そのストリームについて、シンクがそれ以前のすべてのサンプルを消費したことがわかります。
たとえば、ストリームの途中で形式を変更するには、形式が変わる地点で PlaceMarker を呼び出します。OnMarker が呼び出されたら、IMFSinkWriter::SetInputMediaType を呼び出して入力タイプを安全に変更できます (メディアシンクが動的な形式変更をサポートしていることを前提とします)。
内部的に、このメソッドはメディアシンク上で IMFStreamSink::PlaceMarker を呼び出します。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
ストリームがセグメントの終端に達したことをメディアシンクに通知します。
| dwStreamIndex | DWORD | in | ストリームの 0 から始まるインデックス。または、すべてのストリームがセグメントの終端に達したことを通知するには MF_SINK_WRITER_ALL_STREAMS を指定します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求が無効です。 |
解説(Remarks)
このメソッドを呼び出す前に、IMFSinkWriter::BeginWriting を呼び出す必要があります。そうでない場合、このメソッドは MF_E_INVALIDREQUEST を返します。
このメソッドは、指定したストリームについて MFSTREAMSINK_MARKER_ENDOFSEGMENT マーカーをメディアシンクに送信します。詳細については、IMFStreamSink::PlaceMarker を参照してください。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
1 つ以上のストリームをフラッシュします。 (IMFSinkWriter.Flush)
| dwStreamIndex | DWORD | in | フラッシュするストリームの 0 から始まるインデックス。または、すべてのストリームをフラッシュするには MF_SINK_WRITER_ALL_STREAMS を指定します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 要求が無効です。 |
解説(Remarks)
このメソッドを呼び出す前に、IMFSinkWriter::BeginWriting を呼び出す必要があります。そうでない場合、このメソッドは MF_E_INVALIDREQUEST を返します。
フラッシュされる各ストリームについて、シンクライターは保留中のすべてのサンプルを破棄し、エンコーダーをフラッシュし、MFSTREAMSINK_MARKER_ENDOFSEGMENT マーカーをメディアシンクに送信します。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
シンクライター上のすべての書き込み操作を完了します。
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
すべての入力サンプルをシンクライターに送信した後に、このメソッドを呼び出します。このメソッドは、メディアシンクから最終的な出力を作成するために必要な操作を実行します。
シンクライターの作成時にコールバックインターフェイスを指定した場合、このメソッドは非同期に完了します。操作が完了すると、コールバックの IMFSinkWriterCallback::OnFinalize メソッドが呼び出されます。詳細については、MF_SINK_WRITER_ASYNC_CALLBACK を参照してください。一方、コールバックを指定しない場合、Finalize メソッドは操作が完了するまでブロックします。
内部的に、このメソッドは IMFStreamSink::PlaceMarker を呼び出して、メディアシンク上の各ストリームにセグメント終端マーカーを配置します。また、メディアシンクが IMFFinalizableMediaSink インターフェイスをサポートしている場合は、IMFFinalizableMediaSink::BeginFinalize および EndFinalize も呼び出します。
このメソッドを呼び出した後は、次のメソッドは失敗します。
Finalize を呼び出さない場合、メディアシンクからの出力は不完全または無効になる可能性があります。たとえば、必要なファイルヘッダーが出力ファイルから欠落することがあります。このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
基になるメディアシンクまたはエンコーダーに対してインターフェイスを問い合わせます。
| dwStreamIndex | DWORD | in | 問い合わせるストリームの 0 から始まるインデックス。または、メディアシンク自体に問い合わせるには MF_SINK_WRITER_MEDIASINK を指定します。 |
| guidService | GUID* | in | サービス識別子 GUID、または GUID_NULL。値が GUID_NULL の場合、このメソッドは QueryInterface を呼び出して要求されたインターフェイスを取得します。それ以外の場合は、IMFGetService::GetService を呼び出します。サービス識別子の一覧については、Service Interfaces を参照してください。 |
| riid | GUID* | in | 要求するインターフェイスのインターフェイス識別子 (IID)。 |
| ppvObject | void** | out | 要求されたインターフェイスへのポインターを受け取ります。呼び出し元はそのインターフェイスを解放する必要があります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
dwStreamIndex パラメーターが MF_SINK_WRITER_MEDIASINK と等しい場合、このメソッドはメディアシンクからインターフェイスの取得を試みます。それ以外の場合は、指定したインデックスのストリームのエンコーダーからインターフェイスの取得を試みます。それが失敗した場合、またはエンコーダーが存在しない場合、このメソッドはメディアシンク上のストリームからインターフェイスの取得を試みます。
シンクの入力タイプと出力タイプが同一で圧縮されている場合、エンコードが不要であり、ビデオエンコーダーがインスタンス化されない可能性があります。その場合、GetServiceForStream は MF_E_UNSUPPORTED_SERVICE を返します。
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
シンクライターのパフォーマンスに関する統計情報を取得します。
| dwStreamIndex | DWORD | in | 問い合わせるストリームの 0 から始まるインデックス。または、メディアシンク自体に問い合わせるには MF_SINK_WRITER_ALL_STREAMS を指定します。 |
| pStats | MF_SINK_WRITER_STATISTICS* | out | MF_SINK_WRITER_STATISTICS 構造体へのポインター。メソッドを呼び出す前に、cb メンバーを構造体のサイズ (バイト単位) に設定します。このメソッドは、シンクライターからの統計情報でこの構造体を埋めます。 |
戻り値
このメソッドは、次のいずれかの値を返すことがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 無効なストリーム番号です。 |
解説(Remarks)
このインターフェイスは、Platform Update Supplement for Windows Vista がインストールされている場合、Windows Vista で使用できます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFSinkWriter "{3137F1CD-FE5E-4805-A5D8-FB477448CB3D}" #usecom global IMFSinkWriter IID_IMFSinkWriter "{}" #comfunc global IMFSinkWriter_AddStream 3 sptr,var #comfunc global IMFSinkWriter_SetInputMediaType 4 int,sptr,sptr #comfunc global IMFSinkWriter_BeginWriting 5 #comfunc global IMFSinkWriter_WriteSample 6 int,sptr #comfunc global IMFSinkWriter_SendStreamTick 7 int,int64 #comfunc global IMFSinkWriter_PlaceMarker 8 int,sptr #comfunc global IMFSinkWriter_NotifyEndOfSegment 9 int #comfunc global IMFSinkWriter_Flush 10 int #comfunc global IMFSinkWriter_Finalize 11 #comfunc global IMFSinkWriter_GetServiceForStream 12 int,var,var,sptr #comfunc global IMFSinkWriter_GetStatistics 13 int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFSinkWriter "{3137F1CD-FE5E-4805-A5D8-FB477448CB3D}" #usecom global IMFSinkWriter IID_IMFSinkWriter "{}" #comfunc global IMFSinkWriter_AddStream 3 sptr,sptr #comfunc global IMFSinkWriter_SetInputMediaType 4 int,sptr,sptr #comfunc global IMFSinkWriter_BeginWriting 5 #comfunc global IMFSinkWriter_WriteSample 6 int,sptr #comfunc global IMFSinkWriter_SendStreamTick 7 int,int64 #comfunc global IMFSinkWriter_PlaceMarker 8 int,sptr #comfunc global IMFSinkWriter_NotifyEndOfSegment 9 int #comfunc global IMFSinkWriter_Flush 10 int #comfunc global IMFSinkWriter_Finalize 11 #comfunc global IMFSinkWriter_GetServiceForStream 12 int,sptr,sptr,sptr #comfunc global IMFSinkWriter_GetStatistics 13 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。