我使用两个在单独线程上运行的 DirectShow 图形来显示流视频(在单独的线程上使用 VMR 9)并从两个网络摄像头捕获帧(使用 Sample Grabber)。其中一个是内置网络摄像头 (HP TrueVision HD),另一个是连接到 USB 端口的 Creative VF0520。其他 USB 端口均未使用。
问题是 Creative 相机打开(LED 亮起),但没有流通过。即使我禁用内置网络摄像头,问题仍然存在。但是,如果在 Creative cam 是唯一连接的相机的桌面上运行,Creative cam 就可以工作。
当每个摄像头都是唯一连接的摄像头时,该程序可以工作(Creative VF0520 当它是唯一连接到桌面的摄像头时,该程序可以工作),但是当连接两个摄像头时,视频显示和帧抓取仅适用于内置摄像头。在网络摄像头中。
我怀疑问题可能是由捕获过滤器的名字绑定(bind)引起的。我正在使用 MSDN 中的修改后的代码。这是绑定(bind)名字来捕获多个摄像机的滤镜的正确方法吗?
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;
}
然后访问包含名字的 vector 以绑定(bind)到捕获过滤器:
hr = listMonikers[CAMERA_ID]->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pCap);
最佳答案
对 2 个以上 USB 网络摄像头进行故障排除时,您的第一个也是最好的猜测是达到了 USB 带宽限制。对于 USB 视频,您有很高的机会实现它,尤其是。有你提到的所有症状。请务必阅读之前的问题:
关于c++ - 无法在 DirectShow 中显示两个摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581396/