Android官方文档
https://source.android.google.cn/devices/camera
随着Android系统的不断升级,相机子系统框架也在不断进化,由最初的API1和HAL1到现在的API2和HAL3,由最初简单的拍照,录制到现在的连拍,AI人像;可以说是架构上变动最大最频繁的子系统。很多设备仍然依赖相机 HAL1,因此 Android 7.0 继续支持该模块。此外,Android 相机服务还支持同时实现两种 HAL(1 和 3),如果您希望通过相机 HAL1 支持性能略低的前置摄像头,并通过相机 HAL3 支持更为高级的后置摄像头。Android 的相机硬件抽象层 (HAL) 可将 Camera 2 中较高级别的相机框架 API 连接到底层的相机驱动程序和硬件。相机子系统包括相机管道组件的实现,而相机 HAL 则可提供用于实现您的这些组件版本的接口。从 Android 8.0 开始,相机 HAL 接口是 Project Treble 的一部分,相应的 HIDL 接口在硬件/接口/相机中定义。该实现会封装仍在使用旧版 API 的旧 HAL。从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API;不支持使用旧版接口。Android8.0下最新的相机架构具有更高的灵活性。架构如下:
重新设计 Android Camera API 的目的在于大幅提高应用对于 Android 设备上的相机子系统的控制能力,同时重新组织 API,提高其效率和可维护性。借助额外的控制能力,您可以更轻松地在 Android 设备上构建高品质的相机应用,这些应用可在多种产品上稳定运行,同时仍会尽可能使用设备专用算法来最大限度地提升质量和性能。版本 3 相机子系统将多个运行模式整合为一个统一的视图,您可以使用这种视图实现之前的任何模式以及一些其他模式,例如连拍模式。这样一来,便可以提高用户对聚焦、曝光以及更多后期处理(例如降噪、对比度和锐化)效果的控制能力。此外,这种简化的视图还能够使应用开发者更轻松地使用相机的各种功能。架构图已经很清晰的描述了各层架构之间的关系,我们按图索骥从最新的架构开始,再看完整的架构,最后我们回到应用层来看Camera子系统的设计。
代码路径:
(1)framework 层代码
frameworks/base/core/java/android/hardware/camera2
(1.5)是camera framework和Camera service之间的IPC数据通信载体 /frameworks/av/camera
也就是说这就是一个binder通信载体
(2)camera service
frameworks/av/services/camera/libcameraservice$
(3)camera provider
hardware/interfaces/camera/provider/2.4
(4)hal层接口
hardware/interfaces/camera/common/1.0/
hardware/interfaces/camera/device/3.2
hardware/libhardware/include/hardware/camera3.h
hardware/libhardware/modules/camera/3_0
(5)hal层的实现
vendor/qcom/proprietary/camx/src/core/
(6)算法实现
vendor/qcom/proprietary/chi-cdk/vendor/node/
camera2包架构示意图:
这里引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送 Capture 请求,而摄像头会返回 CameraMetadata。这一切建立在一个叫作 CameraCaptureSession 的会话中。
Camera2 中主要的API类:
CameraManager类 : 摄像头管理类,站在高处统管所有摄像投设备(CameraDevice)的管理者,用于检测、打开系统摄像头,通过getCameraCharacteristics(cameraId)可以获取摄像头特征。
CameraCharacteristics类:相机特性类,是 CameraDevice 的属性描述类,例如,是否支持自动调焦,是否支持zoom,是否支持闪光灯一系列特征。
CameraDevice类: 相机设备,负责建立 CameraCaptureSession 以及建立 CaptureRequest,类似早期的camera类。
CameraCaptureSession类:用于创建预览、拍照的Session类。通过它的setRepeatingRequest()方法控制预览界面 , 通过它的capture()方法控制拍照动作或者录像动作。
CameraRequest类:一次捕获的请求,可以设置一系列的参数,用于控制预览和拍照参数,例如:对焦模式,曝光模式,zoom参数等等。
CameraDevice类
CameraDevice的reateCaptureRequest(int templateType)方法创建CaptureRequest.Builder。
templateType参数有以下几种:
TEMPLATE_PREVIEW :预览
TEMPLATE_RECORD:拍摄视频
TEMPLATE_STILL_CAPTURE:拍照
TEMPLATE_VIDEO_SNAPSHOT:创建视视频录制时截屏的请求
TEMPLATE_ZERO_SHUTTER_LAG:创建一个适用于零快门延迟的请求。在不影响预览帧率的情况下最大化图像质量。
TEMPLATE_MANUAL:创建一个基本捕获请求,这种请求中所有的自动控制都是禁用的(自动曝光,自动白平衡、自动焦点)。
HAL子系统:
应用框架会针对捕获的结果向相机子系统发出请求。一个请求对应一组结果。请求包含有关捕获和处理这些结果的所有配置信息。其中包括分辨率和像素格式;手动传感器、镜头和闪光灯控件;3A 操作模式;RAW 到 YUV 处理控件;以及统计信息的生成等。这样一来,便可更好地控制结果的输出和处理。一次可发起多个请求,而且提交请求时不会出现阻塞。请求始终按照接收的顺序进行处理。
相机模型: