Enumerar dispositivos de captura de vídeo

Este tópico descreve como enumerar os dispositivos de captura de vídeo no sistema do usuário e como criar uma instância de um dispositivo.

Para enumerar os dispositivos de captura de vídeo no sistema, faça o seguinte:

  1. Chame MFCreateAttributes para criar um repositório de atributos. Esta função recebe um ponteiro IMFAttributes.
  2. Chame IMFAttributes::SetGUID para definir o atributo MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE Defina o valor do atributo como MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Chame MFEnumDeviceSources. Essa função recebe uma matriz de ponteiros IMFActivate e o tamanho da matriz. Cada ponteiro representa um dispositivo de captura de vídeo distinto.

Para criar uma instância de um dispositivo de captura, chame IMFActivate::ActivateObject para obter um ponteiro para IMFMediaSource.

Observação

O Windows permite que os usuários concedam ou neguem acesso à câmera do dispositivo no aplicativo Configurações do Windows, em Privacidade e Segurança -> Câmera. Ao inicializar o dispositivo de captura, os aplicativos devem verificar se têm acesso à câmera e lidar com o caso em que o acesso é negado pelo usuário. Para mais informações, consulte Manipular a configuração de privacidade da câmera do Windows.

O código a seguir mostra essas etapas:

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

Depois de criar a origem da mídia, solte os ponteiros da interface e libere a memória da matriz:

    SafeRelease(&pAttributes);

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

Captura de vídeo