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:
- Rufen Sie MFCreateAttributes auf, um einen Attributspeicher zu erstellen. Diese Funktion empfängt einen POINTERAttributes-Zeiger.
- 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.
- 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:
- Rufen Sie DIE AKTIONACTIVATE::ActivateObject auf, um einen Zeiger auf die INTERFACESMediaSource-Schnittstelle abzurufen.
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);