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

时间:2015-02-06 14:23:12

标签: c++ windows winapi webrtc

我正在webrtc-based为Windows创建C++个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中找到。正如您所看到的,在尝试将摄像头指定为捕获器并失败后,应用程序在assert(capturer != NULL)的某个地方videosource.cc呼叫时崩溃。

相机未使用,也没有缺陷。 peerconnection客户端示例完美运行并使用相同的代码。我想我在webrtc的初始化中缺少一些步骤,但我找不到哪一步。

使用其他信息进行编辑

我现在正在调试通过库。在第160行的webrtcvideocapturer.cc中是以下代码:

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;。我尝试在那里进行硬编码,至少进入for循环。然后,当我进入info->GetDeviceName()调用时,它会向我显示该函数的内容为return -1;

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

1 个答案:

答案 0 :(得分:1)

您链接了哪些图书馆?

由于Google WebRTC源代码正在快速变化,因此很难将问题追踪到源级别。

但是我记得当我意外地链接外部捕获模块库(video_capture_module_impl ??)或(我不确定)省略内部impl(video_capture_module_internal_impl ??)时发生了几乎相同的问题。