MFTEnum 函数 (mfapi.h)

枚举注册表中 (MRT) 媒体基础转换。

从 Windows 7 开始,应用程序应改用 MFTEnumEx 函数。

语法

HRESULT MFTEnum(
  [in]  GUID                   guidCategory,
  [in]  UINT32                 Flags,
  [in]  MFT_REGISTER_TYPE_INFO *pInputType,
  [in]  MFT_REGISTER_TYPE_INFO *pOutputType,
  [in]  IMFAttributes          *pAttributes,
  [out] CLSID                  **ppclsidMFT,
  [out] UINT32                 *pcMFTs
);

parameters

[in] guidCategory

指定要枚举的 MCT 类别的 GUID。 有关 MFT 类别的列表,请参阅 MFT_CATEGORY

[in] Flags

保留。 必须为零。

[in] pInputType

指向 MFT_REGISTER_TYPE_INFO 结构的指针,该结构指定要匹配的输入媒体类型。

此参数可以为 NULL。 如果 为 NULL,则匹配所有输入类型。

[in] pOutputType

指向 MFT_REGISTER_TYPE_INFO 结构的指针,该结构指定要匹配的输出媒体类型。

此参数可以为 NULL。 如果 为 NULL,则匹配所有输出类型。

[in] pAttributes

保留。 设置为 NULL。

注意 Windows Vista 和 Windows Server 2008:此参数可以指定指向属性存储的 IMFAttributes 接口的指针。 MFTEnum 函数将此对象中的属性与存储在注册表中的属性相匹配。 (注册表属性在 MFTRegister 函数的 pAttributes 参数中指定。) 枚举结果中仅返回具有匹配属性的 MFT。
 
注意 Windows 7 及更高版本:忽略此参数。
 

[out] ppclsidMFT

接收指向 CLSD 数组的指针。 若要从此列表创建 MFT,请使用 CLSED 之一调用 CoCreateInstance 。 若要从其 CLSID 获取有关特定 MFT 的信息,请调用 MFTGetInfo。 调用方必须通过调用 CoTaskMemFree 释放数组的内存。

[out] pcMFTs

接收 ppclsidMFT 数组中的元素数。 该值可以为零。

返回值

如果此函数成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。

注解

此函数返回指定类别中与 pInputType、pOutputTypepAttributes 参数给定的搜索条件匹配的所有 MCT 的列表。 这些参数中的任何一个都可以为 NULL

如果没有 MCT 与条件匹配,该方法成功,但在 pcMFT 中返回值零。

示例

若要查找解码器,请将 guidCategory 设置为 MFT_CATEGORY_AUDIO_DECODERMFT_CATEGORY_VIDEO_DECODER ,并在 pInputType 中指定编码格式。 在这种情况下,通常会将 pOutputType 设置为 NULL

HRESULT FindDecoder(
    const GUID& subtype,        // Subtype
    BOOL bAudio,                // TRUE for audio, FALSE for video
    IMFTransform **ppDecoder    // Receives a pointer to the decoder.
    )
{
    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_DECODER : MFT_CATEGORY_VIDEO_DECODER,
        0,      // Reserved
        &info,  // Input type
        NULL,   // Output type
        NULL,   // Reserved
        &ppCLSIDs,
        &count
        );

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

    // Create the first decoder in the list.

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

    CoTaskMemFree(ppCLSIDs);
    return hr;
}

若要查找编码器,请将 guidCategory 设置为 MFT_CATEGORY_AUDIO_ENCODERMFT_CATEGORY_VIDEO_ENCODER ,并在 pOutputType 中指定编码格式。 在这种情况下,通常将 pInputType 设置为 NULL

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;
}

要求

   
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 mfapi.h
Library Mfplat.lib
DLL Mfplat.dll

另请参阅

将解码器添加到拓扑

MFTEnumEx

MFTRegister

媒体基础函数

媒体基础转换

注册和枚举 MRT