第21讲 createcapturesession详解 -凯发k8旗舰厅

本讲是android camera专题系列的第21讲,我们介绍android camera2 api专题的createcapturesession详解。

更多资源:

资源 描述
在线课程
知识星球 星球名称:深入浅出android camera
星球id: 17296815
wechat 极客笔记圈

createcapturesession (sessionconfiguration config)注意事项

创建cameracapturesession

  • 创建cameracapturesession时,需要包含所有的output/input surfaces
  • 创建好cameracapturesession后,提交的capturerequest中带的surfaces只能在这组surfaces里面选择

创建cameracapturesession一般需要几百毫秒,camera hal会对一些硬件做上电操作、创建pipeline动作等等

cameracapturesession的切换

  • 直接调用createcapturesession,前面的cameracapturesession会被close掉
  • 最快的切换方式

    • 先调用旧cameracapturesession#abortcaptures,再创建新的cameracapturesession

根据不同的场景选择surface

场景 surface组件 使用方法
preview surfaceview surfacecreated(surfaceholder holder)时调用surfaceholder.setfixedsize(int, int)设置size,然后调用surfaceholder.getsurface()来获取surface
opengl es处理(preview) surfacetexture 调用surfacetexture.setdefaultbuffersize(int, int)设置size,然后通过new surface(surfacetexture)来获取surface
录像 mediacodec 配置完mediacodec后,调用mediacodec.createinputsurface()来获取surface
录像 mediarecorder 配置完mediarecorder后,调用mediarecorder.getsurface()来获取surface
yuv处理 renderscript 配置好allocation后,调用allocation.getsurface()来获取surface
抓图(raw/yuv/jpeg…) imagereader 配置好imagereader后,调用imagereader.getsurface()来获取surface
reprocess cameracapturesession cameracapturesession创建好后,调用cameracapturesession#getinputsurface来获取surface

流配置表说明

format

  • priv: imageformat.private,对app透明的
  • yuv: imageformat.yuv_420_888

  • jpeg: imageformat.jpeg

  • raw: imageformat.raw_sensor

size

  • preview:跟屏幕宽高比一致,<=1080p

  • record: camcorderprofile中定义的最大录像size

  • maximum: streamconfigurationmap#getoutputsizes中的最大值

  • multi_res : multiresolutionstreamconfigurationmap#getoutputinfo(int)获取到的值

超出流配置表限制

如何理解是否超出表格限制

  • 某一行表示一个streams configuration组合,比如这一行支持8mp yuv和2mp priv
    • [8 mp yuv, 2 mp priv] 或者 [2 mp yuv, 2 mp priv]组合配置能成功
    • [8 mp yuv, 4 mp priv], 或者 [4 mp yuv, 4 mp priv], 或者 [8 mp priv, 2 mp yuv]不能确保是否成功

  • 如果app使用超出下面表格限制的surfaces来创建session,有三种可能发生

    1. cameracapturesession能创建成功,并能正常工作
    2. cameracapturesession能创建成功,但帧率无法达到streamconfigurationmap#getoutputminframeduration的要求

    3. cameracapturesession创建失败

  • 也有可能可以成功创建session,可以通过如下两种方式尝试

    • issessionconfigurationsupported(sessionconfiguration)
    • 调用createcapturesession看是否不会发生exception 或 收到onconfigured回调

regular流配置表

regular capture – legacy

regular capture - legacy

regular capture – limited

regular capture - limited

regular capture – full

regular capture - full

regular capture – raw capability

regular capture – raw capability

regular capture – burst capability

regular capture – burst capability

regular capture – level_3

regular capture – level_3

regular capture – concurrent stream

regular capture – concurrent stream

regular capture – multiresolutionoutputs legacy level

regular capture – multiresolutionoutputs legacy level

regular capture – multiresolutionoutputs limited level

regular capture – multiresolutionoutputs limited level

regular capture – 特殊对待qcif

  • 前面介绍的一定支持的流配置表时,提到只要小于这个表中的size也能支持,但有一个例外:qcif(176×144)
  • 因为通常camera底层的downscale能力都是有限的(最大能downscale多少倍),如果从>= 1920×1080的分辨率downscale到176×144,有可能不支持

constrained high-speed recording流配置

支持constrained_high_speed_video capability

帧率>=120fps

与普通capture session比,有如下限制

  • 最多支持2个output surfaces

  • 每个output surface的size必须一样,来自streamconfigurationmap#gethighspeedvideosizes

  • 只能通过captureburst 或 setrepeatingburst方法向camera底层送capturerequest list,capturerequest list来自cameraconstrainedhighspeedcapturesession#createhighspeedrequestlist

  • fps range必须来自streamconfigurationmap#gethighspeedvideofpsrangesfor

camera课程

python教程

java教程

web教程

数据库教程

图形图像教程

办公软件教程

linux教程

计算机教程

大数据教程

开发工具教程

android camera2 api

网站地图