Partager via


Énumérer les 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 une instance d’un appareil.

Pour énumérer les périphériques 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’attributMF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE. Définissez la valeur d’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 périphérique de capture vidéo distinct.

Pour créer une instance d’un périphérique de capture, appelez IMFActivate::ActivateObject pour obtenir un pointeur vers l’interface IMFMediaSource.

Remarque

Windows permet aux utilisateurs d’accorder ou de refuser l’accès à la caméra de l’appareil dans l’application Paramètres Windows, sous Confidentialité et Sécurité -> Caméra. Lors de l’initialisation du périphérique de capture, les applications doivent vérifier s’ils ont accès à la caméra et gérer le cas où l’accès est refusé par l’utilisateur. Pour plus d’informations, consultez Gérer le paramètre de confidentialité de la caméra Windows.

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éé une 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