Enumerazione dei dispositivi di acquisizione video
Questo argomento descrive come enumerare i dispositivi di acquisizione video nel sistema dell'utente e come creare un'istanza di un dispositivo.
Per enumerare i dispositivi di acquisizione video nel sistema, eseguire le operazioni seguenti:
- Chiamare MFCreateAttributes per creare un archivio attributi. Questa funzione riceve un puntatore FMAttributes .
- Chiamare FMIAttributes::SetGUID per impostare l'attributo MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Impostare il valore dell'attributo su MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- Chiamare MFEnumDeviceSources. Questa funzione riceve una matrice di puntatori FMActivate e le dimensioni della matrice. Ogni puntatore rappresenta un dispositivo di acquisizione video distinto.
Per creare un'istanza di un dispositivo di acquisizione:
- Chiamare IMFActivate::ActivateObject per ottenere un puntatore all'interfaccia FMMediaSource .
Il codice seguente illustra questi passaggi:
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;
}
Dopo aver creato l'origine multimediale, rilasciare i puntatori dell'interfaccia e liberare la memoria per la matrice:
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
Argomenti correlati
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per