使用 CoCreateInstance 创建编码器

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

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

使用编码器的 IMFTransform 接口

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

  • 表示类别的 GUID,它是 MFT _ 类别 _ 音频 _ 编码器mft _ 类别 _ 视频 _ 编码器

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

    备注

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

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