我正在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
的类实现的,所以显然有些东西没有被初始化,需要初始化。在尝试拿相机之前我还需要做些什么?
答案 0 :(得分:1)
您链接了哪些图书馆?
由于Google WebRTC源代码正在快速变化,因此很难将问题追踪到源级别。
但是我记得当我意外地链接外部捕获模块库(video_capture_module_impl ??)或(我不确定)省略内部impl(video_capture_module_internal_impl ??)时发生了几乎相同的问题。