Compartir a través de


Enumeración de dispositivos de captura de vídeo

En este tema se describe cómo enumerar los dispositivos de captura de vídeo en el sistema del usuario y cómo crear una instancia de un dispositivo.

Para enumerar los dispositivos de captura de vídeo del sistema, haga lo siguiente:

  1. Llame a MFCreateAttributes para crear un almacén de atributos. Esta función recibe un puntero IMFAttributes.
  2. Llame a IMFAttributes::SetGUID para establecer el atributo MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE. Establezca el valor de atributo en MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Llame a MFEnumDeviceSources. Esta función recibe una matriz de punteros IMFActivate y el tamaño de la matriz. Cada puntero representa un dispositivo de captura de vídeo distinto.

Para crear una instancia de un dispositivo de captura, llame a IMFActivate::ActivateObject para obtener un puntero a la interfaz IMFMediaSource.

Nota:

Windows permite a los usuarios conceder o denegar el acceso a la cámara del dispositivo en la aplicación Configuración de Windows, en Privacidad y seguridad -> Cámara. Al inicializar el dispositivo de captura, las aplicaciones deben comprobar si tienen acceso a la cámara y gestionar el caso en el que el acceso sea denegado por el usuario. Para obtener más información, consulte Manipular la configuración de privacidad de la cámara de Windows.

El siguiente código muestra estos pasos:

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

Después de crear el origen multimedia, libere los punteros de interfaz y la memoria de la matriz:

    SafeRelease(&pAttributes);

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

Captura de vídeo