註冊和列舉 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。 這些會排除在外,因為它們都需要某種特殊處理。 使用 MFTEnumExFlags 參數來變更預設值。 例如,若要在列舉結果中包含硬體 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,讓用戶端可以呼叫 CoCreateInstanceCoGetClassObject 來建立 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;
}

使用限制欄位

媒體基礎轉換