暂时无法在文档外展示此内容
请求-响应过程步骤:
1 通过Camera CaptureSession发送CaptureRequest
2 CameraDevices收到请求,返回对应数据到对应的Surface(预览TextureView,出图ImageReader)
请求完成后,可以在回调中查询到对应的请求参数和CameraDevice当前状态。
CaptureRequest代表请求控制的Camera参数,
CameraMetadata(CaptureResult)代表当前返回帧中Camera使用的参数以及当前状态。
API使用流程
暂时无法在文档外展示此内容
- 通过
context.getSystemService(Context.CAMERA_SERVICE)获取CameraManager. - 调用
CameraManager .open()方法在回调中得到CameraDevice. - 通过
CameraDevice.createCaptureSession()在回调中获取CameraCaptureSession. - 构建
CaptureRequest, 有三种模式可选 预览/拍照/录像. - 通过
CameraCaptureSession发送CaptureRequest, capture表示只发一次请求, setRepeatingRequest表示不断发送请求. - 拍照数据可以在
ImageReader.OnImageAvailableListener回调中获取,CaptureCallback中则可获取拍照实际的参数和Camera当前状态.
Camera2介绍
Pipeline
Camera2 的 API 模型被设计成一个 Pipeline(管道),它按顺序处理每一帧的请求并返回请求结果给客户端。
为了解释上面的示意图,假设我们想要同时拍摄两张不同尺寸的图片,并且在拍摄的过程中闪光灯必须亮起来。整个拍摄流程如下:
- 创建一个用于从 Pipeline 获取图片的 CaptureRequest。
- 修改 CaptureRequest 的闪光灯配置,让闪光灯在拍照过程中亮起来。
- 创建两个不同尺寸的 Surface 用于接收图片数据,并且将它们添加到 CaptureRequest 中。
- 发送配置好的 CaptureRequest 到 Pipeline 中等待它返回拍照结果。
一个新的 CaptureRequest 会被放入一个被称作 Pending Request Queue 的队列中等待被执行,当 In-Flight Capture Queue 队列空闲的时候就会从 Pending Request Queue 获取若干个待处理的 CaptureRequest,并且根据每一个 CaptureRequest 的配置进行 Capture 操作。最后我们从不同尺寸的 Surface 中获取图片数据并且还会得到一个包含了很多与本次拍照相关的信息的 CaptureResult,流程结束。
Capture
单次模式(One-shot)、多次模式(Burst)、重复模式(Repeating)
CameraManager
CameraManager 是一个负责查询和建立相机连接的系统服务。关键功能:
- 将相机信息封装到 CameraCharacteristics 中,并提获取 CameraCharacteristics 实例的方式。
- 根据指定的相机 ID 连接相机设备。
- 提供将闪光灯设置成手电筒模式的快捷方式。
CameraCharacteristics
CameraCharacteristics 是一个只读的相机信息提供者,其内部携带大量的相机信息,包括代表相机朝向的 LENS_FACING;判断闪光灯是否可用的 FLASH_INFO_AVAILABLE;获取所有可用 AE 模式的 CONTROL_AE_AVAILABLE_MODES 等等。
CameraDevice
CameraDevice 代表当前连接的相机设备,它的职责有以下四个:
- 根据指定的参数创建 CameraCaptureSession。
- 根据指定的模板创建 CaptureRequest。
- 关闭相机设备。
- 监听相机设备的状态,例如断开连接、开启成功和开启失败等。
Surface
Surface 是一块用于填充图像数据的内存空间,例如你可以使用 SurfaceView 的 Surface 接收每一帧预览数据用于显示预览画面,也可以使用 ImageReader 的 Surface 接收 JPEG 或 YUV 数据。每一个 Surface 都可以有自己的尺寸和数据格式,你可以从 CameraCharacteristics 获取某一个数据格式支持的尺寸列表。
CameraCaptureSession
CameraCaptureSession 实际上就是配置了目标 Surface 的 Pipeline 实例,我们在使用相机功能之前必须先创建 CameraCaptureSession 实例。一个 CameraDevice 一次只能开启一个 CameraCaptureSession,绝大部分的相机操作都是通过向 CameraCaptureSession 提交一个 Capture 请求实现的,例如拍照、连拍、设置闪光灯模式、触摸对焦、显示预览画面等等。
CaptureRequest
CaptureRequest 是向 CameraCaptureSession 提交 Capture 请求时的信息载体,其内部包括了本次 Capture 的参数配置和接收图像数据的 Surface。CaptureRequest 可以配置的信息非常多,包括图像格式、图像分辨率、传感器控制、闪光灯控制、3A 控制等等,可以说绝大部分的相机参数都是通过 CaptureRequest 配置的。值得注意的是每一个 CaptureRequest 表示一帧画面的操作,这意味着你可以精确控制每一帧的 Capture 操作。
CaptureResult
CaptureResult 是每一次 Capture 操作的结果,里面包括了很多状态信息,包括闪光灯状态、对焦状态、时间戳等等。例如你可以在拍照完成的时候,通过 CaptureResult 获取本次拍照时的对焦状态和时间戳。需要注意的是,CaptureResult 并不包含任何图像数据,前面我们在介绍 Surface 的时候说了,图像数据都是从 Surface 获取的。