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

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

视频在线观看:

加入知识星球与更多Camera同学交流

  • 星球名称:深入浅出Android Camera
  • 星球ID: 17296815

为什么需要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中

赞(6)
未经允许不得转载:极客笔记 » 第13讲 为什么需要OutputConfiguration

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
Android Camera2参考
Android Camera2参考概述
Android Camera2参数参考
Android Camera2参数参考概述
Android Camera2指南
Android Camera2指南概述
Android Camera HAL开发
Android Camera HAL开发概述
Android Camera2 API
第2讲 Android Camera 架构介绍第3讲 Camera2 API 概述第4讲 Open和Close Camera流程第5讲 GeekCamera2介绍第6讲 Open和Close Camera代码实现第7讲 Hardware Level详解第8讲 AVAILABLE_CAPABILITIES详解第9讲 StreamConfigurationMap详解一第10讲 StreamConfigurationMap详解二第11讲 StreamConfigurationMap实战一第12讲 StreamConfigurationMap实战二第13讲 为什么需要OutputConfiguration第14讲 OutputConfiguration API详解第15讲 Surface Sharing实战第16讲 Deferred Surface实战第17讲 Reprocessable Capture Session详解一第18讲 Reprocessable Capture Session详解二第19讲 App如何实现ZSL功能第20讲 SessionConfiguration详解第21讲 createCaptureSession详解第22讲 SessionParameter实战第23讲 CaptureRequest详解第24讲 如何操作VendorTag第25讲 获取Physical Camera数据流第26讲 CameraCaptureSession详解第27讲 CameraCaptureSession.CaptureCallback详解第28讲 GeekCamera2连拍实战第29讲 SlowMotion实战第30讲 CaptureResult详解第31讲 AE自动曝光 Part 1第32讲 AE自动曝光 Part 2第33讲 AE自动曝光实战第34讲 AE手动曝光第35讲 AE手动曝光实战第36讲 Flash闪光灯控制第37讲 拍照打闪实战第38讲 通过CropRegion控制Zoom缩放第39讲 通过ZoomRatio控制Zoom缩放第40讲 Digital Zoom缩放实战第41讲 Touch AE实战第42讲 AF自动对焦第43讲 AF自动对焦 第二部分第44讲 AF自动对焦实战第45讲 手动对焦实战第46讲 AWB自动白平衡第47讲 AWB自动白平衡实战第48讲 FD人脸检测第49讲 Android13 Camera2 New APIs介绍