Android之摄像头框架简介
Android之摄像头框架简介
Android Camera HAL
每个Soc厂家的HAL实现不一样,以前主要基于V4L2,openMAX等,如TI等,后面随着Android相机功能越来越多,运用越来越复杂,都形成了自己独有的一套架构,比如高通Camx架构,MTK的MtkCam3架构等
Camx架构:
MtkCam3:
新版HAL3
从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API,不支持使用旧版接口。
新相机 HAL 的 HIDL 接口在 hardware/interfaces/camera
中定义
HIDL 的目标是,可以在无需重新构建 HAL 的情况下替换框架。HAL 将由供应商或 SOC 制造商构建,并放置在设备的 /vendor 分区中,这样一来,就可以在框架自己的分区中通过 OTA 替换框架,而无需重新编译 HAL。
从 Android 10 开始,HIDL 已废弃,Android 将在所有位置改用 AIDL
- 应用框架
应用代码位于应用框架级别,它使用 Camera 2 API 与相机硬件进行互动。在内部,此代码会调用相应的 Binder 接口,以访问与相机互动的原生代码。 - Native框架
此框架位于frameworks/av/
中,并提供相当于CameraDevice
和CameraCaptureSession
类的原生类。另请参阅 NDK camera2 参考。 - 相机服务
位于frameworks/av/services/camera/libcameraservice/CameraService.cpp
下的相机服务是与 HAL 进行互动的实际代码。 - HAL
硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。 - 内核驱动程序
相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。
Android USB Camera
Android下面的USB摄像头和其系统自带的摄像头实现是有一定差别的。
UVCCamera库
基于 libuvc 开发 https://github.com/libuvc/libuvc
libuvc 是一个跨平台开发库,基于 libusb,功能包括 UVC 设备识别与控制,视频流传输,视频流格式转换等
https://github.com/saki4510t/UVCCamera
jni/libjpeg, jni/libusb and jin/libuvc
Android 官方推出的 ExternalCamera
随着 Android P (9.0)版本升级,新增了 External USB Cameras 这个功能,默认情况该功能是关闭的,一些 HAL 组件不会编译到 ROM 中,需要打开更新 ROM 才行。另外该功能还依赖于 android.hardware.usb.host
以及 Linux kernel 打开 UVC
驱动支持。
Android P 上提供了对 usb camera 设备的支持(External USB Cameras ) ,提供了完整 HALv3 实现并接入到 CameraProviderManager;可以让任何三方相机应用轻松调用到外接 USB 摄像头功能,使用方法跟内置相机几无差别,都是透过 Android Camera API2 调用。