MFTEnum 函式 (mfapi.h)

列舉登錄中的媒體基礎轉換 (MFT) 。

從 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
);

參數

[in] guidCategory

GUID,指定要列舉的 MFT 類別。 如需 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

接收 CLSID 陣列的指標。 若要從此清單中建立 MFT,請使用其中一個 CLSID 呼叫 CoCreateInstance 。 若要從 CLSID 取得特定 MFT 的相關資訊,請呼叫 MFTGetInfo。 呼叫端必須藉由呼叫 CoTaskMemFree釋放陣列的記憶體。

[out] pcMFTs

接收 ppclsidMFT 陣列中的專案數目。 此值可以是零。

傳回值

如果此函式成功,則會傳回 S_OK。 否則,它會傳回 HRESULT 錯誤碼。

備註

此函式會傳回指定類別中所有符合pInputType、pOutputTypepAttributes參數所指定搜尋準則的清單。 任何這些參數都可以是 Null

如果沒有符合準則的 MFT,方法會成功,但會傳回 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
程式庫 Mfplat.lib
Dll Mfplat.dll

另請參閱

將解碼器新增至拓撲

MFTEnumEx

MFTRegister

媒體基礎函式

媒體基礎轉換

註冊和列舉 MFT