次の方法で共有


CoCreateInstance を使用したエンコーダーの作成

メディア ファイルを ASF 形式に変換する場合は、Windows Media エンコーダーを使用できます。 これらのエンコーダーを使用するには、システムに登録する必要があります。 エンコーダーは Media Foundation 変換 (MFT ) として実装され、IMFTransform インターフェイスを公開する必要があります。 このトピックでは、アプリケーションが必要な MFT エンコーダーの IMFTransform インターフェイスへのポインターを取得し、使用するためにインスタンス化する方法について説明します。

エンコーダーの登録の詳細については、「 エンコーダー MFT のインスタンス化」を参照してください。

エンコーダーの IMFTransform インターフェイスの使用

システムに Windows Media エンコーダーが正常に登録されると、アプリケーションは MFTEnum を呼び出すことによってエンコーダーを列挙できます。 適切なエンコーダーを検索するには、次を指定する必要があります。

  • カテゴリを表す GUID ( MFT_CATEGORY_AUDIO_ENCODER または MFT_CATEGORY_VIDEO_ENCODER)。

  • 一致する形式。 これは、 エンコーダーがサンプル を生成するメディアの種類の主な型とサブタイプを指定するMFT_REGISTER_TYPE_INFO構造体で設定されます。 この構造体は 、pOutputType パラメーターで渡されます。 サポートされている種類の詳細については、「 メディアの種類の GUID」を参照してください。

    注意

    pInputType パラメーターの入力型情報は必要ありません。 これは、入力の種類がアプリケーションに認識されており、エンコーダーが入力ストリームが非圧縮形式であると想定しているためです。

     

MFTEnum は、検索条件に一致するエンコーダー MFT の IMFTransform ポインターの配列を返します。 COM 関数 CoCreateInstance を呼び出し、使用するエンコーダーの CLSID を渡すことで、エンコーダーをインスタンス化できます。 この関数は、エンコーダーを表す IMFTransform インターフェイスへのポインターを返します。 この関数呼び出しの詳細については、コンポーネント オブジェクト モデル (COM) の Windows SDK ドキュメントを参照してください。

エンコーダーの作成の例

次のコード例は、オーディオ エンコーダーまたはビデオ エンコーダーを作成する方法を示しています。

HRESULT FindEncoder(
    const GUID& subtype, 
    BOOL bAudio, 
    IMFTransform **ppEncoder
    )
{
    HRESULT hr = S_OK;
    UINT32 count = 0;

    CLSID *ppCLSIDs = NULL;

    MFT_REGISTER_TYPE_INFO info = { 0 };

    info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
    info.guidSubtype = subtype;

    hr = MFTEnum(   
        bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
        0,          // Reserved
        NULL,       // Input type
        &info,      // Output type
        NULL,       // Reserved
        &ppCLSIDs,
        &count
        );

    if (SUCCEEDED(hr) && count == 0)
    {
        hr = MF_E_TOPO_CODEC_NOT_FOUND;
    }

    // Create the first encoder in the list.

    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(ppCLSIDs[0], NULL,
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppEncoder));
    }

    CoTaskMemFree(ppCLSIDs);
    return hr;
}

エンコーダー MFT のインスタンス化

Windows Media Encoders