Énumération des appareils de capture vidéo

Cette rubrique explique comment énumérer les appareils de capture vidéo sur le système de l’utilisateur et comment créer un instance d’un appareil.

Pour énumérer les appareils de capture vidéo sur le système, procédez comme suit :

  1. Appelez MFCreateAttributes pour créer un magasin d’attributs. Cette fonction reçoit un pointeur IMFAttributes .
  2. Appelez IMFAttributes::SetGUID pour définir l’attribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Définissez la valeur de l’attribut sur MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Appelez MFEnumDeviceSources. Cette fonction reçoit un tableau de pointeurs IMFActivate et la taille du tableau. Chaque pointeur représente un appareil de capture vidéo distinct.

Pour créer un instance d’un appareil de capture :

Le code suivant illustre ces étapes :

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

Après avoir créé la source multimédia, relâchez les pointeurs d’interface et libérez la mémoire du tableau :

    SafeRelease(&pAttributes);

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

Capture vidéo