android - 通过 ndk 和 V4L 在 Android 上预览 USB 网络摄像头

标签 android opencv android-ndk v4l uvc

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

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

我的问题如下:

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

1) 为什么我缺少/dev/video4 的权限?我的app使用了android.permission.CAMERA权限,所以运行app的用户应该在camera组,camera组对/dev/video4有r+w权限,为什么打不开?

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

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

以前有没有人试过这样的东西?

此外,我知道有一些库使用 libusb 和 libuvc 来连接相机(例如 https://github.com/saki4510t/UVCCamera ),但是这个库非常不稳定,无法提供令人满意的结果。

最佳答案

我来到这里是因为我得出了与您相同的结论。我没有进一步的建议可以提供。这么多年过去了,你还有什么发现吗?

我能补充的是:

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

遗憾的是我们不能只使用 V4L2 + uvcvideo 驱动程序。

关于android - 通过 ndk 和 V4L 在 Android 上预览 USB 网络摄像头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602211/

相关文章:

java - 服务器发送请求 firebase java.net.protocolException 在读取响应后无法写入请求正文

javascript - 是否可以使用Javascript关闭Android浏览器?

android - 如何使用 Android NDK 打开相机

android - 没有获得 CallLog 的第一个数据

java - 膨胀类 android.support.design.widget.CoordinatorLayoute 时出错

c++ - 人脸地标和使用光流稳定

c++ - 在 OpenCV 2.3.1 中使用 calcOpticalFlowPyrLK 时出错

python - 获取边界框opencv的上中心

java - 在 Java 和 C 之间发送 int[]s

Android NDK 产生大量只有一个功能的 .so 文件