首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过ndk和V4L在安卓系统上预览USB网络摄像头

通过ndk和V4L在安卓系统上预览USB网络摄像头
EN

Stack Overflow用户
提问于 2016-04-13 22:54:14
回答 2查看 1.5K关注 0票数 2

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

安卓系统有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是否支持V4L?不需要访问/dev/video4,我可以使用它来预览摄像头吗?

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

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

EN

回答 2

Stack Overflow用户

发布于 2016-10-01 07:37:14

我来到这里是因为我得出了和你一样的结论。我没有更多的建议可以提供。这么多年后你还发现什么了吗?

我能补充的是:

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-05 01:23:20

拥有CAMERA权限并不意味着你在任何特定的Linux用户组中。这只意味着你拥有Android操作系统权限检查的权限。

一般来说,应用程序不能直接访问内核驱动程序接口。这是一个很大的安全问题,因为驱动程序通常没有针对恶意应用程序进行加固。

目前唯一可以在非根设备上工作的解决方案是UVCCamera项目或类似的项目,该项目在Android public USB之上构建了一个完整的UVC接口。

此外,一些Android设备确实通过标准的摄像头API支持网络摄像头,但这还不是baseline Android的一个功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36602211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档