为什么 webrtc 找不到它建议的捕获器?

Why can't webrtc find the capturer it suggested?

我正在为 C++ 中的 windows 创建一个 webrtc-based voip 应用程序。我正在尝试初始化 peerconnection。我被困在取相机的地方。我正在使用以下代码查找相机以开始流媒体(从 peerconnection 客户端示例复制):

rtc::scoped_ptr<cricket::DeviceManagerInterface> dev_manager(cricket::DeviceManagerFactory::Create());
if (!dev_manager->Init()) {
    LOG(LS_ERROR) << "Can't create device manager";
    return NULL;
}
std::vector<cricket::Device> devs;
if (!dev_manager->GetVideoCaptureDevices(&devs)) {
    LOG(LS_ERROR) << "Can't enumerate video devices";
    return NULL;
}
std::vector<cricket::Device>::iterator dev_it = devs.begin();
cricket::VideoCapturer* capturer = NULL;
for (; dev_it != devs.end(); ++dev_it) {
    capturer = dev_manager->CreateVideoCapturer(*dev_it);
    if (capturer != NULL)
        break;
}

capturer 在此过程后为空。我逐步查看代码以查看问题所在。 dev_manager 已成功初始化,devs 获得一个名称为:

的条目(我的网络摄像头)
"logitech HD webcam c270"

还有一个 ID:

"\\?\usb#vid_046d&pid_0825&mi_00#7&2dbd1a82&1&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{bbefb6c7-2fc4-4139-bb8b-a58bba724083}"

但是在CreateVideoCapturer()调用之后,capturer仍然是空的。我在控制台中收到一条警告:

Warning(webrtcvideocapturer.cc:175): Failed to find capturer for id: \?\usb#vid_046d&pid_0825&mi_00#7&2dbd1a82&1&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{bbefb6c7-2fc4-4139-bb8b-a58bba724083}

我检查了我在 devs 中获得的 ID 是否匹配,他们匹配。我的应用程序的完整日志可以在 this pastebin 中找到。如您所见,在尝试将相机指定为捕获器并失败后,应用程序在 videosource.cc 中某处的 assert(capturer != NULL) 调用时崩溃。

相机未使用,也不是故障。 peerconnection 客户端示例完美运行并使用相同的代码。我想我在 webrtc 的初始化中遗漏了一些步骤,但我找不到哪一步。

编辑附加信息

我正在逐步调试库。在webrtcvideocapturer.cc中第160行左右是以下代码:

int num_cams = info->NumberOfDevices();
char vcm_id[256] = "";
bool found = false;
for (int index = 0; index < num_cams; ++index) {
  char vcm_name[256];
  int32 i = info->GetDeviceName(index, vcm_name, ARRAY_SIZE(vcm_name), vcm_id, ARRAY_SIZE(vcm_id));
  if (i != -1) {
    if (device.name == reinterpret_cast<char*>(vcm_name)) {
      found = true;
      break;
    }
  }
}
if (!found) {
  LOG(LS_WARNING) << "Failed to find capturer for id: " << device.id;
  factory_->DestroyDeviceInfo(info);
  return false;
}

这部分有两个问题。首先,如果我进入 info->NumberOfDevices(),它会告诉我该函数的唯一内容是行 return 0;。我尝试在那里对 1 进行硬编码,以至少进入 for 循环。然后,当我进入 info->GetDeviceName() 调用时,它显示该函数的内容是 return -1;.

这两个函数本来是要由一个继承自webrtc::VideoCaptureModule::DeviceInfo的class来实现的,所以显然有一些没有初始化的东西需要初始化。在尝试购买相机之前我还需要做什么?

您 link 使用了哪些库?

因为GoogleWebRTC 源代码变化很快,很难将问题追查到源代码级别。

但我记得当我不小心 linked 外部捕获模块库 (video_capture_module_impl ??) 或 (我不确定) 省略了内部实现 (video_capture_module_internal_impl ??).