Camera2概览
Android从5.0开始支持Camera2,对于相机开发者来说,应用层可以通过Camera2获取更多的底层相机控制权限,从而为满足不同应用场景需求的的相机提供了可能。同时,不同手机厂商也陆续推出了自己的Camera接口,比如华为的CameraKit等。不管接口如何变,面对着不同厂商不同机型,可能表现不同效果的复杂的现状,但对Camera的一些核心控制及效果追求,是万变不离其宗的,比如相机图像,帧率,3A等核心内容。
如下图,Android的整个相机处理流程示意。首先,在已经处理完相机打开流程后,客户端通过比如SurfaceTexture这样的非直接上屏组件提供Surface作为相机图像的载体,并通过CaptureRequest发送到底层相机,相机底层作为生产方,在底层相机ISP完成生成好的图像后,放到对应的Surface上,此时客户端就可以通过比如SurfaceTexture的OnFrameAvaliable回调经updateTexImage拿到对应的相机纹理Id,然后进行下一步处理,同时每一帧的相机处理状态,比如测光状态,对焦状态等,通过CaptureResult状态通知到客户端。进而完成整个交互场景需求。
camera21. Camera2框架
相较于Camera1基于Camera进行接口调用,Camera2引入了CameraManager,CameraCharacteristics,CameraDevice,CameraCaptureSession作为主要的API。
CameraManager 负责查询和建立相机连接的系统服务:
- 获取相机 ID(前后摄等)。
- 获取CameraCharacteristics 实例。
- 根据指定的相机 ID连接相机设备。
CameraCharacteristics 用于查询支持的硬件参数,独立于相机实例:
- INFO_SUPPORTED_HARDWARE_LEVEL 硬件支持等级( LEGACY仅支持Camera1、LIMITED、FULL支持全部Camera2特性和LEVEL_3)
- LENS_FACING 相机相对于设备屏幕的方向
- SCALER_STREAM_CONFIGURATION_MAP 相机支持的采集图像分辨率数组
- FLASH_INFO_AVAILABLE 是否支持闪光灯
- SCALER_AVAILABLE_MAX_DIGITAL_ZOOM 相机支持的最大可用缩放范围
- CONTROL_AF_AVAILABLE_MODES 支持的自动AF模式
- CONTROL_AE_AVAILABLE_MODES支持的自动测光模式
- CONTROL_AWB_AVAILABLE_MODES支持的自动白平衡模式
- STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES支持的的人脸检测模式
- CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES支持的采集帧率范围列表
- SENSOR_ORIENTATION对齐屏幕需要顺时针旋转的相机图像角度
- CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES支持的视频防抖模式
- LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION支持的光学防抖模式
- NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES支持的降噪模式
- SENSOR_INFO_ACTIVE_ARRAY_SIZE有效的相机传感器接收区域
CameraDevice 代表当前连接的相机硬件设备实例:
- 创建 CameraCaptureSession。
- 创建 CaptureRequest。
- 开关和监听相机设备的状态,例如断开连接、开启成功和开启失败等。
CameraCaptureSession 代表在对应的相机设备上创建了的 通信Pipeline 实例。
- 相机的拍摄请求基于Session实例并通过CameraRequest为载体进行,包含Capture(一次),Burst(多次),Repeat(重复)三种模式进行请求。
- 相机的CameraRequest状态通过CaptureCallback通知到客户端
2. Camera2管道
Camera2开始采用PipeLine管道来完成应用与相机服务的通信,它按顺序处理每一帧的请求并返回请求结果给客户端。
PipeLine管道的核心就是CaptureRequest和CaptureResult。
CaptureRequest如同一个快递车,承载着客户不同的请求信息包裹行驶在PipeLine的路线上发给底层相机去处理,待处理完包裹后,通过CaptureResult将处理信息回调给客户。
CaptureRequest
这些包裹承载的信息可能是相机画面的载体Surface,对焦的请求,测光请求,闪光灯开关,曝光时间,曝光补偿,对焦区域,是否开启去抖等信息。部分摘要:
- CONTROL_AE_EXPOSURE_COMPENSATION 设置曝光补偿的值
- CONTROL_AE_LOCK 打开曝光锁定
- CONTROL_AE_MODE 设置曝光模式
- CONTROL_AE_REGIONS 设置测光区域
- CONTROL_AF_MODE 设置自动聚焦模式
- CONTROL_AF_REGIONS设置自定义聚焦区域
- CONTROL_AF_TRIGGER 触发自动对焦事件
- CONTROL_AWB_LOCK 打开白平衡锁定
- CONTROL_AWB_MODE 设置白平衡模式
- CONTROL_AWB_REGIONS 白平衡区域
- CONTROL_VIDEO_STABILIZATION_MODE 去抖
- CONTROL_ZOOM_RATIO 缩放
- EDGE_MODE 边缘增强
- NOISE_REDUCTION_MODE 降噪
- SENSOR_EXPOSURE_TIME 曝光时长
- STATISTICS_FACE_DETECT_MODE 相机人脸检测
- TONEMAP_CURVE Tonemapping / contrast / gamma校准曲线
CaptureResult
CaptureResult 是每一次Capture 操作的结果,包括了一些状态信息,如闪光灯、对焦、时间戳等。