枚举视频捕获设备

本主题介绍了如何枚举用户系统上的视频捕获设备以及如何创建设备的实例。

若要枚举系统上的视频捕获设备,请执行以下操作:

  1. 调用 MFCreateAttributes 以创建属性存储。 此函数接收 IMFAttributes 指针。
  2. 调用 IMFAttributes::SetGUID 以设置 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE 属性。 将属性值设置为 MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID
  3. 调用 MFEnumDeviceSources。 此函数接收 IMFActivate 指针数组和数组大小。 每个指针表示一个不同的视频捕获设备。

若要创建捕获设备的实例,请调用 IMFActivate::ActivateObject 以获取指向 IMFMediaSource 接口的指针。

注意

Windows 允许用户在 Windows“设置”应用中的“隐私和安全”->“相机”下授予或拒绝访问 设备的相机。 初始化捕获设备时,应用应检查他们是否能够访问相机并处理用户拒绝访问的情况。 有关详细信息,请参阅处理 Windows 相机隐私设置

以下代码演示了这些步骤:

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;
}

在创建媒体源后,请释放接口指针并释放数组的内存:

    SafeRelease(&pAttributes);

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

视频捕获