本文內容
若要選擇音頻或視頻捕獲設備,請使用 系統設備枚舉器,如“ 使用系統設備枚舉器”主題中所述。 系統設備枚舉器返回設備名字對象集合,由設備類別選擇。 名字對象是包含有關另一個對象的信息的 COM 對象。 名字對象使應用程序能夠獲取有關對象的信息,而無需實際創建對象。 稍后,應用程序可以使用名字對象創建對象。 有關名字對象的詳細信息,請參閱 的文檔。
若要使用系統設備枚舉器,請執行以下步驟。
調用 以創建系統設備枚舉器的實例。
調用 ::r ,并將設備類別指定為 GUID。 對于捕獲設備,以下類別是相關的。
類別 GUID說明
音頻捕獲設備
視頻捕獲設備
如果攝像機具有集成麥克風攝像頭創建設備枚舉器錯誤,則會在這兩個類別中顯示。 但是,出于枚舉、設備創建和數據流的目的,相機和麥克風被系統視為單獨的設備。
r 方法返回指向 接口的指針。 若要枚舉名字對象攝像頭創建設備枚舉器錯誤,請調用 ::Next。
以下代碼為指定的設備類別創建枚舉器。
#include
#include
#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;
}
接口枚舉 接口的列表,其中每個接口都表示設備名字對象。 應用程序可以從名字對象讀取屬性,或使用名字對象為設備創建捕獲篩選器。 名字對象屬性作為 值返回。 設備名字對象支持以下屬性。
說明 類型
“”
設備的名稱。
“說明”
設備的說明。
“”
標識設備的唯一字符串。 僅 (視頻捕獲設備。)
“”
音頻捕獲設備的標識符。 僅 (音頻捕獲設備。)
VT_I4
“”和“”屬性適合在 UI 中顯示。
若要從名字對象讀取屬性,請執行以下步驟。
調用 :: 以獲取指向 接口的指針。調用 ::Read 以讀取屬性。
下面的代碼示例演示如何枚舉設備名字對象列表并獲取屬性。
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();
}
}
若要為設備創建捕獲篩選器,請調用 :: 方法以獲取 指針。 然后調用 :: 將篩選器添加到篩選器圖:
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCap);
if (SUCCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}
相關主題
音頻捕獲
視頻捕獲