使用 CoCreateInstance 创建编码器

若要将媒体文件转换为 ASF 格式,可以使用 Windows Media 编码器。 若要使用这些编码器,必须向系统注册这些编码器。 编码器实现为 媒体基础转换 (MRT) ,并且必须公开 IMFTransform 接口。 本主题介绍应用程序如何获取指向所需 MFT 编码器的 IMFTransform 接口的指针并将其实例化以供使用。

有关编码器注册的信息,请参阅 实例化编码器 MFT

使用编码器的 IMFTransform 接口

向系统成功注册 Windows Media 编码器后,应用程序可以通过调用 MFTEnum 来枚举编码器。 若要搜索正确的编码器,必须指定以下内容:

  • 表示类别( MFT_CATEGORY_AUDIO_ENCODERMFT_CATEGORY_VIDEO_ENCODER)的 GUID。

  • 要匹配的格式。 这是在 MFT_REGISTER_TYPE_INFO 结构中设置的,该结构指定了编码器将生成示例的媒体类型的主要类型和子类型。 此结构在 pOutputType 参数中传递。 有关支持的类型的信息,请参阅 媒体类型 GUID

    注意

    pInputType 参数中的输入类型信息不是必需的。 这是因为应用程序知道输入类型,并且编码器希望输入流采用未压缩格式。

     

MFTEnum 返回与搜索条件匹配的编码器 MMT 的 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