Android 中的拍照请求调度机制(CaptureRequest Flow)

Android 中的拍照请求调度机制(CaptureRequest Flow)

关键词:CaptureRequest、CameraCaptureSession、RequestQueue、RepeatingRequest、Burst、帧控制、拍照调度、拍照流、Camera2

摘要
在 Android Camera2 架构中,CaptureRequest 是拍照与图像控制的核心载体。其调度过程从开发者提交请求,到 HAL 层实际执行,再到回传图像与 Metadata 的全链路流程,构成了 Android 拍照系统的底层执行基础。本篇文章将以工程实战为导向,深入剖析 CaptureRequest 的调度路径、请求队列机制、帧控制策略与拍照流程优化方法,帮助开发者理解拍照任务的生命周期管理与性能调优关键点,适配多 UseCase 与平台差异的实战需求。


目录

  1. 请求发起全流程概览:从 setRepeatingRequest 到帧开始传输

    • CameraDevice 与 CameraCaptureSession 的协作流程
    • 单次 vs 重复请求的处理路径
    • Preview 与 Capture 的并发调度机制
  2. CaptureRequest 的构造与参数绑定策略

    • 曝光、对焦、白平衡等核心控制字段配置
    • Tag、Template 类型的作用与使用技巧
    • 实战构建流程:从 Builder 到 Request 的状态管理
  3. 请求队列机制详解:RequestQueue 的内部结构与执行顺序

    • 请求缓存策略与 Pipeline 的最大容量限制
    • 请求覆盖、清空、暂停的触发条件分析
    • 使用 capture() vs setRepeatingRequest() 的队列影响
  4. 拍照流程中 Repeating Request 的插队逻辑

    • 拍照中断预览的调度流程解析
    • stopRepeating() 的使用时机与线程同步建议
    • 拍照完成后恢复预览的 Session 重建策略
  5. Burst 拍照支持与多请求同步调度机制

    • captureBurst() 提交多帧请求的条件限制
    • 多帧连续拍照的帧间隔控制技巧
    • 高速连拍场景下的性能瓶颈与缓冲区回收策略
  6. Request 状态反馈机制:从提交到 onCaptureCompleted 的映射链

    • 如何监听请求提交、开始、完成、失败等状态
    • 多 UseCase 下的 RequestID → FrameNumber 映射跟踪方法
    • 同步与异步回调流程分析
  7. 请求调度中的性能优化路径与错误排查技巧

    • 减少无效请求重复提交的判断逻辑
    • 拍照卡顿与帧等待分析:HAL、ISP、内存瓶颈定位方法
    • Request 排查常用日志与调试策略分享
  8. 多平台行为差异与兼容性适配策略

    • MTK/QTI/Exynos 平台对 Request 排队机制的处理差异
    • ZSL 与非 ZSL 模式下的拍照请求组合推荐
    • 构建平台通用 RequestController 模块的建议与结构示例

一、请求发起全流程概览:从 setRepeatingRequest 到帧开始传输

在 Android Camera2 架构中,所有拍照行为的本质都是通过 CaptureRequest 对相机硬件发出控制指令。这一请求从应用层构建,通过 CameraCaptureSession 提交,最终经由 HAL 被下发到 ISP 和 Sensor,完成图像采集与传输。理解从 setRepeatingRequest() 到第一帧输出之间的执行链路,是进行多 UseCase 管理与拍照性能调优的基础。


1. CameraDevice 与 CameraCaptureSession 的协作流程

Camera2 架构下,CameraDevice 代表的是相机设备本身,它负责连接 HAL 层与上层的 API 接口。而 CameraCaptureSession 则是围绕某一组 Surface 所建立的图像采集会话,它将多个 CaptureRequest 编排到一个连续的流中,控制图像如何输出到 Preview、ImageReader 或 MediaRecorder 等目标。

创建流程简要回顾:

cameraDevice.createCaptureSession(
    Arrays.asList(previewSurface, imageReaderSurface),
    new StateCallback() {
    ... },
    handler);

会话建立成功后,所有图像请求必须通过该 Session 的 capture()setRepeatingRequest() 提交,才能进入底层传输流程。


2. 单次 vs 重复请求的处理路径
  • setRepeatingRequest():用于持续输出图像流,常用于 Preview、实时分析等场景。底层会生成一个持久请求链(Request Queue 中的 repeating slot),直到明确调用 stopRepeating() 清除。
  • capture():执行一次性请求,常用于拍照、自动对焦锁定、曝光测量等一次性动作。会在当前请求队列中插入一帧或多帧的请求,执行完毕后自动清除。

系统内部将两类请求分别管理,在调度层(例如 Camera3Device)中将 repeatingnon-repeating 分离处理,并确保一次性请求可以插队执行,再在合适时间点恢复 repeatingRequest


3. Preview 与 Capture 的并发调度机制

Android 设备通常支持至少两路并发输出流,Preview 是最典型的连续输出 UseCase,而 Capture(ImageCapture)是触发式输出:

  • Preview:通过 setRepeatingRequest() 长时间输出
  • Capture:调用 capture() 中断或共享输出流资源

调度流程:

  1. Preview 设置为 repeating request,不断输出图像到 Preview Surface。
  2. 用户点击快门,构建一个新的 CaptureRequest,加入 JPEG 输出 Surface,调用 capture()
  3. 系统将 repeatingRequest 暂停,将新的 CaptureRequest 插入队列。
  4. 拍照完成后,系统自动恢复 repeatingRequest,继续 Preview 流。

这种行为在 Camera3OutputStreamInterface 层被精准调度,确保前后台切换、快门响应与帧数据输出同步进行。


通过以上流程的理解,开发者可以掌握在不同场景中如何精确控制请求顺序、保持图像流稳定,并针对平台兼容性设计更加稳健的拍照路径管理逻辑。

二、CaptureRequest 的构造与参数绑定策略

CaptureRequest 是 Android Camera2 架构中拍照行为的核心指令体,它封装了所有控制相机行为的参数配置,包括对焦模式、曝光时间、白平衡设置等。在实际开发中,正确理解其构造逻辑、配置字段与状态切换策略,是构建稳定拍照流程的关键。


1. 曝光、对焦、白平衡等核心控制字段配置

CaptureRequest.Builder 提供了灵活的参数设置接口,开发者可以通过标准 Key 设置控制逻辑:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
builder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);

核心字段分类:

  • 自动控制类CONTROL_MODE, CONTROL_AF_MODE, CONTROL_AE_MODE, CONTROL_AWB_MODE

  • 手动控制类(当 CONTROL_MODE = OFF 时生效):

    • 曝光时间:SENSOR_EXPOSURE_TIME
    • ISO 灵敏度:SENSOR_SENSITIVITY
    • 对焦距离:LENS_FOCUS_DISTANCE
  • 特效与处理类:如 EDGE_MODE, NOISE_REDUCTION_MODE, COLOR_CORRECTION_MODE

这些参数可组合设置,形成复杂但可控的拍摄行为。需要特别注意参数之间的依赖关系(如 CONTROL_MODE = OFF 时 AE/AF/AWB 会被忽略)。


2. Tag、Template 类型的作用与使用技巧
  • Template 类型:构建 Builder 时必须指定模板,如:
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);

系统预设了 5 种模板,对应不同拍摄场景:

模板 用途
TEMPLATE_PREVIEW 实时预览
TEMPLATE_STILL_CAPTURE 静态拍照
TEMPLATE_RECORD 视频录制
TEMPLATE_VIDEO_SNAPSHOT 视频中抓拍
TEMPLATE_MANUAL 全手动控制

模板决定了初始参数的默认配置,建议开发者在其基础上进行增量修改,避免配置不完整导致的 HAL 拒绝。

  • Tag:用于标记请求,在回调中便于识别:
builder.setTag("capture-request-01");

CaptureCallback.onCaptureCompleted() 中可以获取对应请求:

request.getTag(); // 获取自定义 Tag

适用于业务标记、调试识别、状态跟踪等场景。


3. 实战构建流程:从 Builder 到 Request 的状态管理

典型拍照流程:

  1. 创建 Builder:
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
  1. 设置参数与 Surface:
builder.addTarget(imageReader

你可能感兴趣的:(影像技术全景图谱:架构,调优与实战,android,影像,Camera)