第13讲 为什么需要OutputConfiguration - Android Camera2 API

本讲是Android Camera专题系列的第13讲,我们介绍Android Camera2 API专题的为什么需要OutputConfiguration。

更多资源:

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

为什么需要OutputConfiguration

createCaptureSession(List<Surface> outputs, callback, handler) 已经不能满足新功能的需求了(如Deferred Surface,Surface Sharing)

由此引入新的API

  • createCaptureSessionByOutputConfigurations(List<OutputConfiguration> outputConfigurations, callback, handler)

OutputConfiguration概述

用于描述一个输出流的配置信息,一个OutputConfiguration在Camera HAL对应一条Stream

可以根据需求,使用不同的方式来创建OutputConfiguration

包括如下功能

  1. 设置Deferred Surface

  2. 设置Surface Group

  3. 设置Physical Camera ID

  4. 设置Surface Sharing

  5. 设置Sensor Pixel Mode

  6. 设置MultiResolution OutputConfiguration

OutputConfiguration的创建方式

创建方式 描述
OutputConfiguration(Surface surface) 普通方式,最常用 将一个Ready的Surface作为参数传递给OutputConfiguration来构建OutputConfiguration对象。
OutputConfiguration(Size surfaceSize, Class klass) Deferred Surface方式,优化启动性能 通过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

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

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中

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera2 API