Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEngineoraz Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture na platformie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]
Aby wybrać urządzenie do przechwytywania dźwięku lub wideo, użyj modułu wyliczającego urządzenia systemowego opisanego w temacie Using the System Device Enumerator. Wylicznik urządzeń systemowych zwraca kolekcję monikerów urządzeń wybranych według kategorii urządzeń. moniker to obiekt COM zawierający informacje o innym obiekcie. Program Monikers umożliwia aplikacji uzyskiwanie informacji o obiekcie bez faktycznego tworzenia obiektu. Później aplikacja może użyć monikera do utworzenia obiektu. Aby uzyskać więcej informacji na temat monikers, zobacz dokumentację IMoniker.
Aby użyć modułu wyliczającego urządzenia systemowego, wykonaj następujące kroki.
Wywołaj CoCreateInstance, aby utworzyć wystąpienie System Device Enumerator.
Wywołaj ICreateDevEnum::CreateClassEnumerator oraz określ kategorię urządzenia jako identyfikator GUID. W przypadku urządzeń do przechwytywania odpowiednie są następujące kategorie.
Identyfikator GUID kategorii Opis CLSID_AudioInputDeviceCategory Urządzenia do przechwytywania dźwięku CLSID_VideoInputDeviceCategory Urządzenia do przechwytywania wideo Jeśli kamera wideo ma zintegrowany mikrofon, pojawia się w obu kategoriach. Aparat i mikrofon są jednak traktowane jako oddzielne urządzenia przez system, na potrzeby wyliczenia, tworzenia urządzeń i przesyłania strumieniowego danych.
Metoda CreateClassEnumerator zwraca wskaźnik do interfejsu IEnumMoniker. Aby wyliczyć monikers, wywołaj IEnumMoniker::Next.
Poniższy kod tworzy moduł wyliczający dla określonej kategorii urządzeń.
#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;
}
Interfejs IEnumMoniker wylicza listę interfejsów IMoniker, z których każdy reprezentuje moniker urządzenia. Aplikacja może odczytywać właściwości z nazwy monikera lub użyć monikera, aby utworzyć filtr przechwytywania DirectShow dla urządzenia. Właściwości moniker są zwracane jako wartości VARIANT. Następujące właściwości są obsługiwane przez nazwy identyfikacyjne urządzeń.
| Własność | Opis | TYP WARIANTU |
|---|---|---|
| PrzyjaznaNazwa | Nazwa urządzenia. | VT_BSTR |
| Opis | Opis urządzenia. | VT_BSTR |
| DevicePath | Unikatowy ciąg identyfikujący urządzenie. (Tylko urządzenia do przechwytywania wideo). | VT_BSTR |
| "WaveInID" | Identyfikator urządzenia do przechwytywania dźwięku. (Tylko urządzenia do przechwytywania audio). | VT_I4 |
Właściwości "FriendlyName" i "Description" są odpowiednie do wyświetlania w interfejsie użytkownika.
- Właściwość "FriendlyName" jest dostępna dla każdego urządzenia. Zawiera on czytelną dla człowieka nazwę urządzenia.
- Właściwość „Opis” jest dostępna tylko dla kamer DV i D-VHS/MPEG. Aby uzyskać więcej informacji, zobacz sterowniki MSDV i sterownik MSTape . Jeśli jest dostępna, zawiera opis urządzenia, który jest bardziej szczegółowy niż właściwość "FriendlyName". Zazwyczaj zawiera nazwę dostawcy.
- Właściwość "DevicePath" nie jest ciągiem czytelnym dla człowieka, ale gwarantuje, że będzie unikatowa dla każdego urządzenia do przechwytywania wideo w systemie. Za pomocą tej właściwości można odróżnić co najmniej dwa wystąpienia tego samego modelu urządzenia.
- Jeśli właściwość "WaveInID" jest obecna, oznacza to, że filtr przechwytywania DirectShow używa wewnętrznie interfejsów API Waveform Audio do komunikacji z urządzeniem. Wartość właściwości "WaveInID" odpowiada identyfikatorowi używanemu przez funkcje waveIn*, takie jak waveInOpen.
Aby odczytać właściwości z monikera, wykonaj następujące kroki.
- Wywołaj IMoniker::BindToStorage, aby uzyskać wskaźnik do interfejsu IPropertyBag.
- Wywołaj IPropertyBag::Read, aby odczytać właściwość.
W poniższym przykładzie kodu pokazano, jak wyliczyć listę identyfikatorów urządzeń i pobrać ich właściwości.
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();
}
}
Aby utworzyć filtr przechwytywania DirectShow dla urządzenia, wywołaj metodę IMoniker::BindToObject, aby uzyskać wskaźnik IBaseFilter. Następnie wywołaj IFilterGraph::AddFilter, aby dodać filtr do wykresu filtru:
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}
Tematy pokrewne