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