IMFTranscodeSinkInfoProvider
COM公式ドキュメント
トランスコードシンクのアクティベーションオブジェクトによって実装されます。
解説(Remarks)
このインターフェイスを使用するには、次の手順を実行します。
- MFCreateTranscodeSinkActivate を呼び出して、トランスコードシンクのアクティベーションオブジェクトを作成します。
- アクティベーションオブジェクトに対して IMFTranscodeSinkInfoProvider インターフェイスをクエリします。
- MFCreateTranscodeProfile を呼び出して、トランスコードプロファイルを作成します。
- トランスコードプロファイルに MF_TRANSCODE_CONTAINERTYPE 属性を設定します。この属性には、次のいずれかの値を指定する必要があります。
- MFTranscodeContainerType_3GP
- MFTranscodeContainerType_MP3
- MFTranscodeContainerType_MPEG4
- IMFTranscodeProfile::SetVideoAttributes および IMFTranscodeProfile::SetAudioAttributes を呼び出して、ビデオおよびオーディオの形式を指定します。
- IMFTranscodeSinkInfoProvider::SetProfile を呼び出して、トランスコードプロファイルを設定します。
- 次のいずれかのメソッド(両方ではありません)を呼び出して、出力ファイルを指定します。
- アクティベーションオブジェクトに対して IMFActivate::ActivateObject を呼び出して、メディアシンクを作成します。
例
// Creates an activation object for the generic transcode sink.
HRESULT CreateTranscodeSinkActivate(
REFGUID guidContainerType,
IMFAttributes *pVideoAttributes,
IMFAttributes *pAudioAttributes,
IMFActivate *pByteStreamActivate,
IMFActivate **ppSinkActivate
)
{
IMFActivate* pSinkActivate = NULL;
IMFTranscodeSinkInfoProvider* pSinkInfoProvider = NULL;
IMFTranscodeProfile* pProfile = NULL;
IMFAttributes* pContainerAttributes = NULL;
HRESULT hr = MFCreateAttributes(&pContainerAttributes, 1);
if (FAILED(hr))
{
goto done;
}
// Create the transcode profile.
hr = MFCreateTranscodeProfile(&pProfile);
if (FAILED(hr))
{
goto done;
}
// Set the profile attributes.
hr = pContainerAttributes->SetGUID(MF_TRANSCODE_CONTAINERTYPE, guidContainerType);
if (FAILED(hr))
{
goto done;
}
hr = pProfile->SetContainerAttributes(pContainerAttributes);
if (FAILED(hr))
{
goto done;
}
if (pVideoAttributes)
{
hr = pProfile->SetVideoAttributes(pVideoAttributes);
if (FAILED(hr))
{
goto done;
}
}
if (pAudioAttributes)
{
hr = pProfile->SetAudioAttributes(pAudioAttributes);
if (FAILED(hr))
{
goto done;
}
}
// Create the transcode sink activation object.
hr = MFCreateTranscodeSinkActivate(&pSinkActivate);
if (FAILED(hr))
{
goto done;
}
hr = pSinkActivate->QueryInterface(IID_PPV_ARGS(&pSinkInfoProvider));
if (FAILED(hr))
{
goto done;
}
// Set the output byte stream.
hr = pSinkInfoProvider->SetOutputByteStream(pByteStreamActivate);
if (FAILED(hr))
{
goto done;
}
// Set the transcode profile.
hr = pSinkInfoProvider->SetProfile(pProfile);
if (FAILED(hr))
{
goto done;
}
// Return the activation object to the caller.
*ppSinkActivate = pSinkActivate;
(*ppSinkActivate)->AddRef();
done:
SafeRelease(&pProfile);
SafeRelease(&pSinkInfoProvider);
SafeRelease(&pSinkActivate);
SafeRelease(&pContainerAttributes);
return hr;
}
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
エンコードされた出力ファイルの名前を設定します。
| pwszFileName | LPWSTR | in | 出力ファイルの名前を含む、null で終わる文字列へのポインター。 |
戻り値
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
メディアシンクは、指定されたファイル名でローカルファイルを作成します。
あるいは、IMFTranscodeSinkInfoProvider::SetOutputByteStream を呼び出して、トランスコードされたデータを受け取るバイトストリームを指定することもできます。これら 2 つのメソッドは相互に排他的です。
トランスコードメディアシンクの出力バイトストリームを設定します。
| pByteStreamActivate | IMFActivate* | in | バイトストリームのアクティベーションオブジェクトの IMFActivate インターフェイスへのポインター。 |
戻り値
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
トランスコードされたデータを受け取る、書き込み可能なバイトストリームを提供するには、このメソッドを呼び出します。
あるいは、IMFTranscodeSinkInfoProvider::SetOutputFile を呼び出して出力ファイルの名前を指定することもできます。これら 2 つのメソッドは相互に排他的です。
pByteStreamActivate パラメーターには、書き込み可能なバイトストリームを作成するアクティベーションオブジェクトを指定する必要があります。内部的には、トランスコードメディアシンクは次のように IMFActivate::ActivateObject を呼び出してバイトストリームを作成します。
IMFByteStream *pByteStream = NULL;
HRESULT hr = pByteStreamActivate->ActivateObject(IID_IMFByteStream, (void**)&pByteStream);
現在、Microsoft Media Foundation はバイトストリームのアクティベーションオブジェクトを一切提供していません。このメソッドを使用するには、アプリケーションが IMFActivate のカスタム実装を提供する必要があります。
トランスコードシンクのアクティベーションオブジェクトにトランスコードプロファイルを設定します。
| pProfile | IMFTranscodeProfile* | in | IMFTranscodeProfile インターフェイスへのポインター。このインターフェイスへのポインターを取得するには、MFCreateTranscodeProfile を呼び出します。 |
戻り値
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
このメソッドを呼び出す前に、プロファイルオブジェクトを次のように初期化します。
- 出力ファイルのコンテナータイプを指定するために、MF_TRANSCODE_CONTAINERTYPE 属性を設定します。
- 出力ファイルにビデオストリームが含まれる場合は、IMFTranscodeProfile::SetVideoAttributes メソッドを呼び出してビデオ属性を設定します。
- 出力ファイルにオーディオストリームが含まれる場合は、IMFTranscodeProfile::SetAudioAttributes メソッドを呼び出してオーディオ属性を設定します。
トランスコードプロファイルで指定されたオーディオおよびビデオストリームのメディアタイプを取得します。
| pSinkInfo | MF_TRANSCODE_SINK_INFO* | out | MF_TRANSCODE_SINK_INFO 構造体へのポインター。 メソッドが成功すると、この構造体の pAudioMediaType メンバーおよび pVideoMediaType メンバーに IMFMediaType ポインターを割り当てます。メソッドはいずれかのメンバーを NULL に設定する場合があります。メソッドの戻り時にいずれかのメンバーが NULL 以外である場合、呼び出し元は IMFMediaType ポインターを解放する必要があります。 |
戻り値
このメソッドが成功すると、S_OK を返します。それ以外の場合は、HRESULT エラーコードを返します。
解説(Remarks)
このメソッドを呼び出す前に、IMFTranscodeSinkInfoProvider::SetProfile を呼び出してトランスコードプロファイルを設定します。GetSinkInfo メソッドは、このプロファイルを使用してオーディオおよびビデオストリームのメディアタイプを作成します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFTranscodeSinkInfoProvider "{8CFFCD2E-5A03-4A3A-AFF7-EDCD107C620E}" #usecom global IMFTranscodeSinkInfoProvider IID_IMFTranscodeSinkInfoProvider "{}" #comfunc global IMFTranscodeSinkInfoProvider_SetOutputFile 3 wstr #comfunc global IMFTranscodeSinkInfoProvider_SetOutputByteStream 4 sptr #comfunc global IMFTranscodeSinkInfoProvider_SetProfile 5 sptr #comfunc global IMFTranscodeSinkInfoProvider_GetSinkInfo 6 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFTranscodeSinkInfoProvider "{8CFFCD2E-5A03-4A3A-AFF7-EDCD107C620E}" #usecom global IMFTranscodeSinkInfoProvider IID_IMFTranscodeSinkInfoProvider "{}" #comfunc global IMFTranscodeSinkInfoProvider_SetOutputFile 3 wstr #comfunc global IMFTranscodeSinkInfoProvider_SetOutputByteStream 4 sptr #comfunc global IMFTranscodeSinkInfoProvider_SetProfile 5 sptr #comfunc global IMFTranscodeSinkInfoProvider_GetSinkInfo 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。