Aufzählen von Videoaufnahmegeräten

In diesem Thema wird beschrieben, wie die Videoaufzeichnungsgeräte auf dem System des Benutzers aufzählt und wie eine Instanz eines Geräts erstellt wird.

Gehen Sie wie folgt vor, um die Videoaufzeichnungsgeräte auf dem System aufzuzählen:

  1. Rufen Sie MFCreateAttributes auf, um einen Attributspeicher zu erstellen. Diese Funktion empfängt einen POINTERAttributes-Zeiger.
  2. Rufen Sie DIE ATTRIBUTEAttributes::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 POINTERActivate-Zeigern und die Arraygröße. Jeder Zeiger stellt ein eigenes Videoaufnahmegerät dar.

So erstellen Sie eine Instanz 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;
}

Geben Sie nach dem Erstellen der Medienquelle die Schnittstellenzeiger frei, und geben Sie den Arbeitsspeicher für das Array frei:

    SafeRelease(&pAttributes);

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

Videoaufnahme