在启动捕获设备时,为每个设备分配唯一名称,以避免重复命名导致的错误。以下是使用DirectShow库中的示例代码,为多个摄像头设备分配唯一名称的方法:
//获取摄像头设备枚举器
ICreateDevEnum *pDevEnum = NULL;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast(&pDevEnum));
if (FAILED(hr))
{
//错误处理
}
//枚举摄像头设备并分配唯一名称
IEnumMoniker *pEnum = NULL;
hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEnum, 0);
if (hr == S_OK)
{
ULONG cFetched;
int i = 0;
IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
//为每个设备分配唯一名称
WCHAR wszUniqueName[MAX_PATH];
wsprintf(wszUniqueName, L"Device%d", i++);
//获取摄像头设备的对象指针
IBaseFilter *pFilter = NULL;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
reinterpret_cast(&pFilter));
if (SUCCEEDED(hr))
{
//将设备添加到DirectShow图形
hr = g_pGraph->AddFilter(pFilter, wszUniqueName);
//...
}
pMoniker->Release();
pFilter->Release();
}
pEnum->Release();
}
pDevEnum->Release();