第14讲 OutputConfiguration API详解 - Android Camera2 API

本讲是Android Camera专题系列的第14讲,我们介绍Android Camera2 API专题的OutputConfiguration API详解。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

Android Camera2 API课程体系

Android Camera2 API课程体系

OutputConfiguration API概述

API 描述
enableSurfaceSharing() 使能多个Surfaces共享同一个OutputConfiguration
getMaxSharedSurfaceCount() 获取当前OutputConfiguration最大可以被几个Surfaces Share,目前是4个
removeSurface(Surface surface) 删除不需要Share的Surface
addSurface(Surface surface) 向OutputConfiguration增加一个Surface;Deferred Surface和Surface Sharing都需要调用该方法
getSurfaceGroupId() 获取该OutputConfiguration的Surface Group ID
setPhysicalCameraId(String physicalCameraId) 设置该OutputConfiguration属于哪个Physical Camera
addSensorPixelModeUsed(int sensorPixelModeUsed) 设置该OutputConfiguration的Sensor Pixel Mode
removeSensorPixelModeUsed(int sensorPixelModeUsed) 移除之前Add过的Sensor Pixel Mode,如果移除未Add过的Sensor Pixel Mode会发生IllegalArgumentException
createInstancesForMultiResolutionOutput(MultiResolutionImageReader multiResolutionImageReader) 通过MultiResolutionImageReader创建一个Multiresolution的OutputConfiguration列表

enableSurfaceSharing

当App配置的Stream数量超出底层支持的限制时,可以考虑使用Surface Sharing功能。

哪些Surfaces满足Surface Sharing的条件

  • 相同的 size, format, dataSpace, 和 Surface source class,则一定可以Surface Sharing

  • 相同的size, format, 和 dataSpace, 不同的Surface source,则不一定能支持Surface Sharing,如果用这样的OutputConfiguration配置来创建Camera Capture Session,成功则表示可以Share,失败则表示无法Share。

enableSurfaceSharing必须在createCaptureSessionByOutputConfigurations前设置。

通过getMaxSharedSurfaceCount获取当前OutputConfiguration最大支持多少个Surface share同一个stream,目前是hardcode写死为4个。

removeSurface

从OutputConfiguration中移除不需要Share的Surface

用于创建OutputConfiguration的Surface不能被Remove,也就是下列Surface无法被移除

  • 通过构造函数直接传入的Surface

  • 第一次调用addSurface的Deferred Surface

移除未Add过的Surface会发生IllegalArgumentException

addSurface

向OutputConfiguration增加一个Surface

  • For sharing,重复add同一个Surface会发生 IllegalArgumentException
    • Add Surface时要求Size,format,dataspace都一致,否则会发生IllegalArgumentException

Deferred Surface,用于增加已经Ready的Surface

setPhysicalCameraId

一个Logical Camera设备可能对应多个Physical Camera设备,App如何想获取某个Physical Camera的Stream,则需要通过该方法对OutputConfiguration设置Physical Camera ID

合法的Physical Camera ID需要从CameraCharacteristics.getPhysicalCameraIds获取

该方法必须在创建Camera Capture Session之前调用

对Reprocess的支持(待验证)

  • < Android 12:Physical camera stream不能作为Input stream

  • >= Android 12:Physical camera stream可以给logical camera stream reprocess,Physical camera stream可以给physical camera stream reprocess。

addSensorPixelModeUsed(待验证)

可设置的Sensor Pixel Mode

  • CameraMetadata.SENSOR_PIXEL_MODE_DEFAULT
    • StreamConfigurationMap只能来自CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP
  • CameraMetadata.SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION
    • 支持的Capabilities中包含REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR 才能设置这种Sensor Pixel Mode
    • StreamConfigurationMap只能来自CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP_MAXIMUM_RESOLUTION

CaptureRequest需要搭配设置CaptureRequest.SENSOR_PIXEL_MODE参数

MultiResolutionImageReader(待验证)

MultiResolutionImageReader将多个ImageReader封装在一起,这些ImageReader具体如下特性

  • 相同的format,不同的size或不同的Camera ID或不同的Sensor Mode

应用场景

  • Multi-Camera
    • SAT 不同的Physical Camera有不同的Max Resolution,因此针对同一个Logical MultiCamera,在不同的Zoom值下,同一个format对应的Max Resolution可能不一样
  • Ultra high resolution sensor camera
    • 会根据光照条件决定是否要Enable Remosaic Mode,所以拍照的分辨率可能会在最大分辨率和默认分辨率间切换

Stream Configuration Map

  • CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_CONFIGURATION_MAP

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera2 API