Android Camera2 API 笔记

冯玮
2023-12-01

概览

枚举、查询和打开可用的相机设备,需要获取一个 CameraManager 实例。
一个 CameraDevices 提供一句静态属性信息,描述了硬件设备和设备的可用设置和输出参数。这些信息是通过 CameraCharacteristics 对象提供的,可以使用 getCameraCharacteristics(String) 获得。

为了从相机捕获图像或图像流,应用首先必须创建一个相机捕获会话(camera capture session),这个会话带有一组输出表面(output Surfaces)来和相机设备(camera device)一起使用,使用 createCaptureSession(SessionConfiguration) 创建会话。每个输出表面必须预先配置一个合适的尺寸和格式,已匹配相机输出的尺寸和格式,输出表面可以是多种类,包括 SurfaceView,SurfaceTexture ,MediaCodec,MediaRecorder,Allocation 和 ImageReader。

通常相机预览图像发送到 SurfaceView 或 TextureView。使用 JPEG 和 RAW_SENSOR 格式的 ImageReader 可以捕获 DngCreator 的 JPEG 图像或 RAW buffers。在 RenderScript,OpenGL ES,直接管理或C/C++代码中,应用程序驱动的相机数据处理最好 YUV 类型使用 Allocation,YUV_420_888 类型使用 SurfaceTexture 和 ImageReader。

然后应用程序需要构建一个捕获请求(CaptureRequest),他定义了一个相机捕获单张图像所需的所有参数和使用哪一个输出表面。一旦请求创建,它可以被传给捕获会话,捕获一次或无限重复使用,这两种方法都有一个变体,它接受一个请求列表,来用作burst capture / repeating burst。重复请求的优先级低于捕获请求,因此通过capture()提交的请求将在当前重复捕获的任何新实例开始捕获之前被捕获。

在处理完一个请求之后,相机设备产生一个 TotalCaptureResult 对象,包含相机捕获时的状态和最终使用的设置。相机设备还会将图像数据的帧发送到请求中包含的每个输出表面。这些都是与输出 CaptureResult 异步生成的,有时会滞后很多。

ClassDescription
CameraCaptureSession为 CameraDevice 配置的捕获会话,用于从相机捕获图像,或者重新处理前面从同一会话中相机捕获的图像
CameraCaptureSession.CaptureCallback一个回调对象,跟踪向相机设备提交的 CaptureRequest 进程
CameraCaptureSession.StateCallback一个回调对象,接收相机捕获会话的状态更新
CameraCharacteristics描述相机设备的属性
CameraCharacteristics.Key<T>Key用于做相机特性字段查询,使用 get(CameraCharacteristics.Key)
CameraConstrainedHighSpeedCaptureSession一个约束的高速捕获会话,从相机设备高速捕获图像,用于高速视频录像
CameraDevice代表连接到Android的单个相机设备,允许在高帧率下对图像捕获和后处理进行精细控制
CameraDevice.StateCallback一个回调对象,接收相机设备状态更新
CameraManager系统服务用于管理检测,查询和连接到相机设备
CameraManager.AvailabilityCallback回调,当相机设备可以打开或不能打开时
CameraManager.TorchCallback回调,当相机闪光灯 torch 模式变成unavailable, disabled, 或 enabled时
CameraMetadata <TKey>相机控制和信息的基类
CaptureFailure从图像传感器捕获单个图像捕获失败的报告
CaptureRequest从相机设备捕获单个图像需要的不可变的设置和输出
CaptureRequest.Builder捕获请求的构建器
CaptureRequest.Key<T>Key 用于捕获请求字段的查询,使用 get(CaptureResult.Key) 或设置字段,使用 set(Key, Object)
CaptureResult从图像传感器捕获单个图像的结果子集
CaptureResult.Key<T>Key 用于捕获结果查询,使用 get(CaptureResult.Key)
DngCreatorDngCreator 类提供写原始像素数据作为 DNG 文件的函数
TotalCaptureResult从图像传感器获取单个图像捕获的总体结果
CameraAccessException如果相机设备不能被 CameraManager 查询或打开,或者连接的相机设备不再可用时,抛出这个异常

CameraCaptureSession

向 createCaptureSession 提供一组目标输出表面创建 CameraCaptureSession,或者向 createReprocessableCaptureSession 提供 InputConfiguration 和一组目标输出表面创建重新处理的捕获会话。一旦创建之后,绘画就被激活,直到相机设备创建新的会话或者关闭相机设备。

所有的捕获会话都可以用于捕获摄像机的图像,但是只有可重新处理的捕获会话可以重新处理之前同一个会话中相机捕获的图像。

创建会话比较耗时,可能花费几百毫秒,因为它需要配置相机设备的内部pipeline,以及分配内存给目标图像,因此设置是异步的,createCaptureSession 和 createReprocessableCaptureSession 会发送 ready-to-use CameraCaptureSession 到提供的监听器的 onConfigured 回调。如果配置不能完成,调用 onConfigureFailed,会话将不被激活。

如果相机设备创建一个新的会话,那么前一个会话被关闭,它关联的 onClosed 回调将被调用。在会话关闭后调用会话的所有方法都将抛出 IllegalStateException。

关闭的会话清除任何重复请求(就像调用 stopRepeating() 一样),但是在新创建的会话接管和重新配置相机设备之前,它仍然会像往常一样完成所有的进程内捕获请求。

Public methods

ReturnNameDescription
abstract voidabortCaptures()丢弃所有当前正在等待和正在进行的捕获,尽可能快
abstract intcapture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)提交一个图像请求,以被相机设备捕获
abstract intcaptureBurst(List<CaptureRequest> requests, CameraCaptureSession.CaptureCallback listener, Handler handler)提交一个请求列表顺序拍摄,以作为连拍
int
captureBurstRequests(List<CaptureRequest> requests, Executor executor, CameraCaptureSession.CaptureCallback listener)
提交一个请求列表顺序拍摄,以作为连拍 Android P 及以上支持
int
captureSingleRequest(CaptureRequest request, Executor executor, CameraCaptureSession.CaptureCallback listener)
提交一个请求,以被相机设备捕获 Android P 及以上支持
abstract voidclose()异步的关闭捕获会话
abstract voidfinalizeOutputConfigurations(List<OutputConfiguration> outputConfigs)最终确定输出配置,包含延迟和/或额外的表面
abstract CameraDevicegetDevice()获取这个会话对应的相机设备
abstract SurfacegetInputSurface()获取重处理捕获会话的表面
abstract booleanisReprocessable()如果应用程序可以通过这个摄像机捕获会话提交重新处理捕获请求,则返回
abstract voidprepare(Surface surface)为输出表面预先分配所有 Buffers
abstract intsetRepeatingBurst(List<CaptureRequest> requests, CameraCaptureSession.CaptureCallback listener, Handler handler)请求无休止地重复捕获会话序列图像
int
setRepeatingBurstRequests(List<CaptureRequest> requests, Executor executor, CameraCaptureSession.CaptureCallback listener)
请求无休止地重复捕获会话序列图像 Android P 及以上支持
abstract intsetRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)请求无休止地重复捕获会话图像
int
setSingleRepeatingRequest(CaptureRequest request, Executor executor, CameraCaptureSession.CaptureCallback listener)请求无休止地重复捕获会话图像 Android P 及以上支持
abstract voidstopRepeating()取消所有由 setRepeatingRequest 或 setRepeatingBurst(List, CameraCaptureSession.CaptureCallback, Handler) 设置的正在重复的捕获
void
updateOutputConfiguration(OutputConfiguration config)
在配置 finalizeOutputConfigurations(List) 之后更新 OutputConfiguration Android P 及以上支

CameraCaptureSession.CaptureCallback

在请求出发捕获开始和捕获完成时回调,如果捕获中产生错误,出发 error 方法,而不是 completion 方法。

Public methods

ReturnNameDescription
voidonCaptureBufferLost(CameraCaptureSession session, CaptureRequest request, Surface target, long frameNumber)当捕获的单个 buffer 不能被送到目标表面
voidonCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)当图像捕获全部完成,所有的结果可以获得的时候调用
voidonCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure)当相机设备不能为请求产生 CaptureResult 时调用
voidonCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult)该方法在图像捕捉取得局部正向进展时调用;一些(但不是全部)图像捕获的结果是可用的
voidonCaptureSequenceAborted(CameraCaptureSession session, int sequenceId)与 CaptureCallback 中其他方法独立,当捕获序列在任何CaptureResult或CaptureFailure之前中止时,通过这个侦听器返回
voidonCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber)与 CaptureCallback 中其他方法独立,当捕获序列完成时,所有CaptureResult或CaptureFailure都通过该侦听器返回
voidonCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber)当相机设备开始捕捉请求的输出图像,在图像曝光开始时,或者当相机设备开始处理一个重新处理请求的输入图像时,就会调用这个方法

CameraCaptureSession.StateCallback

Public methods

ReturnNameDescription
voidonActive(CameraCaptureSession session)当会话开始主动处理捕获请求时调用此方法
voidonCaptureQueueEmpty(CameraCaptureSession session)当摄像机设备的输入捕获队列为空,并准备接受下一个请求时,该方法将被调用
voidonClosed(CameraCaptureSession session)会话被关闭时调用
abstract voidonConfigureFailed(CameraCaptureSession session)如果会话不能按要求配置,调用此方法
abstract voidonConfigured(CameraCaptureSession session)当摄像机设备完成自身配置,并且会话可以开始处理捕获请求时,该方法被调用
voidonReady(CameraCaptureSession session)此方法在每次会话没有捕获请求时调用
voidonSurfacePrepared(CameraCaptureSession session, Surface surface)当输出表面的缓冲区预分配完成时,将调用此方法

CameraCharacteristics

描述 CameraDevice 属性
对于给定的相机是固定的,可以通过 CameraManager 接口的 getCameraCharacteristics(String) 查询。

字段

TypeNameDescription
public static final Key<int[]>COLOR_CORRECTION_AVAILABLE_ABERRATION_MODESandroid.colorCorrection.aberrationMode 中相机支持的畸变矫正模式列表
public static final Key<int[]>CONTROL_AE_AVAILABLE_ANTIBANDING_MODESandroid.control.aeAntibandingMode 中相机支持的自动曝光 antibanding 模式列表
public static final Key<int[]>CONTROL_AE_AVAILABLE_MODESandroid.control.aeMode 中相机支持的自动曝光模式列表
public static final Key<Range[]<Integer>>CONTROL_AE_AVAILABLE_TARGET_FPS_RANGESandroid.control.aeTargetFpsRange 中相机支持的帧率范围列表
public static final Key<Range[]<Integer>>CONTROL_AE_COMPENSATION_RANGEandroid.control.aeCompensationStep 中 android.control.aeExposureCompensation,相机支持的最大最小曝光补偿值
public static final Key<Rational>CONTROL_AE_COMPENSATION_STEP曝光补偿可以改变的最小步长
public static final Key<Boolean>CONTROL_AE_LOCK_AVAILABLE相机是否支持 android.control.aeLock,具有 MANUAL_SENSOR 功能或 BURST_CAPTURE 功能的设备将始终是 true
public static final Key<int[]>CONTROL_AF_AVAILABLE_MODESandroid.control.afMode 中相机支持的自动对焦模式
public static final Key<int[]>CONTROL_AVAILABLE_EFFECTSandroid.control.effectMode 中相机支持的所有颜色效果列表
public static final Key<int[]>CONTROL_AVAILABLE_MODESandroid.control.mode 中相机支持的控制模式列表
public static final Key<int[]>CONTROL_AVAILABLE_SCENE_MODESandroid.control.sceneMode 中相机支持的场景模式列表
public static final Key<int[]>CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODESandroid.control.videoStabilizationMode 中相机支持的视频稳定模式列表
public static final Key<int[]>CONTROL_AWB_AVAILABLE_MODESandroid.control.awbMode中相机支持的自动白平衡模式列表
public static final Key<Boolean>CONTROL_AWB_LOCK_AVAILABLE相机设备是否支持 android.control.awbLock,具有 MANUAL_POST_PROCESSING 功能或 BURST_CAPTURE 功能的设备将始终是 true
public static final Key<Integer>CONTROL_MAX_REGIONS_AE自动曝光(AE)可使用的最大计量区域值
public static final Key<Integer>CONTROL_MAX_REGIONS_AF自动对焦(AF)可使用的最大计量区域值
public static final Key<Integer>CONTROL_MAX_REGIONS_AWB自动白平衡(AWB)可使用的最大计量区域值
public static final Key<Range<Integer>>CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGEandroid.control.postRawSensitivityBoost 中相机支持的 boosts 范围
public static final Key<Boolean>DEPTH_DEPTH_IS_EXCLUSIVE指示捕获请求是否可以同时针对DEPTH16 / DEPTH_POINT_CLOUD输出和正常的颜色输出(例如YUV_420_ 888、JPEG或RAW)
public static final Key<int[]>DISTORTION_CORRECTION_AVAILABLE_MODESandroid.distortionCorrection.mode 中相机支持的畸变矫正模式列表
public static final Key<int[]>EDGE_AVAILABLE_EDGE_MODESandroid.edge.mode 中相机支持的边缘增强模式
public static final Key<Boolean>FLASH_INFO_AVAILABLE相机是否包含Flash
public static final Key<int[]>HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODESandroid.hotPixel.mode 中相机支持的像素矫正模式
public static final Key<<Integer>INFO_SUPPORTED_HARDWARE_LEVEL通常将相机设备功能的总体集进行分类
public static final Key<String>INFO_VERSION用于制造商版本信息的短字符串,如ISP硬件、传感器等
public static final Key<<Size[]>JPEG_AVAILABLE_THUMBNAIL_SIZESandroid.jpeg.thumbnailSize 中相机设备支持的 JPEG 缩略图大小
public static final Key<float[]>LENS_DISTORTION对该相机装置的径向和切向镜头畸变校正的校正系数
public static final Key<Integer>LENS_FACING相机方向相对于设备屏幕
public static final Key<float[]>LENS_INFO_AVAILABLE_APERTURESandroid.lens.aperture 中相机支持的光圈大小值列表
public static final Key<float[]>LENS_INFO_AVAILABLE_FILTER_DENSITIESandroid.lens.filterDensity 中相机支持的中性密度过滤值列表
public static final Key<float[]>LENS_INFO_AVAILABLE_FOCAL_LENGTHSandroid.lens.focalLength 中相机支持的焦距
public static final Key<int[]>LENS_INFO_AVAILABLE_OPTICAL_STABILIZATIONandroid.lens.opticalStabilizationMode 中相机支持的光学图像稳定(OIS)模式列表
public static final Key<Integer>LENS_INFO_FOCUS_DISTANCE_CALIBRATION镜头聚焦距离校准质量
public static final Key<Float>LENS_INFO_HYPERFOCAL_DISTANCE这个镜头的超焦距
public static final Key<Float>LENS_INFO_MINIMUM_FOCUS_DISTANCE在镜头前的最短距离,可以使镜头聚焦
public static final Key<float[]>LENS_INTRINSIC_CALIBRATION该相机设备的内部校准参数
public static final Key<Integer>LENS_POSE_REFERENCEandroid.lens.poseTranslation的初始
public static final Key<float[]>LENS_POSE_ROTATION相机相对于传感器坐标系的方向
public static final Key<float[]>LENS_POSE_TRANSLATION相机光学中心位置
public static final Key<float[]>LENS_RADIAL_DISTORTION在Android P中弃用 使用 android.lens.distortion 代替
public static final Key<Integer>LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE物理相机之间帧时间戳同步的准确性。帧时间戳同步的准确性决定了物理相机在同一时间开始曝光的能力
public static final Key<int[]>NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODESandroid.noiseReduction.mode 中相机设备支持降噪模式列表
public static final Key<Integer>REPROCESS_MAX_CAPTURE_STALL通过重新处理捕获请求引入的最大摄像机捕获pipeline(单位为帧数)
public static final Key<int[]>REQUEST_AVAILABLE_CAPABILITIES这个相机设备完全支持的功能列表
public static final Key<Integer>REQUEST_MAX_NUM_INPUT_STREAMS任何类型的输入流的最大数量,这些输入流可以同时被相机设备配置和使用
public static final Key<Integer>REQUEST_MAX_NUM_OUTPUT_PROC可以被一个摄像机设备任意处理格式(除了not-stalling)同时配置和使用的任意处理格式的不同类型的输出流的最大数量
public static final Key<Integer>REQUEST_MAX_NUM_OUTPUT_PROC_STALLING可以被一个摄像机设备对任意处理格式(包括 stalling)同时配置和使用的不同类型的输出流的最大数量
public static final Key<Integer>REQUEST_MAX_NUM_OUTPUT_RAW可以被一个摄像机设备对 Raw 格式同时配置和使用的任意处理格式(除了not-stalling)的不同类型的输出流的最大数量
public static final Key<Integer>REQUEST_PARTIAL_RESULT_COUNT定义一个结果将由多少子组件组成
public static final Key<Byte>REQUEST_PIPELINE_MAX_DEPTH定义一个帧从曝光到可获得需要经过的最大 pipeline 阶段数量
public static final Key<Float>SCALER_AVAILABLE_MAX_DIGITAL_ZOOMactive area 宽度/高度与 crop region 宽度/高度的最大比值
public static final Key<Integer>SCALER_CROPPING_TYPE相机设备支持的剪切类型
public static final Key<StreamConfigurationMap>SCALER_STREAM_CONFIGURATION_MAP该相机设备支持的可用流配置;还包括最小帧间隔和每个格式/大小组合的延迟时间
public static final Key<int[]>SENSOR_AVAILABLE_TEST_PATTERN_MODESandroid.sensor.testPatternMode 中相机支持的传感器测试模式的列表
public static final Key<BlackLevelPattern>SENSOR_BLACK_LEVEL_PATTERN一个固定的黑色电平偏置
public static final Key<ColorSpaceTransform>SENSOR_CALIBRATION_TRANSFORM1每个器件的校准转换矩阵,从参考传感器颜色空间到实际的传感器颜色空间
public static final Key<ColorSpaceTransform>SENSOR_CALIBRATION_TRANSFORM2每个器件的校准转换矩阵,从参考传感器颜色空间到实际的传感器颜色空间(这是原始缓冲区数据的颜色空间)
public static final Key<ColorSpaceTransform>SENSOR_COLOR_TRANSFORM1将颜色值从CIE XYZ颜色空间转换为参考传感器颜色空间的矩阵
public static final Key<ColorSpaceTransform>SENSOR_COLOR_TRANSFORM2将颜色值从CIE XYZ颜色空间转换为参考传感器颜色空间的矩阵
public static final Key<ColorSpaceTransform>SENSOR_FORWARD_MATRIX1用D50白点将白色平衡相机颜色从参考传感器的颜色空间转换为CIE XYZ 颜色空间的矩阵
public static final Key<ColorSpaceTransform>SENSOR_FORWARD_MATRIX2用D50白点将白色平衡相机颜色从参考传感器的颜色空间转换为CIE XYZ 颜色空间的矩阵
public static final Key<Rect>SENSOR_INFO_ACTIVE_ARRAY_SIZE在任何几何畸变校正后,对应于活动像素的图像传感器面积
public static final Key<Integer>SENSOR_INFO_COLOR_FILTER_ARRANGEMENT传感器上颜色滤波器的排列
public static final Key<Range<Long>>SENSOR_INFO_EXPOSURE_TIME_RANGEandroid.sensor.exposureTime 中相机支持的曝光时间范围
public static final Key<Boolean>SENSOR_INFO_LENS_SHADING_APPLIED该相机设备的原始图像输出是否受到镜头阴影校正
public static final Key<Long>SENSOR_INFO_MAX_FRAME_DURATIONandroid.sensor.frameDuration 中相机支持的最大帧间隔
public static final Key<SizeF>SENSOR_INFO_PHYSICAL_SIZE全像素阵列的物理尺寸
public static final Key<Size>SENSOR_INFO_PIXEL_ARRAY_SIZE全像素阵列的尺寸,可能包括黑色校准像素
public static final Key<Rect>SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE在应用任何几何畸变校正之前,对应于活动像素的图像传感器的面积
public static final Key<Range<Integer>>SENSOR_INFO_SENSITIVITY_RANGEandroid.sensor.sensitivity 中相机设备支持的敏感范围
public static final Key<Integer>SENSOR_INFO_TIMESTAMP_SOURCE传感器捕获开始时间戳的时间基础
public static final Key<Integer>SENSOR_INFO_WHITE_LEVEL传感器最大的原始值输出
public static final Key<Integer>SENSOR_MAX_ANALOG_SENSITIVITY完全通过模拟增益实现的最大灵敏度
public static final Key<Rect[]>SENSOR_OPTICAL_BLACK_REGIONS指示传感器光学屏蔽黑色像素区域的不相交矩形列表
public static final Key<Integer>SENSOR_ORIENTATION按顺时针的角度,输出图像需要在设备屏幕上以本机方向旋转
public static final Key<Integer>SENSOR_REFERENCE_ILLUMINANT1当计算 android.sensor.colorTransform1, android.sensor.calibrationTransform1, 和 android.sensor.forwardMatrix1 矩阵时标准参考光源用作场景光源
public static final Key<Byte>SENSOR_REFERENCE_ILLUMINANT2当计算 android.sensor.colorTransform2, android.sensor.calibrationTransform2, 和 android.sensor.forwardMatrix2 矩阵时标准参考光源用作场景光源
public static final Key<int[]>SHADING_AVAILABLE_MODESandroid.shading.mode 中相机支持的镜头遮光模式列表
public static final Key<int[]>STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODESandroid.statistics.faceDetectMode 中相机支持的人脸检测模式
public static final Key<boolean[]>STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODESandroid.statistics.hotPixelMapMode 中相机支持的热像素图输出模式列表
public static final Key<int[]>STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODESandroid.statistics.lensShadingMapMode 中相机支持的镜头遮阳图输出模式列表
public static final Key<int[]>STATISTICS_INFO_AVAILABLE_OIS_DATA_MODESandroid.statistics.oisDataMode 中相机支持的 OIS 数据输出模式列表
public static final Key<Integer>STATISTICS_INFO_MAX_FACE_COUNT同时可检测到的面孔的最大数量
public static final Key<Integer>SYNC_MAX_LATENCY在请求(不同于之前的请求)之后可能出现的最大帧数,在结果的状态被同步之前
public static final Key<int[]>TONEMAP_AVAILABLE_TONE_MAP_MODESandroid.tonemap.mode 中相机支持的tonemapping模式列表
public static final Key<Integer>TONEMAP_MAX_CURVE_POINTS在tonemap曲线中可用于android.tonemap.curve的支持点的最大数量

Public methods

ReturnNameDescription
<T>Tget(Key<T> key)获取相机特性字段值
List<Key<?>>getAvailableCaptureRequestKeys()返回相机设备支持的用 CaptureRequest 查询的Key列表
List<Key<?>>getAvailablePhysicalCameraRequestKeys()返回一个getAvailableCaptureRequestKeys()键的子集,它可以作为支持逻辑多摄像头的物理设备的overriden
List<Key<?>>getAvailableSessionKeys()返回相机设备可以作为捕获会话初始化的一部分传递的getAvailableCaptureRequestKeys()的子集。
List<Key<?>>getKeys()返回此映射中包含的键的列表
Set<String>getPhysicalCameraIds()返回该逻辑摄像机所组成的物理摄像机id集
 类似资料: