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

IMFTranscodeSinkInfoProvider

COM
IID8cffcd2e-5a03-4a3a-aff7-edcd107c620e継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

トランスコードシンクのアクティベーションオブジェクトによって実装されます。

解説(Remarks)

このインターフェイスを使用するには、次の手順を実行します。

  1. MFCreateTranscodeSinkActivate を呼び出して、トランスコードシンクのアクティベーションオブジェクトを作成します。
  2. アクティベーションオブジェクトに対して IMFTranscodeSinkInfoProvider インターフェイスをクエリします。
  3. MFCreateTranscodeProfile を呼び出して、トランスコードプロファイルを作成します。
  4. トランスコードプロファイルに MF_TRANSCODE_CONTAINERTYPE 属性を設定します。この属性には、次のいずれかの値を指定する必要があります。
    • MFTranscodeContainerType_3GP
    • MFTranscodeContainerType_MP3
    • MFTranscodeContainerType_MPEG4
  5. IMFTranscodeProfile::SetVideoAttributes および IMFTranscodeProfile::SetAudioAttributes を呼び出して、ビデオおよびオーディオの形式を指定します。
  6. IMFTranscodeSinkInfoProvider::SetProfile を呼び出して、トランスコードプロファイルを設定します。
  7. 次のいずれかのメソッド(両方ではありません)を呼び出して、出力ファイルを指定します。
  8. アクティベーションオブジェクトに対して 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。

vtbl 3 HRESULT SetOutputFile(LPWSTR pwszFileName)

エンコードされた出力ファイルの名前を設定します。

pwszFileNameLPWSTRin出力ファイルの名前を含む、null で終わる文字列へのポインター。

戻り値

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

解説(Remarks)

メディアシンクは、指定されたファイル名でローカルファイルを作成します。

あるいは、IMFTranscodeSinkInfoProvider::SetOutputByteStream を呼び出して、トランスコードされたデータを受け取るバイトストリームを指定することもできます。これら 2 つのメソッドは相互に排他的です。

vtbl 4 HRESULT SetOutputByteStream(IMFActivate* pByteStreamActivate)

トランスコードメディアシンクの出力バイトストリームを設定します。

pByteStreamActivateIMFActivate*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 のカスタム実装を提供する必要があります。

vtbl 5 HRESULT SetProfile(IMFTranscodeProfile* pProfile)

トランスコードシンクのアクティベーションオブジェクトにトランスコードプロファイルを設定します。

pProfileIMFTranscodeProfile*inIMFTranscodeProfile インターフェイスへのポインター。このインターフェイスへのポインターを取得するには、MFCreateTranscodeProfile を呼び出します。

戻り値

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

解説(Remarks)

このメソッドを呼び出す前に、プロファイルオブジェクトを次のように初期化します。

vtbl 6 HRESULT GetSinkInfo(MF_TRANSCODE_SINK_INFO* pSinkInfo)

トランスコードプロファイルで指定されたオーディオおよびビデオストリームのメディアタイプを取得します。

pSinkInfoMF_TRANSCODE_SINK_INFO*out

MF_TRANSCODE_SINK_INFO 構造体へのポインター。

メソッドが成功すると、この構造体の pAudioMediaType メンバーおよび pVideoMediaType メンバーに IMFMediaType ポインターを割り当てます。メソッドはいずれかのメンバーを NULL に設定する場合があります。メソッドの戻り時にいずれかのメンバーが NULL 以外である場合、呼び出し元は IMFMediaType ポインターを解放する必要があります。

戻り値

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

解説(Remarks)

このメソッドを呼び出す前に、IMFTranscodeSinkInfoProvider::SetProfile を呼び出してトランスコードプロファイルを設定します。GetSinkInfo メソッドは、このプロファイルを使用してオーディオおよびビデオストリームのメディアタイプを作成します。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 指定が可能。