尝试连接 USB 摄像头(Kinect)时出现“无法声明摄像头接口:-6”

尝试连接 USB 摄像头(Kinect)时出现“无法声明摄像头接口:-6”

我已经安装了 freenect 库openkinect.org。该库有一个演示应用程序,您可以从终端运行它来测试 Kinect。但是当我运行此命令时,我得到以下输出:

richard@behemoth:~$ sudo freenect-glview 
Kinect camera test
Number of devices found: 1
Could not claim interface on camera: -6
Could not open device

这个错误是由库抛出的利布通过函数libusb_claim_interface错误 -6 对应于LIBUSB_ERROR_BUSY。所以我的猜测是它与安装 USB 有关,而不是具体与freenect库或 Kinect 本身有关。

所以我的问题是如何找出什么资源正在使用这个接口以及如何释放它以便我可以访问它?

编辑:

到目前为止我已经尝试过(只是为了确保):

  • 重新启动
  • 拔出电源,插入电源
  • 尝试过不同的 USB 端口
  • 重启 udev

可能有用的其他信息:

在 /etc/fstab 中:

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/sda1 during installation
UUID=1c73f217-ac8d-451b-8390-7a680628a856 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=bb49bd29-07ec-45a0-bbab-46fb8362b06b none            swap    sw              0       0

sudo uname -r:

Linux behemoth 3.0.0-14-generic-pae #23-Ubuntu SMP 2011 年 11 月 21 日星期一 22:07:10 UTC i686 i686 i386 GNU/Linux

cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.10
DISTRIB_CODENAME=oneiric
DISTRIB_DESCRIPTION="Ubuntu 11.10"

答案1

我没有你的环境,无法测试,但这段摘录来自gphoto 常见问题解答似乎说这可能是权限的问题,而不是某些程序垄断了界面。

以下引文包含指向设置 USB 端口的权限您可以检查的章节。

为什么我会收到“无法声明 USB 设备”的错误消息?

您必须确保没有加载此类内核模块,并且您已正确设置 USB 设备上的权限,以便您拥有对摄像头设备的(非 root)写访问权限。如何设置,请参见第 4.3 节,设置 USB 端口的权限

这种情况也可能发生在用作 USB 大容量存储设备的相机上。一个值得注意的例子是,如果您有一台 Olympus 相机,它会自动被检测为 Olympus C-2040Z。在这种情况下,如果您运行的是 Linux,您可以尝试删除 usb-storage 内核模块并尝试使用 libgphoto2。但是,除非您想控制相机(并非所有型号都支持它),否则这不是推荐的解决方案。继续使用 USB 大容量存储。其中一些 Olympus 支持切换到“PC 控制”模式,以便使用外部程序(例如使用 libgphoto2 的程序)进行远程控制。

答案2

这听起来很像是另一个司机正在持有或使用你的设备。运行:

lsusb

并尝试找到动能线

Bus 002 Device 004: ID 046d:0850 Logitech, Inc. QuickCam Web

将 ID 后的字符串(如 046d:0850)复制并粘贴到 google 中,看看是否碰巧遇到匹配的 Linux 内核模块。

如果你幸运的话,那么将它添加到黑名单模块中。创建你自己的文件以/etc/modprobe.d/blacklist-kinetic.conf

blacklist MODULENAME

运行depmod -a 重新启动并重试

但请小心,不要将您实际需要的任何模块列入黑名单。

答案3

这有点令人困惑,但我最终明白了。

较新的 Linux 内核附带一个驱动程序,可将 Kinect 用作​​网络摄像头,它似乎首先抓取 Kinect 摄像头,这会导致您尝试运行 freenect-glview 时出现错误消息:“无法声明摄像头上的接口:-6”。

执行 lsmod 并将其通过管道传输到 gspca 字符串上的 grep,这样您就只能看到 gspca 列表:

 lsmod | grep gspca
 gspca_kinect   12792     0
 gspca_main     27610     1     gspca_kinect
 videodev       85626     1     gspca_main

 modprobe -r gspca_kinect
 modprobe -r gspca_main

然后 freenect-glview 应该可以工作了。

答案4

较新的 Linux 内核已安装 ms gspca 驱动程序,不会分离。它们只提供 rgb 摄像头和 ir,没有深度,所以请杀死它们!

lsmod

应该列出所有模块。找到两个 gspca 模块。我认为是 kinect 和 main。

then modprobe -r gspca_kinect

然后关闭另一个,并再次尝试 freenect-glview。生活很美好!

相关内容