我正在C++
创build一个webrtc-based
Windows应用C++
。 我正在尝试初始化一个对等peerconnection
。 我被卡在拿取相机的部分。 我正在使用以下代码来查找启动stream媒体的摄像机(从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
获得一个单一的条目(我的networking摄像头)的名字:
"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。 我的应用程序的整个日志可以在这个pastebin中find。 正如您所看到的,在尝试将相机分配为捕捉器并失败后,应用程序在videosource.cc
某个assert(capturer != NULL)
调用上videosource.cc
。
相机没有使用,也不是缺陷。 peerconnection
客户端示例完美工作,并使用相同的代码。 我想我错过了webrtc
初始化的一些步骤,但我无法find哪一步。
我正在debugging通过图书馆。 在第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;
。 我试图在那里硬编码,至less进入for循环。 然后当我进入info->GetDeviceName()
调用它显示我该函数的内容是return -1;
。
这两个函数意味着由一个从webrtc::VideoCaptureModule::DeviceInfo
inheritance的类来实现,所以显然有一些没有初始化的东西需要初始化。 试图拿到相机之前我还需要做些什么?
你链接了哪些库?
由于Google WebRTC源代码正在迅速变化,因此很难将问题追溯到源代码级别。
但是我记得当我不小心将外部捕获模块库(video_capture_module_impl ??)或者(我不确定)省略内部impl(video_capture_module_internal_impl ??)时发生了几乎相同的问题。