Condividi tramite


Enumerazione dei dispositivi di acquisizione video

Questo argomento descrive come enumerare i dispositivi di acquisizione video nel sistema dell'utente e come creare un'istanza di un dispositivo.

Per enumerare i dispositivi di acquisizione video nel sistema, eseguire le operazioni seguenti:

  1. Chiamare MFCreateAttributes per creare un archivio attributi. Questa funzione riceve un puntatore IMFAttributes.
  2. Chiamare IMFAttributes::SetGUID per impostare l'attributo MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Impostare il valore dell'attributo su MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Chiama MFEnumDeviceSources. Questa funzione riceve una matrice di puntatori IMFActivate e le dimensioni della matrice. Ogni puntatore rappresenta un dispositivo di acquisizione video distinto.

Per creare un'istanza di un dispositivo di acquisizione, chiama IMFActivate::ActivateObject per ottenere un puntatore all'interfaccia IMFMediaSource.

Nota

Windows consente agli utenti di concedere o negare l'accesso alla fotocamera del dispositivo nell'app Impostazioni di Windows, in Privacy e sicurezza -> Fotocamera. Quando si inizializza il dispositivo di acquisizione, le app devono verificare se hanno accesso alla fotocamera e gestiscono il caso in cui l'accesso viene negato dall'utente. Per altre informazioni, vedere Gestire l'impostazione della privacy della fotocamera di Windows.

Nel codice seguente viene illustrata questa procedura:

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

Dopo aver creato l'origine multimediale, rilasciare i puntatori dell'interfaccia e liberare la memoria per la matrice:

    SafeRelease(&pAttributes);

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

Acquisizione video