本文是Camera2参考概述,介绍 android.hardware.camera2
中重要的类。
文章翻译并整理自 https://developer.android.google.cn/reference/android/hardware/camera2/package-summary
视频在线观看:
加入知识星球与更多Camera同学交流
- 星球名称:深入浅出Android Camera
- 星球ID: 17296815
android.hardware.camera2
是Android设备上访问Camera硬件设备的SDK,这是最新的Camera API,替代已经废弃的Camera接口,新的API我们称为Camera2 API。
Camera Pipeline
Camera设备被抽象成一个Pipeline模型,这个Pipeline的输入有两个:
- 从Sensor获取到待处理的一帧一帧数据
- 从应用设置下来的一个一个处理请求(CaptureRequest)
数据与处理请求是一一对应的关系,每一帧数据对应一个独立的CaptureRequest。
Pipeline的输出也有两个:
- 每帧数据的处理结果(CaptureResult),通常会分阶段输出多个CaptureResult,因此会是多个CaptureRequest组成的一整包结果(TotalCaptureResult)
- 处理后的每帧数据,通常会被拆分成多路流输出(比如:预览流,视频流,拍照流等等)
这些CaptureRequest是按照顺序一个一个被处理的,通常需要150~300ms才能处理完一个CaptureRequest,为了达到至少30fps的帧率,就需要在整个Pipeline中有多个CaptureRequest同时被处理,这些正在被处理的CaptureRequest分别处于不同的阶段。
CameraManager
可以通过CameraManager去枚举、查询和打开Camera设备。
CameraCharacteristics
每个Camera设备都有一组静态属性信息,这组静态属性信息描述该Camera设备的能力,可用的参数等,称之为CameraCharacteristics。CameraCharacteristics可以通过CameraManager#getCameraCharacteristics
获取。
Camera图像数据处理组件
预览
通常,我们使用SurfaceView或者TextureView(本质上使用SurfaceTexture)接收预览图像数据。
拍照
通过ImageReader来获取拍照图像数据,设置Format为JPEG时获取到Jpeg图像,设置Format为RAW_SENSOR时获取到RAW16图像(可以传给DngCreator生成DNG格式的RAW)。
后处理
应用程序通过SurfaceTexture或ImageReader(设置Format为YUV_420_888)接收到YUV图像数据后,可以送给OpenGL ES,RenderScript等组件进行处理。
CaptureRequest
应用程序在获取图像数据前需要先创建CaptureRequest,CaptureRequest包含两部分信息:
- 处理某一帧数据的参数设置列表
- 这一帧数据分成多少路数据流
调用CameraDevice#createCaptureRequest(int)
获取到CaptureRequest.Builder
,通过Builder来创建CaptureRequest。
CaptureRequest创建好后,可以通过两类方法将CaptureRequest送给Camera设备进行处理:
CameraCaptureSession#capture
,有burst模式,可以一次送多个CaptureRequestCameraCaptureSession#setRepeatingRequest
,有burst模式,可以一次repeating一组CaptureRequest
Repeating方式送CaptureRequest的优先级低于capture方式送CaptureRequest,所以在repeating过程中,如果有capture方式的CaptureRequest送下来,则会放在插入在repeating队列的最前面,以便有更高优先级送给Camera设备处理。
CaptureResult
CaptureRequest处理完后,Camera设备会产生一个TotalCaptureResult 对象用于描述这一帧数据最终生效了哪些设置参数。实际生效的参数可能跟CaptureRequest里面填的参数有比较大的差异。
除了设置参数外,CaptureRequest里面设置的每一个Output Surface都会收到一帧图像数据。
应用收到图像数据和对应的CaptureResult是异步的,甚至有时候收到两者的时间点差别较大。
Camera2 API类
类名 | 功能描述 |
---|---|
CameraCaptureSession | 基于某个CameraDevice创建出来的CameraCaptureSession,有两个用途:1. 从CameraDevice获取数据流;2. 再次处理同Session获取到的数据流。 |
CameraCaptureSession.CaptureCallback | 一个回调对象,用于跟踪CameraDevice处理CaptureRequest的进度。 |
CameraCaptureSession.StateCallback | 一个回调对象,用于跟踪CameraCaptureSession的状态变化。 |
CameraCharacteristics | 描述CameraDevice的静态属性信息。 |
CameraCharacteristics.Key |
传递给CameraCharacteristics#get 的参数,对应某个参数的Key。 |
CameraConstrainedHighSpeedCaptureSession | 用于高帧率录像的CameraCaptureSession,通常size是会受到限制的。 |
CameraDevice | 用于描述一个逻辑上的Camera设备(有可能对应物理上多个Camera设备)。 |
CameraDevice.StateCallback | 一个回调对象,用于接收Camera设备的状态变化。 |
CameraExtensionCharacteristics | 用于查询Camera Extensions支持的功能和分辨率。 |
CameraExtensionSession | Camera Extensions使用的CameraCaptureSession,通常是多帧拍照或复杂的后处理拍照。 |
CameraExtensionSession.ExtensionCaptureCallback | 一个回调对象,用于跟踪CameraDevice处理CaptureRequest的进度。 |
CameraExtensionSession.StateCallback | 一个回调对象,用于跟踪CameraExtensionSession的状态变化。 |
CameraManager | 是一个System Service,用于检测、描述和连接Camera设备。 |
CameraManager.AvailabilityCallback | 一个回调对象,用于通知应用某颗Camera能否被使用。 |
CameraManager.TorchCallback | 一个回调对象,用于跟踪闪光灯模式切换,闪光灯是否可用状态。 |
CameraMetadata |
Camera参数的基类。 |
CameraOfflineSession | 离线模式的CameraCaptureSession,通过调用CameraCaptureSession#switchToOffline切换到离线模式。 |
CameraOfflineSession.CameraOfflineSessionCallback | 一个回调对象,用于跟踪CameraOfflineSession的状态。 |
CaptureFailure | 用于描述处理某帧图像出现错误的报告。 |
CaptureRequest | 图像处理的请求,CaptureRequest创建后里面的内容是不可变的,包含处理图像的参数设置列表和输出数据流信息。 |
CaptureRequest.Builder | 用于创建CaptureRequest对象。 |
CaptureRequest.Key |
CaptureRequest.Builder#set(Key, Object) 使用的参数Key。 |
CaptureResult | 某帧数据处理后的结果参数信息,一个CaptureResult可能只包含一部分结果参数信息。 |
CaptureResult.Key |
CaptureResult#get 使用的参数Key。 |
DngCreator | DngCreator用于将RAW16转换为DNG。 |
MultiResolutionImageReader | MultiResolutionImageReader封装了多个ImageReader,这些ImageReader具有相同的buffer format,但在size、source camera id或者sensor mode可能不一样。 |
TotalCaptureResult | 某帧数据处理后的所有结果参数信息。 |
Camera2 API异常类
类名 | 功能描述 |
---|---|
CameraAccessException | 当无法打开Camera设备,或者已打开的Camera设备出现故障时,应用会收到这个异常。 |