Aufzählen von Videoaufnahmegeräten
In diesem Thema wird beschrieben, wie Sie die Videoaufnahmegeräte auf dem Benutzersystem auflisten und wie sie eine Instance eines Geräts erstellen.
Führen Sie zum Aufzählen der Videoaufnahmegeräte im System die folgenden Schritte aus:
- Rufen Sie MFCreateAttributes auf, um einen Attributspeicher zu erstellen. Diese Funktion empfängt einen IMFAttributes-Zeiger.
- Rufen Sie IMFAttributes::SetGUID auf, um das MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE-Attribut festzulegen. Legen Sie den Attributwert auf MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID fest.
- Aufrufen von MFEnumDeviceSources. Diese Funktion empfängt ein Array von IMFActivate-Zeigern und die Arraygröße. Jeder Zeiger stellt ein unterschiedliches Videoaufnahmegerät dar.
Rufen Sie zum Erstellen einer Instance eines Aufnahmegeräts IMFActivate::ActivateObject auf, um einen Zeiger auf die IMFMediaSource-Schnittstelle abzurufen.
Hinweis
Windows ermöglicht Benutzern das Gewähren oder Verweigern des Zugriffs auf die Kamera des Geräts in der Windows-Einstellungs-App unter Datenschutz und Sicherheit –> Kamera. Bei der Initialisierung des Aufnahmegeräts sollten Anwendungen prüfen, ob sie Zugriff auf die Kamera haben, und den Fall behandeln, dass der Zugriff vom Benutzer verweigert wird. Weitere Informationen finden Sie unter Behandeln der Datenschutzeinstellung der Windows-Kamera.
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 die Medienquelle erstellt haben, geben Sie die Schnittstellenzeiger frei und geben den Speicher für das Array frei:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
Zugehörige Themen