Énumération des appareils de capture vidéo
Cette rubrique explique comment énumérer les appareils de capture vidéo sur le système de l’utilisateur et comment créer un instance d’un appareil.
Pour énumérer les appareils de capture vidéo sur le système, procédez comme suit :
- Appelez MFCreateAttributes pour créer un magasin d’attributs. Cette fonction reçoit un pointeur IMFAttributes .
- Appelez IMFAttributes::SetGUID pour définir l’attribut MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE . Définissez la valeur de l’attribut sur MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID.
- Appelez MFEnumDeviceSources. Cette fonction reçoit un tableau de pointeurs IMFActivate et la taille du tableau. Chaque pointeur représente un appareil de capture vidéo distinct.
Pour créer un instance d’un appareil de capture :
- Appelez IMFActivate::ActivateObject pour obtenir un pointeur vers l’interface IMFMediaSource .
Le code suivant illustre ces étapes :
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;
}
Après avoir créé la source multimédia, relâchez les pointeurs d’interface et libérez la mémoire du tableau :
SafeRelease(&pAttributes);
for (DWORD i = 0; i < count; i++)
{
SafeRelease(&ppDevices[i]);
}
CoTaskMemFree(ppDevices);
Rubriques connexes
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour