本讲是android camera专题系列的第26讲,我们介绍android camera2 api专题的cameracapturesession详解。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
cameracapturesession概述
配置好的一次会话,用于从camera获取图像,或者reprocess图像。
可能需要几百毫秒才能完成session的创建,hal通常在这个阶段完成如下事情
- 创建pipeline
-
申请buffer
当创建新的session时,旧有session会被关掉,对应有onclosed回调
cameracapturesession.statecallback概述
api | description |
---|---|
onconfigured(cameracapturesession session) | session创建好了,app可以通过它来向底层送capturerequest。 如果有capturerequest正在等待被处理,接下来onactive会被调用,否则onready会被调用。 |
onconfigurefailed(cameracapturesession session) | session创建失败了,可能配置的surface size不支持,或者surface数量配置太多了 |
onsurfaceprepared(cameracapturesession session, surface surface) | 某一个surface预分配buffer完成后会调用该回调,通过cameracapturesession.prepare(surface)对buffer进行预分配。 |
onready(cameracapturesession session) | 当session没有request处理时调用。 |
onactive(cameracapturesession session) | 当session开始处理request时调用。 |
oncapturequeueempty(cameracapturesession session) | 当input capture request queue空了后调用。如果有设置repeating request,则会转去向hal送repeating request了。session第一次创建好时,该方法不会被调用。 当input capture request queue是空的时,pipeline latency是最小的。 |
onclosed(cameracapturesession session) | 该session已经关闭。 |
cameracapturesession.statecallback状态转换
cameracapturesession api介绍
api | description |
---|---|
capture(request, listener, handler) capturesinglerequest(request, executor, listener) | 向camera底层送一个capturerequest,优先级比repeating capturerequest要高。 |
captureburst(requests, listener, handler) captureburstrequests(requests, executor, listener) | 向camera底层送一组capturerequests,优先级比repeating capturerequest要高。这一组capturerequest中间不能被其他capturerequest插入进来,这正是与连续调用capture方法的区别。 |
setrepeatingrequest(request, listener, handler) setsinglerepeatingrequest(request, executor, listener) | 向camera底层送一个capturerequest,底层会不停重复送这一个capturerequest。不支持reprocess capturerequest,因为reprocess capturerequest是通过totalcaptureresult创建而来的。 |
setrepeatingburst(requests, listener, handler) setrepeatingburstrequests(requests, executor, listener) | 向camera底层送一组capturerequests,底层会不停重复送这一组capturerequests。不支持reprocess capturerequest。 |
abortcaptures | 以最快的速度结束当前的requests,in-flight captures可能成功也可能失败,input capture request queue会全部清空。 |
stoprepeating | input capture request queue清空。 |
close | 关闭session。当切换到新的session时或关闭cameradevice时,建议不要调用该方法,直接调用createcapturesession(未改变的output surfaces会被复用)或cameradevice#close方法。 |
api | description |
---|---|
supportsofflineprocessing(surface surface) | 判断指定的surface能否支持切到offline session。 |
switchtooffline(collection |
将指定的offlinesurfaces切换到offline session去处理。 |
isreprocessable() | 判断当前session能否处理reprocess capturerequest。 |
getinputsurface() | 获取reprocess session的输入surface。 |
getdevice() | 获取当前session绑定的camera device。 |
prepare(surface surface) | 预分配指定surface的buffer。会一次性申请该surface允许的最大数量块buffer。通常情况下,surface里面的buffer都是按需分配的,目的是为了减少启动时延和总体内存消耗。 通常情况下,我们可以在预览起来后,对拍照的surface进行prepare,以优化第一次拍照性能,或者拍照过程中预览卡顿现象。 |