如何为我的应用程序实现usb摄像头的功能



我正在android中为平板电脑创建一个应用程序,我想在启动应用程序时使用usb摄像头作为默认摄像头。我想点击图片并将其保存为jpeg、jpg或png格式。我在网上找不到任何有用的资源。如何实现这样的功能?如有任何帮助,我们将不胜感激。

解决方案都很复杂,有优点也有缺点。关于USB和UVC的信息可以从USB IF网站上免费获得,尽管有数百页的详细信息。主要问题是Android框架中缺少同步传输方法,尽管实现了描述符检索、控制、中断和批量。因此,大多数usb访问都可以用Java或Kotlin完成,但流媒体方面确实很痛苦。使用下面的方法一和Logitek C615网络摄像头,我获得640x480@30使用Android 6的联想Tab10上的fps,以及1920x1080@30fps在使用Android9 x86的联想IdeaPad 520 Miix上。Tab10似乎以USB v1的速度运行,尽管它有一个USB v2 micro-B插座。Miix有一个a型USB插座,不需要OTG转换器。我知道三种方法:

  1. 使用Libusb。这需要在Android Studio中对共享库进行单独编译和构建。编写C++代码来设置、传输数据包和拆除网络摄像头。为用户界面编写Java代码,解压缩MJPEG,显示预览并将JPEG写入存储器。通过JNI连接两者。C++和Java在不同的线程中运行,但它们是非阻塞的。低效之处在于从本地映像帧阵列向JNI阵列进行内存复制,然后在每帧之后释放以进行垃圾收集。Android应用程序在容器中运行,这意味着Libusb的特殊启动和某些功能失败,可能是因为违反了selinux
  2. 使用JNA包装Libc库。JNA是从存储库中获得的,不需要单独的构建。Libc在Android Studio中。所有的代码都是Java,但IOCTL用于控制usb文件流,这些小东西真的很麻烦。Libusb在设计选择1中做了很多低级的事情
  3. 将外部摄影机选项与Camera2 API一起使用。我的所有设备都不支持外置摄像头,甚至我的三星安卓13手机也不支持。我怀疑这是为了让系统集成商使用谷歌记录的适当设置构建Android的自定义版本,并在销售点的SBC上实现

最新更新