Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
- Wywołaj metodę MFCreateAttributes , aby utworzyć magazyn atrybutów. Ta funkcja otrzymuje wskaźnik IMFAttributes .
- Wywołaj metodę IMFAttributes::SetGUID , aby ustawić atrybut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Ustaw wartość atrybutu na MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- 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);
Tematy pokrewne