我正在尝试从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),但是这个库非常不饱和,并且不能提供令人满意的结果。
发布于 2016-10-01 07:37:14
我来到这里是因为我得出了和你一样的结论。我没有更多的建议可以提供。这么多年后你还发现什么了吗?
我能补充的是:
遗憾的是,我们不能只使用V4L2 + uvcvideo驱动。
发布于 2016-10-05 01:23:20
拥有CAMERA权限并不意味着你在任何特定的Linux用户组中。这只意味着你拥有Android操作系统权限检查的权限。
一般来说,应用程序不能直接访问内核驱动程序接口。这是一个很大的安全问题,因为驱动程序通常没有针对恶意应用程序进行加固。
目前唯一可以在非根设备上工作的解决方案是UVCCamera项目或类似的项目,该项目在Android public USB之上构建了一个完整的UVC接口。
此外,一些Android设备确实通过标准的摄像头API支持网络摄像头,但这还不是baseline Android的一个功能。
https://stackoverflow.com/questions/36602211
复制相似问题