Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
[De functie die is gekoppeld aan deze pagina, DirectShow, is een verouderde functie. Het is vervangen door MediaPlayer, IMFMediaEngineen Audio/Video Capture in Media Foundation. Deze functies zijn geoptimaliseerd voor Windows 10 en Windows 11. Microsoft raadt ten zeerste aan om nieuwe code te gebruiken MediaPlayer, IMFMediaEngine en Audio/Video Capture in Media Foundation in plaats van DirectShow, indien mogelijk. Microsoft stelt voor dat bestaande code die gebruikmaakt van de verouderde API's, indien mogelijk opnieuw worden geschreven om de nieuwe API's te gebruiken.]
Als u een apparaat voor audio- of video-opname wilt selecteren, gebruikt u de System Device Enumerator, zoals beschreven in het onderwerp Using the System Device Enumerator. De System Device Enumerator retourneert een verzameling apparaat monikers, geselecteerd op apparaatcategorie. Een moniker is een COM-object dat informatie over een ander object bevat. Monikers stellen de toepassing in staat informatie over een object op te halen zonder het object daadwerkelijk te maken. Later kan de toepassing de moniker gebruiken om het object te maken. Zie de documentatie voor IMonikervoor meer informatie over monikers.
Voer de volgende stappen uit om de Enumerator van het systeemapparaat te gebruiken.
Roep CoCreateInstance- aan om een exemplaar van de System Device Enumerator te maken.
Roep ICreateDevEnum::CreateClassEnumerator aan en geef de apparaatcategorie op als een GUID. Voor opnameapparaten zijn de volgende categorieën relevant.
Categorie-GUID Beschrijving CLSID_AudioInputDeviceCategory Audio-opnameapparaten CLSID_VideoInputDeviceCategory Video-opnameapparaten Als een videocamera een geïntegreerde microfoon heeft, wordt deze in beide categorieën weergegeven. De camera en microfoon worden echter behandeld als afzonderlijke apparaten door het systeem, voor inventarisatie, het maken van apparaten en het streamen van gegevens.
De methode CreateClassEnumerator retourneert een aanwijzer naar de interface IEnumMoniker. Om de monikers op te sommen, roept u IEnumMoniker::Nextaan.
Met de volgende code wordt een opsomming voor een opgegeven apparaatcategorie gemaakt.
#include <windows.h>
#include <dshow.h>
#pragma comment(lib, "strmiids")
HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum)
{
// Create the System Device Enumerator.
ICreateDevEnum *pDevEnum;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum));
if (SUCCEEDED(hr))
{
// Create an enumerator for the category.
hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0);
if (hr == S_FALSE)
{
hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error.
}
pDevEnum->Release();
}
return hr;
}
De IEnumMoniker interface bevat een lijst met IMoniker interfaces, die elk een apparaat moniker vertegenwoordigen. De toepassing kan eigenschappen van de moniker lezen of de moniker gebruiken om een DirectShow-opnamefilter voor het apparaat te maken. Moniker-eigenschappen worden teruggegeven als VARIANT waarden. De volgende eigenschappen worden ondersteund door apparaatnamen.
| Eigenschap | Beschrijving | VARIANTtype |
|---|---|---|
| VriendelijkeNaam | De naam van het apparaat. | VT_BSTR |
| "Beschrijving" | Een beschrijving van het apparaat. | VT_BSTR |
| DevicePath | Een unieke tekenreeks die het apparaat identificeert. (Alleen video-opnameapparaten.) | VT_BSTR |
| "WaveInID" | De identifier voor een audio-opname-apparaat. (Alleen audio-opnameapparaten.) | VT_I4 |
De eigenschappen 'FriendlyName' en 'Description' zijn geschikt voor weergave in een gebruikersinterface.
- De eigenschap FriendlyName is beschikbaar voor elk apparaat. Het bevat een door mensen leesbare naam voor het apparaat.
- De eigenschap Beschrijving is alleen beschikbaar voor DV- en D-VHS-/MPEG-webcamapparaten. Zie MSDV-stuurprogramma en MSTape-stuurprogrammavoor meer informatie. Indien beschikbaar, bevat het een beschrijving van het apparaat dat specifieker is dan de eigenschap 'FriendlyName'. Meestal bevat het de naam van de leverancier.
- De eigenschap DevicePath is geen door mensen leesbare tekenreeks, maar is gegarandeerd uniek voor elk video-opnameapparaat op het systeem. U kunt deze eigenschap gebruiken om onderscheid te maken tussen twee of meer exemplaren van hetzelfde apparaatmodel.
- Als de eigenschap WaveInID aanwezig is, betekent dit dat het DirectShow-opnamefilter de Waveform Audio API's intern gebruikt om met het apparaat te communiceren. De waarde van de eigenschap WaveInID komt overeen met de id die wordt gebruikt door de waveIn* functies, zoals waveInOpen.
Voer de volgende stappen uit om eigenschappen van de moniker te lezen.
- Roep IMoniker::BindToStorage- aan om een aanwijzer te krijgen naar de IPropertyBag interface.
- Roep IPropertyBag::Read aan om de eigenschap te lezen.
In het volgende codevoorbeeld ziet u hoe u een lijst met apparaatmonikers kunt opsommen en de eigenschappen kunt ophalen.
void DisplayDeviceInformation(IEnumMoniker *pEnum)
{
IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
if (FAILED(hr))
{
pMoniker->Release();
continue;
}
VARIANT var;
VariantInit(&var);
// Get description or friendly name.
hr = pPropBag->Read(L"Description", &var, 0);
if (FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &var, 0);
}
if (SUCCEEDED(hr))
{
printf("%S\n", var.bstrVal);
VariantClear(&var);
}
hr = pPropBag->Write(L"FriendlyName", &var);
// WaveInID applies only to audio capture devices.
hr = pPropBag->Read(L"WaveInID", &var, 0);
if (SUCCEEDED(hr))
{
printf("WaveIn ID: %d\n", var.lVal);
VariantClear(&var);
}
hr = pPropBag->Read(L"DevicePath", &var, 0);
if (SUCCEEDED(hr))
{
// The device path is not intended for display.
printf("Device path: %S\n", var.bstrVal);
VariantClear(&var);
}
pPropBag->Release();
pMoniker->Release();
}
}
void main()
{
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(hr))
{
IEnumMoniker *pEnum;
hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum);
if (SUCCEEDED(hr))
{
DisplayDeviceInformation(pEnum);
pEnum->Release();
}
hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum);
if (SUCCEEDED(hr))
{
DisplayDeviceInformation(pEnum);
pEnum->Release();
}
CoUninitialize();
}
}
Als u een DirectShow-opnamefilter voor het apparaat wilt maken, roept u de methode IMoniker::BindToObject aan om een IBaseFilter- aanwijzer op te halen. Roep vervolgens IFilterGraph::AddFilter aan om het filter toe te voegen aan de filtergrafiek:
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}
Verwante onderwerpen