Enumerar dispositivos de captura de vídeo
Este tópico descreve como enumerar os dispositivos de captura de vídeo no sistema do usuário e como criar uma instância de um dispositivo.
Para enumerar os dispositivos de captura de vídeo no sistema, faça o seguinte:
- Chame MFCreateAttributes para criar um repositório de atributos. Esta função recebe um ponteiro IMFAttributes.
- Chame IMFAttributes::SetGUID para definir o atributo MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE Defina o valor do atributo como MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- Chame MFEnumDeviceSources. Essa função recebe uma matriz de ponteiros IMFActivate e o tamanho da matriz. Cada ponteiro representa um dispositivo de captura de vídeo distinto.
Para criar uma instância de um dispositivo de captura, chame IMFActivate::ActivateObject para obter um ponteiro para IMFMediaSource.
Observação
O Windows permite que os usuários concedam ou neguem acesso à câmera do dispositivo no aplicativo Configurações do Windows, em Privacidade e Segurança -> Câmera. Ao inicializar o dispositivo de captura, os aplicativos devem verificar se têm acesso à câmera e lidar com o caso em que o acesso é negado pelo usuário. Para mais informações, consulte Manipular a configuração de privacidade da câmera do Windows.
O código a seguir mostra essas etapas:
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;
}
Depois de criar a origem da mídia, solte os ponteiros da interface e libere a memória da matriz:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
Tópicos relacionados