MFTEnumEx 函式 (mfapi.h)
取得符合指定搜尋準則的 Microsoft Media Foundation 轉換清單 (MFT) 。 此函式會擴充 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
);
[in] guidCategory
GUID,指定要列舉的 MFT 類別。 如需 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 陣列中的專案數目。 如果沒有 MFT 符合搜尋準則,此參數就會收到零值。
如果此函式成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。
Flags參數會控制要列舉的 MFT,以及傳回它們的順序。 此參數的旗標分為數個群組。
第一組旗標會指定 MFT 如何處理資料。
旗標 | 描述 |
---|---|
MFT_ENUM_FLAG_SYNCMFT | MFT 會在軟體中執行同步資料處理。 這是原始的 MFT 處理模型,且與 Windows Vista 相容。 |
MFT_ENUM_FLAG_ASYNCMFT | MFT 會在軟體中執行非同步資料處理。 此處理模型需要 Windows 7。 如需詳細資訊,請參閱 非同步 MFT。 |
MFT_ENUM_FLAG_HARDWARE | MFT 會使用 AVStream 驅動程式或 GPU 型 Proxy MFT 來執行硬體型資料處理。 此類別中的 MFT 一律以非同步方式處理資料。 如需詳細資訊,請參閱 硬體 MFT。 |
每個 MFT 都只屬於這些類別的其中一個。 若要列舉類別,請在 Flags 參數中設定對應的旗標。 您可以結合這些旗標來列舉多個類別。 如果未指定這些旗標,則預設類別為同步 MFT (MFT_ENUM_FLAG_SYNCMFT) 。
接下來,下列旗標包含從結果中排除的 MFT。 根據預設,符合這些準則的旗標會從結果中排除。 使用這些旗標來包含這些旗標。
旗標 | 描述 |
---|---|
MFT_ENUM_FLAG_FIELDOFUSE | 包含應用程式必須解除鎖定的 MFT。 |
MFT_ENUM_FLAG_LOCALMFT | 包含透過 MFTRegisterLocal 或 MFTRegisterLocalByCLSID 函式在呼叫端程式中註冊的 MFT。 |
MFT_ENUM_FLAG_TRANSCODE_ONLY | 包含針對轉碼優化的 MFT,而不是播放。 |
最後一個旗標是用來排序和篩選結果:
如果 已設定MFT_ENUM_FLAG_SORTANDFILTER 旗標, MFTEnumEx 函式會排序結果,如下所示:
- 本機:如果 已設定MFT_ENUM_FLAG_LOCALMFT 旗標,本機 MFT 就會先出現在清單中。 若要註冊本機 MFT,請呼叫 MFTRegisterLocal 或 MFTRegisterLocalByCLSID 函式。
- 優點:具有優點值的 MFT 會出現在清單中,以最高至最低) (價值的順序。 如需優點的詳細資訊,請參閱 MFT_CODEC_MERIT_Attribute。
- 慣用:如果 MFT 列在外掛程式控制項的慣用清單中,它會出現在清單中的旁邊。 如需外掛程式控制項的詳細資訊,請參閱 IMFPluginControl。
- 如果 MFT 出現在封鎖清單中,則會從結果中排除它。 如需封鎖清單的詳細資訊,請參閱 IMFPluginControl::IsDisabled。
- 符合搜尋準則的任何其他 MFT 都會出現在清單結尾,未排序。
將Flags參數設定為零相當於使用值MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER。
將 旗標 設定為 MFT_ENUM_FLAG_SYNCMFT 相當於呼叫 MFTEnum 函式。
如果沒有 MFT 符合搜尋準則,則除非發生其他錯誤,否則函式會傳回 S_OK。 因此,在您取消參考pppMFTActivate指標之前,請一律檢查pcMFTActivate參數中收到的計數。
每個 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 |
程式庫 | Mfplat.lib |
Dll | Mfplat.dll |