2

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

2 回答 2

1

您对 2 个以上 USB 网络摄像头进行故障排除的第一个也是最好的猜测是达到 USB 带宽限制。使用 USB 视频,您有很高的机会点击它,尤其是。你提到的所有症状。请务必阅读之前的问题:

于 2013-03-23T09:41:03.010 回答
1

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

vlc.exe -> 媒体 -> opencapturecapture

如果你不能,然后开始钻研usb。可能是您的第二个 USB 相机正在被 USB 1.0 控制器拾取。我不认为它是directshow,因为我可以让多个摄像机与directshow一起工作。

我有同样的问题,它与 USB 带宽和 USB 控制器有关。尝试将相机也插入不同的 USB 端口。这可能会奏效。

于 2013-04-06T01:37:34.640 回答