Auflisten von Videoaufnahmegeräten

In diesem Thema wird beschrieben, wie Sie die Videoaufnahmegeräte auf dem System des Benutzers auflisten und eine instance eines Geräts erstellen.

Gehen Sie wie folgt vor, um die Videoaufnahmegeräte auf dem System aufzulisten:

  1. Rufen Sie MFCreateAttributes auf , um einen Attributspeicher zu erstellen. Diese Funktion empfängt einen IMFAttributes-Zeiger .
  2. Rufen Sie IMFAttributes::SetGUID auf, um das attribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE festzulegen. Legen Sie den Attributwert auf MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID fest.
  3. Rufen Sie MFEnumDeviceSources auf. Diese Funktion empfängt ein Array von IMFActivate-Zeigern und die Arraygröße. Jeder Zeiger stellt ein unterschiedliches Videoaufnahmegerät dar.

So erstellen Sie eine instance eines Erfassungsgeräts:

Diese Schritte sind im folgenden Code dargestellt:

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

Nachdem Sie eine Medienquelle erstellt haben, lassen Sie die Schnittstellenzeiger frei, und geben Sie den Speicher für das Array frei:

    SafeRelease(&pAttributes);

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

Videoaufnahme