本讲是Android Camera专题系列的第14讲,我们介绍Android Camera2 API专题的OutputConfiguration API详解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
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