说明:camera子系统 系列文章针对Android10.0系统,主要针对 camera API2 + HAL3 框架进行解读。
1 基本流程
关键流程总结说明:对于camera模块,最关键的基础能力就是预览、拍照、录制视频,而HDR,全景照片、3A算法等 都是在此基础上的新功能。接下里通过三篇文章分别对Camera的 预览、拍照、录制视频流程进行分析。如下所示:
研究的方法是:完成关键流程的调试和分析,同时熟悉关键类和关键API。
2 Camera图像数据处理组件简介
- 预览:通常会使用SurfaceView或者TextureView(本质上使用SurfaceTexture)接收预览图像数据,当然也可以使用GLSurfaceView。
- 拍照:通过ImageReader来获取拍照图像数据,设置Format为JPEG时获取到Jpeg图像,设置Format为RAW_SENSOR时获取到RAW16图像(可以传给DngCreator生成DNG格式的RAW)。有时也会用到ImageWriter。
- 拍照后处理:应用程序通过SurfaceTexture或ImageReader(设置Format为YUV_420_888)接收到YUV图像数据后,可以送给OpenGL ES,RenderScript等组件进行处理,如果不做详细处理也可以设置Format为JPEG。
- 视频:录制视频时通常会使用MediaRecorder、MediaCodec等类进行录制。
3 camera应用开发中常见类解读
- CameraCaptureSession:基于某个CameraDevice创建出来的CameraCaptureSession,用于从相机中捕获图像,或者重新处理先前在同一会话中从相机中捕获的图像。 当程序需要预览、拍照时,都需要先通过该类的实例创建Session。该类可控制拍照和预览,控制预览的方法为setRepeatingRequest();控制拍照的方法为capture(),为了监听CameraCaptureSession 的创建过程,以及监听CameraCaptureSession的拍照过程,Camera API2 为 CameraCaptureSession 提供了StateCallback、CaptureCallback 等内部类。它有两个用途:一方面是从CameraDevice获取数据流;另一方面是再次处理同Session获取到的数据流。
- CameraCaptureSession.CaptureCallback:一个回调对象,用于跟踪CameraDevice处理CaptureRequest的进度。
- CameraCaptureSession.StateCallback:一个回调对象,用于跟踪CameraCaptureSession的状态变化。
- CameraCharacteristics:描述CameraDevice的静态属性信息,可以通过get方法,以key-value形式获取。这里CameraCharacteristics.Key为:传递给CameraCharacteristics#get的参数,对应某个参数的Key。
- CameraConstrainedHighSpeedCaptureSession:是高帧率录像的CameraCaptureSession,通常size是会受到限制的。
- CameraDevice:用于描述一个逻辑上的Camera设备(逻辑camera和物理camera是不一样的,逻辑Camera设备有可能对应物理上多个Camera设备),以不同的CameraId 来区别,当相机状态回调函数执行时,可以从回调中拿到当前的CameraDevice 然后进行一些列操作。。
- CameraDevice.StateCallback:一个回调对象,用于接收Camera设备的状态变化。
- CameraExtensionCharacteristics:用于查询Camera Extensions支持的功能和分辨率。
- CameraExtensionSession:Camera Extensions使用的CameraCaptureSession,通常是多帧拍照或复杂的后处理拍照。
- CameraExtensionSession.ExtensionCaptureCallback:一个回调对象,用于跟踪CameraDevice处理CaptureRequest的进度。
- CameraExtensionSession.StateCallback:一个回调对象,用于跟踪CameraExtensionSession的状态变化。
- CameraManager:是一个系统级服务,用于检测、描述和连接Camera设备。
- CameraManager.AvailabilityCallback:一个回调对象,用于通知应用某颗Camera能否被使用。
- CameraManager.TorchCallback:一个回调对象,用于跟踪闪光灯模式切换,闪光灯是否可用状态。
- CameraMetadata:Camera参数的基类。此类定义用于查询下相机特性或捕获结果以及相机请求参数的键值对。
- CameraOfflineSession:离线模式的CameraCaptureSession,通过调用CameraCaptureSession#switchToOffline切换到离线模式。
- CameraOfflineSession.CameraOfflineSessionCallback:一个回调对象,用于跟踪CameraOfflineSession的状态。
- CaptureFailure:用于描述处理某帧图像出现错误的报告。
- CaptureRequest:图像处理的请求,CaptureRequest创建后里面的内容是不可变的,包含处理图像的参数设置列表和输出数据流信息。当调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。一般通过CameraRequest.Builder来生成CameraRequest对象。
- CaptureRequest.Builder:用于创建CaptureRequest对象。
- CaptureRequest.Key:CaptureRequest.Builder#set(Key, Object)使用的参数Key。一般用于设置各种属性。
- CaptureResult:某帧数据处理后的结果参数信息,一个CaptureResult可能只包含一部分结果参数信息。
- DngCreator:DngCreator用于将RAW16转换为DNG。
- MultiResolutionImageReader:MultiResolutionImageReader封装了多个ImageReader,这些ImageReader具有相同的buffer format,但在size、source camera id或者sensor mode可能不一样。
- TotalCaptureResult:某帧数据处理后的所有结果参数信息。
4 开源项目解读
对camera的基本流程有了基本了解后 就可以开始研究一些开源项目,比如:
- OpenCamera项目:git clone https://github.com/almalence/OpenCamera.git
- Geek2Camera项目:git clone https://e.coding.net/deepinout/camera/GeekCamera2.git