Udostępnij przez


Wyliczanie urządzeń do przechwytywania wideo

W tym temacie opisano, jak wyliczyć urządzenia do przechwytywania wideo w systemie użytkownika oraz jak utworzyć wystąpienie urządzenia.

Aby wyliczyć urządzenia do przechwytywania wideo w systemie, wykonaj następujące czynności:

  1. Wywołaj metodę MFCreateAttributes , aby utworzyć magazyn atrybutów. Ta funkcja otrzymuje wskaźnik IMFAttributes .
  2. Wywołaj metodę IMFAttributes::SetGUID , aby ustawić atrybut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Ustaw wartość atrybutu na MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
  3. Wywołaj MFEnumDeviceSources. Ta funkcja otrzymuje tablicę wskaźników IMFActivate oraz jej rozmiar. Każdy wskaźnik reprezentuje odrębne urządzenie do przechwytywania wideo.

Aby utworzyć instancję urządzenia przechwytywania, wywołaj metodę IMFActivate::ActivateObject, aby uzyskać wskaźnik do interfejsu IMFMediaSource.

Uwaga / Notatka

System Windows umożliwia użytkownikom udzielanie lub odmawianie dostępu do aparatu urządzenia w ustawieniach systemu Windows w obszarze Prywatność i zabezpieczenia —> aparat fotograficzny. Podczas inicjowania urządzenia do przechwytywania aplikacje powinny sprawdzać, czy mają dostęp do aparatu, i obsługiwać przypadek odmowy dostępu przez użytkownika. Aby uzyskać więcej informacji, zobacz Handle the Windows camera privacy setting (Obsługa ustawienia prywatności aparatu systemu Windows).

Poniższy kod przedstawia następujące kroki:

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

Po utworzeniu źródła multimediów zwolnij wskaźniki interfejsu i zwolnij pamięć dla tablicy:

    SafeRelease(&pAttributes);

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

Przechwytywanie wideo