Android USB Camera

Android 设备基于 linux kernel, 自带 V4L2 支持。针对USB camera, 可选择的实现方案有下面几种(当然了,目前最优解是No.3 ):

1. 基于 libuvc 开发

libuvc 是一个跨平台开发库,基于 libusb,功能包括 UVC 设备识别与控制,视频流传输,视频流格式转换等。

Android 平台上已有一个 Usb Camera 的开源项目,基于 libucv 的Android 应用,UVCCamera 无需 root 权限即可预览显示连接到手机的 usb camera 设备。

https://github.com/libuvc/libuvc

https://github.com/saki4510t/UVCCamera
 

2. camera.v4l2 实现

该库也是基于 V4L2 的 Camera HALv3 实现,原本是 Google 开发出来给树莓派系统使用的。所以从 Android AOSP 代码库里面可以找到这份源代码,但是只有 HAL 实现,没有接入 Android Framework,也就是 cameraserver 是调用不到的。如果有树莓派源代码的话倒是可以参考看看,不过估计也是基于这个初阶版本改过甚至是采用了全新的实现。

该库在 Android 系统里也是默认关闭的,需要打开才会编到 ROM 里,代码实现上解耦了 camera interface 与 V2L2 wrapper 部分,所以理论上可以把 V4L2 实现替换成其它也是 ok 的。

该实现方式分析: https://www.xbwee.space/2020/10/25/V4L2-Camera-HALv3/
 

3. Android 官方推出的 ExternalCamera

随着 Android P 版本升级,新增了 External USB Cameras 这个功能,默认情况该功能是关闭的,一些 HAL 组件不会编译到 ROM 中,需要打开更新 ROM 才行。另外该功能还依赖于 android.hardware.usb.host 以及 Linux kernel 打开 UVC 驱动支持。

该实现 HAL 会启动一个 hotplug 线程,监视 /dev/video* 设备节点增删情况,透过 HAL 回调函数通知 CameraProviderManager 更新 camera 设备列表。因为是 Google 原生支持,所以对上层 App Framework 来说,调用方式不需要变,依然调用 Android Camera2 API,只是看到的 cameraId 是类似 /dev/video2 之类的编号(内置相机是0,1,2 … 纯数字编号)

https://source.android.com/devices/camera/external-usb-cameras

 

你可能感兴趣的:(camera,android,安卓)