本讲是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,以优化第一次拍照性能,或者拍照过程中预览卡顿现象。 |