【问题标题】:Unable to display two cameras in DirectShow无法在 DirectShow 中显示两个摄像头
【发布时间】:2013-03-22 23:22:34
【问题描述】:

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

【问题讨论】:

    标签: c++ camera directshow samplegrabber


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      vlc.exe -> 媒体 -> opencapturecapture

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

      我遇到了同样的问题,它与 USB 带宽和 USB 控制器有关。尝试将摄像头也插入不同的 USB 端口。这可能会起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 2019-09-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 2013-08-17
        • 1970-01-01
        相关资源
        最近更新 更多