註冊和列舉 MFT
本節說明如何列舉媒體基礎轉換,以及如何註冊自定義 MFT,讓應用程式可以探索它。
列舉 MFT
若要探索系統上註冊的 MFT,應用程式可以呼叫 MFTEnumEx 函式。
注意
此函式需要 Windows 7。 在 Windows 7 之前,應用程式應該改用 MFTEnum 函式。
此函式接受下列資訊作為輸入:
- 要列舉的 MFT 類別,例如視訊譯碼器或音訊譯碼器。
- 要比對的輸入或輸出格式。
- 指定其他搜尋條件的旗標。
函式會傳回 IMFActivate 指標的陣列,每個指標都代表符合列舉準則的 MFT。
例如,下列程式代碼會列舉 Windows Media Video 譯碼器:
HRESULT hr = S_OK;
UINT32 count = 0;
IMFActivate **ppActivate = NULL; // Array of activation objects.
IMFTransform *pDecoder = NULL; // Pointer to the decoder.
// Match WMV3 video.
MFT_REGISTER_TYPE_INFO info = { MFMediaType_Video, MFVideoFormat_WMV3 };
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT |
MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
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(&pDecoder));
}
for (UINT32 i = 0; i < count; i++)
{
ppActivate[i]->Release();
}
CoTaskMemFree(ppActivate);
根據預設,某些 MFT 類型會從列舉中排除,包括異步 MFT、硬體 MFT,以及具有使用字段限制的 MFT。 這些會排除在外,因為它們都需要某種特殊處理。 使用 MFTEnumEx 的 Flags 參數來變更預設值。 例如,若要在列舉結果中包含硬體 MFT,請設定 MFT_ENUM_FLAG_HARDWARE 旗標:
UINT32 unFlags = MFT_ENUM_FLAG_HARDWARE |
MFT_ENUM_FLAG_SYNCMFT |
MFT_ENUM_FLAG_LOCALMFT |
MFT_ENUM_FLAG_SORTANDFILTER;
hr = MFTEnumEx(
MFT_CATEGORY_VIDEO_DECODER,
unFlags,
&info, // Input type
NULL, // Output type
&ppActivate,
&count
);
註冊 MFT
當您註冊媒體基礎轉換 (MFT) 時,會將兩種類型的資訊寫入登錄:
- MFT 的 CLSID,讓用戶端可以呼叫 CoCreateInstance 或 CoGetClassObject 來建立 MFT 的實例。 此登錄專案遵循 COM 類別處理站的標準格式。 如需詳細資訊,請參閱元件物件模型 (COM) 的 Windows SDK 檔。
- 可讓應用程式依功能類別列舉 MFT 的資訊。
若要在登錄中建立 MFT 列舉專案,請呼叫 MFTRegister 函式。 您可以包含下列 MFT 相關資訊:
- MFT 的類別,例如視訊譯碼器或視訊編碼器。 如需類別清單,請參閱 MFT_CATEGORY。
- MFT 支援的輸入和輸出格式清單。 每個格式都是由主要類型和子類型所定義。 (若要取得更詳細的格式資訊,客戶端必須建立 MFT 並呼叫 IMFTransform 方法。)拓撲載入器會在解析部分拓撲時使用這項資訊。
若要從登錄中移除專案,請呼叫 MFTUnregister。
下列程式代碼示範如何註冊 MFT。 此範例假設 MFT 是支援輸入和輸出相同格式的視訊效果。
// CLSID of the MFT.
extern const GUID CLSID_MyVideoEffectMFT;
// DllRegisterServer: Creates the registry entries.
STDAPI DllRegisterServer()
{
HRESULT hr = S_OK;
// Array of media types.
MFT_REGISTER_TYPE_INFO aMediaTypes[] =
{
{ MFMediaType_Video, MFVideoFormat_NV12 },
{ MFMediaType_Video, MFVideoFormat_YUY2 },
{ MFMediaType_Video, MFVideoFormat_UYVY },
};
// Size of the array.
const DWORD cNumMediaTypes = ARRAY_SIZE(aMediaTypes);
hr = MFTRegister(
CLSID_MyVideoEffectMFT, // CLSID.
MFT_CATEGORY_VIDEO_EFFECT, // Category.
L"My Video Effect", // Friendly name.
0, // Reserved, must be zero.
cNumMediaTypes, // Number of input types.
aMediaTypes, // Input types.
cNumMediaTypes, // Number of output types.
aMediaTypes, // Output types.
NULL // Attributes (optional).
);
if (SUCCEEDED(hr))
{
// Register the CLSID for CoCreateInstance (not shown).
}
return hr;
}
// DllUnregisterServer: Removes the registry entries.
STDAPI DllUnregisterServer()
{
HRESULT hr = MFTUnregister(CLSID_MyVideoEffectMFT);
// Unregister the CLSID for CoCreateInstance (not shown).
return hr;
}
相關主題