MFTEnumEx 函数 (mfapi.h)
获取与指定搜索条件匹配 (MRT) 的 Microsoft Media Foundation 转换的列表。 此函数扩展 MFTEnum 函数。
语法
HRESULT MFTEnumEx(
[in] GUID guidCategory,
[in] UINT32 Flags,
[in] const MFT_REGISTER_TYPE_INFO *pInputType,
[in] const MFT_REGISTER_TYPE_INFO *pOutputType,
[out] IMFActivate ***pppMFTActivate,
[out] UINT32 *pnumMFTActivate
);
parameters
[in] guidCategory
指定要枚举的 MCT 类别的 GUID。 有关 MFT 类别的列表,请参阅 MFT_CATEGORY。
[in] Flags
_MFT_ENUM_FLAG枚举中零个或多个标志的按位 OR。
[in] pInputType
指向 MFT_REGISTER_TYPE_INFO 结构的指针,该结构指定要匹配的输入媒体类型。
此参数可以为 NULL。 如果 为 NULL,则匹配所有输入类型。
[in] pOutputType
指向 MFT_REGISTER_TYPE_INFO 结构的指针,该结构指定要匹配的输出媒体类型。
此参数可以为 NULL。 如果 为 NULL,则匹配所有输出类型。
[out] pppMFTActivate
接收 IMFActivate 接口指针的数组。 每个指针表示 MFT 的一个与搜索条件匹配的激活对象。 函数为数组分配内存。 调用方必须释放指针并调用 CoTaskMemFree 函数以释放数组的内存。
[out] pnumMFTActivate
接收 pppMFTActivate 数组中的元素数。 如果没有 MCT 与搜索条件匹配,此参数将接收值零。
返回值
如果此函数成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。
注解
Flags 参数控制枚举哪些 MRT 以及它们返回的顺序。 此参数的标志分为多个组。
第一组标志指定 MFT 如何处理数据。
标志 | 描述 |
---|---|
MFT_ENUM_FLAG_SYNCMFT | MFT 在软件中执行同步数据处理。 这是原始的 MFT 处理模型,与 Windows Vista 兼容。 |
MFT_ENUM_FLAG_ASYNCMFT | MFT 在软件中执行异步数据处理。 此处理模型需要 Windows 7。 有关详细信息,请参阅 异步 MRT。 |
MFT_ENUM_FLAG_HARDWARE | MFT 使用 AVStream 驱动程序或基于 GPU 的代理 MFT 执行基于硬件的数据处理。 此类别中的 MCT 始终以异步方式处理数据。 有关详细信息,请参阅 硬件 MRT。 |
每个 MFT 都属于这些类别之一。 若要枚举类别,请在 Flags 参数中设置相应的标志。 可以组合这些标志来枚举多个类别。 如果未指定这些标志,则默认类别为同步 MRT (MFT_ENUM_FLAG_SYNCMFT) 。
接下来,以下标志包括从结果中排除的 MCT。 默认情况下,与这些条件匹配的标志将从结果中排除。 使用这些标志来包含它们。
标志 | 描述 |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | 包括必须由应用程序解锁的 MCT。 |
MFT_ENUM_FLAG_LOCALMFT | 包括通过 MFTRegisterLocal 或 MFTRegisterLocalByCLSID 函数在调用方进程中注册的 MFT。 |
MFT_ENUM_FLAG_TRANSCODE_ONLY | 包括针对转码(而不是播放)优化的 MRT。 |
最后一个标志用于对结果进行排序和筛选:
标志 | 描述 |
---|---|
MFT_ENUM_FLAG_SORTANDFILTER | 对结果进行排序和筛选。 |
如果设置了 MFT_ENUM_FLAG_SORTANDFILTER 标志, MFTEnumEx 函数将按如下所示对结果进行排序:
- 本地:如果设置了 MFT_ENUM_FLAG_LOCALMFT 标志,则本地 MRT 首先显示在列表中。 若要注册本地 MFT,请调用 MFTRegisterLocal 或 MFTRegisterLocalByCLSID 函数。
- 优点:具有功绩值的 MRT 按从高到低) (优点值的顺序显示在列表中。 有关优点的详细信息,请参阅 MFT_CODEC_MERIT_Attribute。
- 首选:如果 MFT 列在插件控件的首选列表中,它将显示在列表中的下一个。 有关插件控件的详细信息,请参阅 IMFPluginControl。
- 如果 MFT 出现在阻止列表上,则会将其从结果中排除。 有关阻止列表的详细信息,请参阅 IMFPluginControl::IsDisabled。
- 与搜索条件匹配的任何其他 MCT 显示在列表末尾,未排序。
将 Flags 参数设置为零等效于使用 值MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER。
将 标志 设置为 MFT_ENUM_FLAG_SYNCMFT 等效于调用 MFTEnum 函数。
如果没有 MCT 与搜索条件匹配,该函数将返回 S_OK,除非发生其他错误。 因此,在取消引用 pppMFTActivate 指针之前,始终检查 pcMFTActivate 参数中收到的计数。
创建 MFT
如果至少有一个 MFT 与搜索条件匹配, 则 pppMFTActivate 参数将接收 IMFActivate 指针数组。 为每个匹配的 MFT 返回一个指针。 每个指针表示 MFT 的 一个激活对象 。 有关详细信息,请参阅 激活对象。有关每个 MFT 的其他信息存储为激活对象上的属性。 有关可能属性的列表,请参阅 转换属性。
若要创建 MFT 的实例,请调用 IMFActivate::ActivateObject。
硬件编解码器
如果以下注册表项设置为零,则会从枚举结果中排除硬件编解码器:解码器: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableDecoders
编码器: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableEncoders
视频处理器: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\HardwareMFT\EnableVideoProcessors
这些密钥适用于 OEM,不应由应用程序使用。
对于硬件编解码器,MFTEnumEx 的 guidCategory 参数还可以指定以下内核流式处理 (KS) 设备类别之一:
- KSCATEGORY_DATACOMPRESSOR
- KSCATEGORY_DATADECOMPRESSOR
示例
以下示例搜索视频或音频解码器。 不包括异步、硬件、转码和使用字段解码器。 如果找到匹配项,则代码会在列表中创建第一个 MFT。
HRESULT FindDecoderEx(
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;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_DECODER : MFT_CATEGORY_VIDEO_DECODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
&info, // Input type
NULL, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first decoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
下一个示例搜索视频或音频编码器。 不包括异步编码器、硬件编码器、转码编码器和使用场编码器。
HRESULT FindEncoderEx(
const GUID& subtype, // Subtype
BOOL bAudio, // TRUE for audio, FALSE for video
IMFTransform **ppEncoder // Receives a pointer to the decoder.
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnumEx(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER,
NULL, // Input type
&info, // Output type
&ppActivate,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppEncoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
下一个示例搜索视频解码器,其中包含异步、硬件或转码解码器的选项。
HRESULT FindVideoDecoder(
const GUID& subtype,
BOOL bAllowAsync,
BOOL bAllowHardware,
BOOL bAllowTranscode,
IMFTransform **ppDecoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL;
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, subtype };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
if (bAllowAsync)
{
unFlags |= MFT_ENUM_FLAG_ASYNCMFT;
}
if (bAllowHardware)
{
unFlags |= MFT_ENUM_FLAG_HARDWARE;
}
if (bAllowTranscode)
{
unFlags |= MFT_ENUM_FLAG_TRANSCODE_ONLY;
}
hr = MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER,
unFlags,
&info, // Input type
NULL, // Output type
&ppActivate,
&count);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first decoder in the list.
if (SUCCEEDED(hr))
{
hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
return hr;
}
要求
最低受支持的客户端 | Windows 7 [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2008 R2 [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | mfapi.h |
Library | Mfplat.lib |
DLL | Mfplat.dll |