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

时间:2013-03-22 23:22:34

标签: c++ camera directshow samplegrabber

我正在使用两个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);

2 个答案:

答案 0 :(得分:0)

您的第一个也是最好的猜测故障排除2+ USB网络摄像头正在达到USB带宽限制。使用USB视频,您有很高的机会获得它,特别是。你提到的所有症状。请务必阅读以前的问题:

答案 1 :(得分:0)

这很可能与USB硬件有关。下载vlc并检查是否可以在两个不同的vlc实例上从两个摄像头获取视频。

vlc.exe - &gt;媒体 - &gt; opencapturecapture

如果你不能再开始钻进usb。可能是你的第二台usb摄像机被一台usb 1.0控制器拿起。我不认为这是directshow因为我可以让多个摄像头与directshow一起工作。

我遇到了同样的问题,它与usb带宽和usb控制器有关。尝试将摄像头插入不同的USB端口以及可能有效的。