本讲是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