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

标签 c++ camera directshow samplegrabber

我使用两个在单独线程上运行的 DirectShow 图形来显示流视频(在单独的线程上使用 VMR 9)并从两个网络摄像头捕获帧(使用 Sample Grabber)。其中一个是内置网络摄像头 (HP TrueVision HD),另一个是连接到 USB 端口的 Creative VF0520。其他 USB 端口均未使用。

问题是 Creative 相机打开(LED 亮起),但没有流通过。即使我禁用内置网络摄像头,问题仍然存在。但是,如果在 Creative cam 是唯一连接的相机的桌面上运行,Creative cam 就可以工作。

当每个摄像头都是唯一连接的摄像头时,该程序可以工作(Creative VF0520 当它是唯一连接到桌面的摄像头时,该程序可以工作),但是当连接两个摄像头时,视频显示和帧抓取仅适用于内置摄像头。在网络摄像头中。

我怀疑问题可能是由捕获过滤器的名字绑定(bind)引起的。我正在使用 MSDN 中的修改后的代码。这是绑定(bind)名字来捕获多个摄像机的滤镜的正确方法吗?

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;
}

然后访问包含名字的 vector 以绑定(bind)到捕获过滤器:

hr = listMonikers[CAMERA_ID]->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pCap);

最佳答案

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

关于c++ - 无法在 DirectShow 中显示两个摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581396/

相关文章:

c++ - 用仿函数错误排序

c++ - String At 函数运行时错误

iphone - 有时 UIImageView 似乎拒绝使用 iPhone 相机拍摄的图像

camera - 使用ZXing为javascript表单相机检测多个QR码

c++ - 如何使用/安装自定义 Directshow 过滤器

c++ - OpenCV cvSaveImage Jpeg 压缩因子

当我在真正的三星 galaxy s3 上拍照时 Android 崩溃

c++ - 将 FFDShow 编码为 DirectShow 图形以进行去隔行扫描?

c++ - 用于 ip-camera 的 DirectShow 过滤器

c++ - 在带有斜杠的路径上返回std::filesystem::create_directories()的值