Menghitung Perangkat Pengambilan Video
Topik ini menjelaskan cara menghitung perangkat pengambilan video pada sistem pengguna, dan cara membuat instans perangkat.
Untuk menghitung perangkat pengambilan video pada sistem, lakukan hal berikut:
- Panggil MFCreateAttributes untuk membuat penyimpanan atribut. Fungsi ini menerima penunjuk IMFAttributes .
- Panggil IMFAttributes::SetGUID untuk mengatur atribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Atur nilai atribut ke MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- Panggil MFEnumDeviceSources. Fungsi ini menerima array pointer IMFActivate dan ukuran array. Setiap pointer mewakili perangkat pengambilan video yang berbeda.
Untuk membuat instans perangkat pengambilan, panggil IMFActivate::ActivateObject untuk mendapatkan pointer ke antarmuka IMFMediaSource.
Catatan
Windows memungkinkan pengguna untuk memberikan atau menolak akses ke kamera perangkat di aplikasi Pengaturan Windows, di bawah Privasi & Keamanan -> Kamera. Saat menginisialisasi perangkat pengambilan, aplikasi harus memeriksa apakah mereka memiliki akses ke kamera dan menangani kasus di mana akses ditolak oleh pengguna. Untuk informasi selengkapnya, lihat Menangani pengaturan privasi kamera Windows.
Kode berikut menunjukkan langkah-langkah ini:
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;
}
Setelah Anda membuat sumber media, lepaskan penunjuk antarmuka dan bebaskan memori untuk array:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
Topik terkait