无法在DirectShow中显示两个摄像机

Unable to display two cameras in DirectShow

本文关键字:两个 摄像机 显示 DirectShow      更新时间:2023-10-16

我使用两个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端口。