我正在使用两个 DirectShow 图表,在不同的线程上运行,以显示流视频(单独使用 VMR 9)并从两个网络摄像头捕获帧(使用 Sample Grabber)。其中一个是内置网络摄像头 (HP TrueVision HD),另一个是连接到 USB 端口的 Creative VF0520。其他 USB 端口均未使用。
问题是 Creative 相机打开(LED 亮起),但没有流通过。即使我禁用了内置网络摄像头,问题仍然存在。但是,如果在只有 Creative cam 连接的摄像头的桌面上运行,Creative cam 可以正常工作。
该程序在每个摄像头是唯一连接的情况下工作(Creative VF0520 在它是唯一连接到桌面的摄像头时工作),但是当连接两个摄像头时,视频显示和抓帧仅适用于内置网络摄像头。
我怀疑这个问题可能来自与捕获过滤器的名字对象绑定。我正在使用来自MSDN的修改代码。这是绑定绰号以捕获多个相机的过滤器的正确方法吗?
ULONG VideoPlayer::GetMonikers(IEnumMoniker *pEnum, std::vector<IMoniker *> *pListMonikers)
{
ULONG numRetrieved = 0;
IMoniker* pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, &numRetrieved) == S_OK)
{
// Bind to vector
pListMonikers->push_back(pMoniker);
IPropertyBag *pPropBag;
HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag));
if (FAILED(hr))
{
(*ppMoniker)->Release();
continue;
}
// Get information to display
pPropBag->Release();
}
return numRetrieved;
}
然后访问包含名字对象的向量以绑定到捕获过滤器:
hr = listMonikers[CAMERA_ID]->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pCap);