为什么 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 ??).
我正在为 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 ??).