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 指针来查询描述设备的属性。 可以设置以下属性:

Attribute 说明
MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME 设备的显示名称。
MF_DEVSOURCE_ATTRIBUTE_MEDIA_TYPE 描述设备的输出格式的主要类型和子类型 GUID。
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 捕获设备的类型 (音频或视频) 。
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_ENDPOINT_ID 音频终结点 ID 字符串。 仅 (音频设备。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_CATEGORY 设备类别。 仅 (视频设备。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_HW_SOURCE 设备是硬件设备还是软件设备。 仅 (视频设备。)
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK 设备驱动程序的符号链接。 仅 (视频设备。)
 

若要从 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
Library Mf.lib
DLL Mf.dll

另请参阅

媒体基础中的音频/视频捕获

媒体基础函数