Android Camera2参考概述

2024年03月28日 Android Camera2参考概述 极客笔记

本文是Camera2参考概述,介绍 android.hardware.camera2中重要的类。

文章翻译并整理自 https://developer.android.google.cn/reference/android/hardware/camera2/package-summary

视频在线观看:

android.hardware.camera2是Android设备上访问Camera硬件设备的SDK,这是最新的Camera API,替代已经废弃的Camera接口,新的API我们称为Camera2 API。

Camera Pipeline

Camera设备被抽象成一个Pipeline模型,这个Pipeline的输入有两个:

  1. 从Sensor获取到待处理的一帧一帧数据
  2. 从应用设置下来的一个一个处理请求(CaptureRequest)

数据与处理请求是一一对应的关系,每一帧数据对应一个独立的CaptureRequest。

Pipeline的输出也有两个:

  1. 每帧数据的处理结果(CaptureResult),通常会分阶段输出多个CaptureResult,因此会是多个CaptureRequest组成的一整包结果(TotalCaptureResult)
  2. 处理后的每帧数据,通常会被拆分成多路流输出(比如:预览流,视频流,拍照流等等)

这些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包含两部分信息:

  1. 处理某一帧数据的参数设置列表
  2. 这一帧数据分成多少路数据流

调用CameraDevice#createCaptureRequest(int)获取到CaptureRequest.Builder,通过Builder来创建CaptureRequest。

CaptureRequest创建好后,可以通过两类方法将CaptureRequest送给Camera设备进行处理:

  1. CameraCaptureSession#capture,有burst模式,可以一次送多个CaptureRequest
  2. CameraCaptureSession#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设备出现故障时,应用会收到这个异常。

本文链接:http://so.lmcjl.com/news/542/

展开阅读全文