无法在DirectShow中显示两个摄像机
Unable to display two cameras in DirectShow
我使用两个DirectShow图形,在单独的线程上运行,从两个网络摄像头显示流视频(使用单独的VMR 9)和捕获帧(使用Sample Grabber)。其中一款是内置网络摄像头(HP TrueVision HD),另一款是连接USB端口的Creative VF0520。其他USB接口均未被使用。
问题是创意相机打开(LED灯亮),但没有流通过。即使我关闭了内置摄像头,这个问题仍然存在。但是,如果在桌面上运行,则Creative cam是唯一连接的相机,则Creative cam可以工作。
该程序工作时,每个摄像头是唯一连接(创意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);
您的第一个和最好的猜测故障排除2+ USB网络摄像头是达到USB带宽限制。使用USB视频,你有很高的机会击中它,特别是你提到的所有症状。请务必阅读之前关于此问题的问答:
- 使用DirectShow同时运行多个网络摄像头
- 2个usb摄像头不支持opencv
- 使用大量USB网络摄像头的影响
这很可能与USB硬件有关。下载VLC并检查是否可以在2个不同的VLC实例上从两个摄像机获得视频。
vlc.exe -> media -> opencapturecapture
如果你不能,然后开始钻usb。这可能是你的第二个usb相机被usb 1.0控制器拾取。我不认为它是directshow,因为我可以让多个相机与directshow一起工作。
我有同样的问题,它与usb带宽和usb控制器有关。尝试将相机插入不同的usb端口。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 比较两个大小不等的映射c++
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 如何在for循环中包含两个索引值的测试条件
- 在声明中合并两个常量"std::set"(不是在运行时)
- 无法在DirectShow中显示两个摄像机