关键词:CaptureRequest、CameraCaptureSession、RequestQueue、RepeatingRequest、Burst、帧控制、拍照调度、拍照流、Camera2
摘要:
在 Android Camera2 架构中,CaptureRequest
是拍照与图像控制的核心载体。其调度过程从开发者提交请求,到 HAL 层实际执行,再到回传图像与 Metadata 的全链路流程,构成了 Android 拍照系统的底层执行基础。本篇文章将以工程实战为导向,深入剖析 CaptureRequest
的调度路径、请求队列机制、帧控制策略与拍照流程优化方法,帮助开发者理解拍照任务的生命周期管理与性能调优关键点,适配多 UseCase 与平台差异的实战需求。
请求发起全流程概览:从 setRepeatingRequest 到帧开始传输
CaptureRequest 的构造与参数绑定策略
请求队列机制详解:RequestQueue 的内部结构与执行顺序
capture()
vs setRepeatingRequest()
的队列影响拍照流程中 Repeating Request 的插队逻辑
stopRepeating()
的使用时机与线程同步建议Burst 拍照支持与多请求同步调度机制
captureBurst()
提交多帧请求的条件限制Request 状态反馈机制:从提交到 onCaptureCompleted 的映射链
请求调度中的性能优化路径与错误排查技巧
多平台行为差异与兼容性适配策略
在 Android Camera2 架构中,所有拍照行为的本质都是通过 CaptureRequest
对相机硬件发出控制指令。这一请求从应用层构建,通过 CameraCaptureSession
提交,最终经由 HAL 被下发到 ISP 和 Sensor,完成图像采集与传输。理解从 setRepeatingRequest()
到第一帧输出之间的执行链路,是进行多 UseCase 管理与拍照性能调优的基础。
Camera2 架构下,CameraDevice
代表的是相机设备本身,它负责连接 HAL 层与上层的 API 接口。而 CameraCaptureSession
则是围绕某一组 Surface
所建立的图像采集会话,它将多个 CaptureRequest
编排到一个连续的流中,控制图像如何输出到 Preview、ImageReader 或 MediaRecorder 等目标。
创建流程简要回顾:
cameraDevice.createCaptureSession(
Arrays.asList(previewSurface, imageReaderSurface),
new StateCallback() {
... },
handler);
会话建立成功后,所有图像请求必须通过该 Session 的 capture()
或 setRepeatingRequest()
提交,才能进入底层传输流程。
setRepeatingRequest()
:用于持续输出图像流,常用于 Preview、实时分析等场景。底层会生成一个持久请求链(Request Queue 中的 repeating slot),直到明确调用 stopRepeating()
清除。capture()
:执行一次性请求,常用于拍照、自动对焦锁定、曝光测量等一次性动作。会在当前请求队列中插入一帧或多帧的请求,执行完毕后自动清除。系统内部将两类请求分别管理,在调度层(例如 Camera3Device
)中将 repeating
与 non-repeating
分离处理,并确保一次性请求可以插队执行,再在合适时间点恢复 repeatingRequest
。
Android 设备通常支持至少两路并发输出流,Preview 是最典型的连续输出 UseCase,而 Capture(ImageCapture)是触发式输出:
setRepeatingRequest()
长时间输出capture()
中断或共享输出流资源调度流程:
CaptureRequest
,加入 JPEG 输出 Surface,调用 capture()
。repeatingRequest
暂停,将新的 CaptureRequest
插入队列。这种行为在 Camera3OutputStreamInterface
层被精准调度,确保前后台切换、快门响应与帧数据输出同步进行。
通过以上流程的理解,开发者可以掌握在不同场景中如何精确控制请求顺序、保持图像流稳定,并针对平台兼容性设计更加稳健的拍照路径管理逻辑。
CaptureRequest
是 Android Camera2 架构中拍照行为的核心指令体,它封装了所有控制相机行为的参数配置,包括对焦模式、曝光时间、白平衡设置等。在实际开发中,正确理解其构造逻辑、配置字段与状态切换策略,是构建稳定拍照流程的关键。
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
SENSOR_SENSITIVITY
LENS_FOCUS_DISTANCE
特效与处理类:如 EDGE_MODE
, NOISE_REDUCTION_MODE
, COLOR_CORRECTION_MODE
这些参数可组合设置,形成复杂但可控的拍摄行为。需要特别注意参数之间的依赖关系(如 CONTROL_MODE = OFF
时 AE/AF/AWB 会被忽略)。
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
系统预设了 5 种模板,对应不同拍摄场景:
模板 | 用途 |
---|---|
TEMPLATE_PREVIEW |
实时预览 |
TEMPLATE_STILL_CAPTURE |
静态拍照 |
TEMPLATE_RECORD |
视频录制 |
TEMPLATE_VIDEO_SNAPSHOT |
视频中抓拍 |
TEMPLATE_MANUAL |
全手动控制 |
模板决定了初始参数的默认配置,建议开发者在其基础上进行增量修改,避免配置不完整导致的 HAL 拒绝。
builder.setTag("capture-request-01");
在 CaptureCallback.onCaptureCompleted()
中可以获取对应请求:
request.getTag(); // 获取自定义 Tag
适用于业务标记、调试识别、状态跟踪等场景。
典型拍照流程:
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
builder.addTarget(imageReader