本讲是android camera专题系列的第18讲,我们介绍android camera2 api专题的reprocessable capture session详解二。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
inputconfiguration简介
inputconfiguration用于创建reprocessable capture session.
如何使用 inputconfiguration
- createreprocessablecapturesession(inputconfiguration, list
outputs, callback, handler) -
createreprocessablecapturesessionbyconfigurations(inputconfiguration, list
outputs, callback, handler) -
createcapturesession (sessionconfiguration config)
如何判断是否支持 reprocessable
- capabilities中必须一种reprocessable capability,才能支持配置inputconfiguration
- private_reprocessing
- yuv_reprocessing
如何获取支持的size和format
- streamconfigurationmap#getinputformats
-
streamconfigurationmap# getinputsizes
inputconfiguration apis
api | description | |
---|---|---|
inputconfiguration(int width, int height, int format) | 根据width,height和format创建inputconfiguration,这里的format必须来自streamconfigurationmap#getinputsizes | api 23 |
inputconfiguration(collection |
根据multiresolutioninputs和format创建inputconfiguration,这里的format必须来自multiresolutionstreamconfigurationmap#getinputformats(),表明从api 31开始reprocessing也支持多分辨率输入 | api 31 |
getformat() | 获取当前inputconfiguration的format | api 23 |
getheight() | 获取当前inputconfiguration的height | api 23 |
getwidth() | 获取当前inputconfiguration的width | api 23 |
ismultiresolution() | 是否为多分辨率的inputconfiguration,多分辨率的inputconfiguration意味着从它创建的reprocessable camera capture session允许输入不同大小的图像。 | api 31 |
cameradevice与reprocessing相关的apis
api | description | api |
---|---|---|
createreprocesscapturerequest(totalcaptureresult inputresult) | 根据totalcaptureresult创建用于处理reprocessing的capturerequest.builder,这里的totalcaptureresult与input image必须匹配,通常通过timestamp进行匹配。 | api 23 |
createreprocessablecapturesession (inputconfiguration inputconfig, list\ |
deprecated in api level 30.创建reprocessable capturesession | api 23 |
createreprocessablecapturesessionbyconfigurations (inputconfiguration inputconfig, list\ |
deprecated in api level 30.创建reprocessable capturesession | api 24 |
createcapturesession(sessionconfiguration config) | 根据sessionconfiguration来创建reprocessable capturesession | api 28 |
cameracapturesession与reprocessing相关的apis
api | description | api |
---|---|---|
isreprocessable | 判断是否可以通过该cameracapturesession submit reprocessable capture requests | api 23 |
getinputsurface | 获取input surface,注意这里只支持一个input surface,也没有必要支持多个input surfaces | api 23 |
imagewriter简介
app通过imagewriter可以向surface送一块buffer
imagewriter queueinputimage flow
方式一:直接将image queue给imagewriter
方式二:先dequeue一张image,填好后再 queue给imagewriter
imagewriter apis
api | description | api |
---|---|---|
newinstance(surface surface, int maximages, int format) | 根据format和maximages创建imagewriter | api 23 |
newinstance(surface surface, int maximages) | 根据maximages创建imagewriter | api 23 |
setonimagereleasedlistener(imagewriter.onimagereleasedlistener listener, handler handler) | 注册onimagereleasedlistener,当consumer将image归还给imagewriter时会调用 | |
dequeueinputimage() | 从imagewriter中dequeue一张image来填 | api 23 |
getmaximages() | 能从imagewriter中dequeue出来的最大image数量。dequeueinputimage的数量超出maximages时会发生illegalstateexception. | api 23 |
queueinputimage(image image) | 向imagewriter queue一张image | api 23 |
getformat() | 获取imagewriter的buffer format。 | api 23 |
close() | 释放该imagewriter的所有资源,close后再使用该imagewriter会发生illegalstateexception | api 23 |
创建imagewriter
newinstance(surface surface, int maximages)
- maximages决定能从imagewriter dequeue的最大image数量,该值要设置适度,太大会占用更多内存
-
imagewriter中的image format和size由surface决定
newinstance(surface surface, int maximages, int format)
- 这里指定的format会覆盖surface中的format
-
比如surface来自surfacetexture默认是pixelformat#rgba_8888,这里的format是imageformat#private,则surface会被覆盖为imageformat#private
-
注意:如果surface的format与输入format有冲突,请确保consumer能吃下输入format
dequeueinputimage
从imagewriter dequeue一张image出来填写
填好后,通过queueinputimage(image) 或 image#close() 还给imagewriter
无image可用时(都在consumer那边未release),该方法会block住
每当consumer归还一张buffer给imagewriter时,onimagereleasedlistener#onimagereleased会被调用
imageformat#private
- < android p,这种format是不允许dequeueinputimage的,会发生illegalstateexception
-
>= android p,这种format允许dequeueinputimage的,app可以通过image#gethardwarebuffer访问
queueinputimage
向imagewriter queue一张图
image来源
- imagereader
- image 属性(size, format, strides, etc.) 必须跟imagewriter dequeue出来的image属性完全一致.
- 如果imagewriter没有free的image可用,该方法会被block住
- imagewriter
- app负责向image填数据
timestamp
- image中的timestamp需要producer来填写
调用频率
- producer可以收到onimagereleasedlistener#onimagereleased后才queue下一张image
调用该方法后,输入image就不能再使用了(可以看成调用了image.close方法)