MFEnumDeviceSources 函式 (mfidl.h)

列舉音訊或視訊擷取裝置的清單。

語法

HRESULT MFEnumDeviceSources(
  [in]  IMFAttributes *pAttributes,
  [out] IMFActivate   ***pppSourceActivate,
  [out] UINT32        *pcSourceActivate
);

參數

[in] pAttributes

包含搜尋準則的屬性存放區指標。 若要建立屬性存放區,請呼叫 MFCreateAttributes。 在屬性存放區上設定下列一或多個屬性:

意義
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE
指定是否列舉音訊或視訊裝置。 (必要項。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ROLE
針對音訊擷取裝置,指定裝置角色。 (選擇性。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY
針對視訊擷取裝置,指定裝置類別。 (選擇性。)

[out] pppSourceActivate

接收 IMFActivate 介面指標的陣列。 每個指標都代表媒體來源的啟用物件。 函式會配置陣列的記憶體。 呼叫端必須釋放陣列中的指標,並呼叫 CoTaskMemFree 以釋放數位的記憶體。

[out] pcSourceActivate

接收 pppSourceActivate 陣列中的項目數目。 如果沒有擷取裝置符合搜尋準則,此參數就會收到值 0。

傳回值

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

備註

每個傳回 的IMFActivate 指標都代表擷取裝置,並可用來建立該裝置的媒體來源。 您也可以使用 IMFActivate 指標來查詢描述裝置的屬性。 可能會設定下列屬性:

屬性 Description
MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME 裝置的顯示名稱。
MF_DEVSOURCE_ATTRIBUTE_MEDIA_TYPE 描述裝置輸出格式的主要類型和子類型 GUID。
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 擷取裝置的類型 (音訊或視訊) 。
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID 音訊端點標識符字串。 僅 (音訊裝置。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY 裝置類別。 僅限 (Video 裝置。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_HW_SOURCE 裝置是硬體或軟體裝置。 僅限 (Video 裝置。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK 設備驅動器的符號連結。 僅限 (Video 裝置。)
 

若要從 IMFActivate 指標建立媒體來源,請呼叫 IMFActivate::ActivateObject 方法。

範例

下列範例會列舉系統上的視訊擷取裝置,並針對清單中的第一個裝置建立媒體來源。

HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)
{
    *ppSource = NULL;

    IMFMediaSource *pSource = NULL;
    IMFAttributes *pAttributes = NULL;
    IMFActivate **ppDevices = NULL;

    // Create an attribute store to specify the enumeration parameters.
    HRESULT hr = MFCreateAttributes(&pAttributes, 1);
    if (FAILED(hr))
    {
        goto done;
    }

    // Source type: video capture devices
    hr = pAttributes->SetGUID(
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, 
        MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
        );
    if (FAILED(hr))
    {
        goto done;
    }

    // Enumerate devices.
    UINT32 count;
    hr = MFEnumDeviceSources(pAttributes, &ppDevices, &count);
    if (FAILED(hr))
    {
        goto done;
    }

    if (count == 0)
    {
        hr = E_FAIL;
        goto done;
    }

    // Create the media source object.
    hr = ppDevices[0]->ActivateObject(IID_PPV_ARGS(&pSource));
    if (FAILED(hr))
    {
        goto done;
    }

    *ppSource = pSource;
    (*ppSource)->AddRef();

done:
    SafeRelease(&pAttributes);

    for (DWORD i = 0; i < count; i++)
    {
        SafeRelease(&ppDevices[i]);
    }
    CoTaskMemFree(ppDevices);
    SafeRelease(&pSource);
    return hr;
}

規格需求

需求
最低支援的用戶端 Windows 7 [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2008 R2 [僅限傳統型應用程式]
目標平台 Windows
標頭 mfidl.h
程式庫 Mf.lib
Dll Mf.dll

另請參閱

媒體基礎中的音訊/視訊擷取

媒體基礎函式