本讲是android camera专题系列的第13讲,我们介绍android camera2 api专题的为什么需要outputconfiguration。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
为什么需要outputconfiguration
createcapturesession(list
已经不能满足新功能的需求了(如deferred surface,surface sharing)
由此引入新的api
createcapturesessionbyoutputconfigurations(list
outputconfigurations, callback, handler)
outputconfiguration概述
用于描述一个输出流的配置信息,一个outputconfiguration在camera hal对应一条stream
可以根据需求,使用不同的方式来创建outputconfiguration
包括如下功能
- 设置deferred surface
-
设置surface group
-
设置physical camera id
-
设置surface sharing
-
设置sensor pixel mode
-
设置multiresolution outputconfiguration
outputconfiguration的创建方式
创建方式 | 描述 |
---|---|
outputconfiguration(surface surface) 普通方式,最常用 | 将一个ready的surface作为参数传递给outputconfiguration来构建outputconfiguration对象。 |
outputconfiguration(size surfacesize, class |
通过surface source class和surface size作为参数传递给outputconfiguration来构建outputconfiguration对象。 这种方式,在session创建的过程中并行做surface的初始化,从而提升性能。比如不用等待surfaceview ready就可以创建session。 |
outputconfiguration(int surfacegroupid, surface surface) surface group方式,优化内存使用 | 指定这个surface属于哪个surface group,同一个surface group的surfaces可以共享内存。 |
reateinstancesformultiresolutionoutput multiresolution方式 | 根据multiresolutionimagereader创建多个outputconfiguration |
deferred surface
deferred surface只能是
- surfaceholder
- surfacetexture
为什么?
- 因为其他方式创建的surface可以马上获取到
送capturerequest给底层处理时,如果deferred surface还未ready,则不能带进capturerequest,必须要finalize 过的surface才能带进capturerequest。
cameracapturesession#finalizeoutputconfigurations
当deferred surface或extra surfaces被added后,调用该方法来finalize outputconfigurations
多个surfaces共用一个outputconfiguration时,当有新的surface available时,也可以调用该方法来finalize
finalize的理解
- 将buffer的producer设置给cameraservice,通过producer,cameraservice可以获取buffer handle
surface group
通常surface group中的surfaces不会同时要求出流。
同一个surface group中的surfaces会共享同一块内存,从而减少整体内存的使用量。
app只需要为想要共享内存的surfaces设置同一个surface group id即可,具体的内存申请/复用由camera service负责。
当surface group id为负数时,表示不共享surface group。
当在capturerequest中设置多个同一surface group id的surfaces时,可能会比这些surfaces来自不同的surface group id更耗内存。
应用场景:
- 一个视频聊天app能够自适应输出不同分辨率的视频,且这些不同的分辨率视频同时只会有一个在输出,此时,app可以将这些不同分辨率的视频设置为同一个surface group id以达到共享内存的目的。
surface sharing
使用流程
- 在创建camera capture session前调用outputconfiguration的enablesurfacesharing方法使能surface sharing
-
调用outputconfiguration#addsurface 或 outputconfiguration#removesurface 后,通过cameracapturesession#updateoutputconfiguration更新outputconfiguration
最多支持4个surfaces sharing一个outputconfiguration
哪些format可以share?
- < android p:只有imageformat#private可以被share
-
>= android p :除去imageformat#jpeg 和 imageformat#raw_private外的其他formats
好处
- 在不打断现有repeating capturerequest的情况下,app可以切换不同的output surface
cameracapturesession#updateoutputconfiguration
在finalize outputconfiguration后,通过该方法去更新outputconfiguration
调用outputconfiguration#addsurface 或 outputconfiguration#removesurface 后,需要通过该方法去更新outputconfiguration
调用该方法无异常发生时,那在接下来的capturerequest中可以使用新增加的surface
remove的surfaces不能被包含在正在被处理的capturerequest中