通过ndk和V4L在Android上预览USB Webcamera

时间:2016-04-13 14:54:14

标签: android opencv android-ndk v4l uvc

我正在尝试从Android ndk访问USB网络摄像头。

Android系统有V4L内核模块,所以我认为最好使用V4L库。它们在ndk中都是固定的,因此将它们包含在我的项目中并不是什么大不了的事。

我的问题如下:

我需要打开/ dev / video4并将ioctl发送到该文件描述符,但我没有访问/ dev / video4的权限。我想到了三件事:

1)为什么我缺少/ dev / video4的权限?我的应用程序使用android.permission.CAMERA权限,因此运行应用程序的用户应该在相机组中,并且相机组对/ dev / video4具有r + w权限,那么为什么我无法打开它?

2)我试图从java端获取文件描述符,这可以使用UsbManager类,但文件描述符点是/ dev / bus / usb / 001/004。有没有办法从Java端请求/ dev / video4的权限?或者我可以包含用户空间V4L库并将指针传递到/ dev / bus / usb / 001/004中的通用USB设备吗?

3)OpenCV的Android版本是否支持V4L?我是否可以使用它来预览相机而无需访问/ dev / video4?

以前有人试过这样的事吗?

另外,我知道有些库使用libusb和libuvc来连接相机(例如https://github.com/saki4510t/UVCCamera),但这个库非常不完整,并且不能提供令人满意的结果。

2 个答案:

答案 0 :(得分:1)

拥有权限CAMERA实际上并不意味着您在任何特定的Linux用户组中。它只表示您拥有Android OS权限检查权限。

通常,应用程序无法直接访问内核驱动程序接口。这是一个很大的安全问题,因为驱动程序通常不会对恶意应用程序进行强化。

唯一可以与非root设备一起使用的解决方案是UVCCamera项目或类似的其他项目,它们在Android公共USB API之上构建一个完整的UVC接口。

此外,一些Android设备实际上通过标准相机API支持网络摄像头,但这还不是基准Android中的一项功能。

答案 1 :(得分:0)

我来到这里是因为我得出了与你相同的结论。我没有进一步的建议。这些年后你有没有找到别的东西?

我可以添加以下内容:

  • SELinux进一步限制对/ dev / videoX文件描述符的访问。
  • android.permission.CAMERA不会按照您的想法执行操作。清单中的所有这些权限/功能设置都允许访问应用程序框架服务,与Linux组权限或SELinux无关。
  • Camera2框架仅列举前后摄像头,因此不适用于USB摄像头,至少不能开箱即用。
  • 虽然Android中存在V4L2驱动程序,但是' uvcvideo'驱动程序默认不是。您必须构建自定义内核。
  • 您指出的UVCCamera项目使用UsbManager(使用用户空间uvc解析器)。这就是它如何克服权限问题。这似乎是唯一的方法,但这种实现很脆弱,似乎在批量模式下存在问题。
很遗憾,我们不能只使用V4L2 + uvcvideo驱动程序。