4. 预览请求构建:CaptureRequest.Builder的配置,模板选择与参数设置

在Android相机预览流程中,CaptureRequest是连接应用层与相机HAL层的核心指令载体。每一个预览帧的采集、处理与输出,都依赖于一个正确配置的CaptureRequest。本章将深入剖析CaptureRequest.Builder的构建过程、模板选择策略以及关键参数的设置方法,帮助开发者精准控制预览数据通路。

4.1 CaptureRequest.Builder的创建与生命周期

CaptureRequest.Builder由CameraDevice.createCaptureRequest(int templateType)方法创建。该方法返回一个预填充了指定模板参数的Builder实例,开发者随后可在此基础上修改或添加参数。

关键约束: 一个Builder实例只能用于构建一个CaptureRequest。构建完成后,应调用build()方法生成不可变的请求对象。Builder本身不可复用,每次创建新请求都需要重新获取Builder。
// 典型构建流程
CameraDevice cameraDevice = ...;
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

// 添加目标Surface(预览Surface + 拍照Surface等)
builder.addTarget(previewSurface);
builder.addTarget(imageReaderSurface);

// 设置参数
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

// 构建不可变请求
CaptureRequest request = builder.build();

4.2 模板选择:五种预设模板的适用场景

Android相机框架提供了五种标准模板,每种模板预置了不同的参数组合,以适应不同的使用场景。选择正确的模板可以减少大量手动参数配置工作,并确保底层HAL处于正确的运行模式。

模板类型 常量值 适用场景 关键预置参数倾向
TEMPLATE_PREVIEW 1 标准预览、取景器显示 自动曝光(AE)开启、自动白平衡(AWB)开启、帧率优先于画质
TEMPLATE_STILL_CAPTURE 2 高分辨率拍照、静态图像捕获 画质优先、可能降低帧率、启用降噪、启用锐化
TEMPLATE_RECORD 3 视频录制、持续高帧率输出 帧率稳定优先、AE锁定倾向、减少跳帧
TEMPLATE_VIDEO_SNAPSHOT 4 视频录制过程中拍照 平衡录制帧率与拍照画质、AE/AWB可能短暂锁定
TEMPLATE_ZERO_SHUTTER_LAG 5 零快门延迟拍照、高速连拍 环形缓冲区模式、持续流式输出、最小化快门时滞
最佳实践: 对于普通预览场景,始终使用TEMPLATE_PREVIEW。如果预览同时需要高帧率(如60fps),可考虑TEMPLATE_RECORD,但需注意其AE策略可能不同。切勿在预览中使用TEMPLATE_STILL_CAPTURE,否则会导致帧率骤降。

4.3 关键参数设置:控制预览数据通路

在预览请求中,以下参数直接影响数据通路的效率与输出质量。开发者需要根据具体需求进行精细调整。

4.3.1 目标Surface绑定(addTarget)

addTarget(Surface)方法将输出Surface绑定到请求上。每个请求可以绑定多个Surface,但必须满足以下约束:

  • 所有绑定的Surface必须来自同一个CameraDevice的会话(Session)。
  • Surface的尺寸必须与配置的OutputConfiguration一致。
  • 对于预览,通常绑定SurfaceView或TextureView的Surface;对于图像分析,绑定ImageReader的Surface。

4.3.2 3A参数(AE/AWB/AF)

自动曝光(AE)、自动白平衡(AWB)和自动对焦(AF)是预览画质的基础。模板已提供默认值,但开发者可根据场景覆盖:

// 强制锁定AE(适用于固定光照场景)
builder.set(CaptureRequest.CONTROL_AE_LOCK, true);

// 设置AE补偿(曝光补偿,范围由CameraCharacteristics控制)
builder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

// 选择AF模式
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);

// 手动设置AWB模式
builder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT);

4.3.3 帧率控制(FPS Range)

预览帧率通过CONTROL_AE_TARGET_FPS_RANGE控制。该参数是一个Range<Integer>,表示最小和最大帧率。

// 设置30fps固定帧率
builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<>(30, 30));

// 设置可变帧率(15~30fps),允许在光照不足时降帧
builder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<>(15, 30));
注意: 帧率设置受限于传感器能力、分辨率以及当前光照条件。设置过高的帧率可能导致AE不稳定或画面过暗。建议通过CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES查询设备支持的帧率范围。

4.3.4 传感器与处理管线控制

以下参数控制底层传感器输出与ISP处理:

参数Key 作用 预览场景推荐值
SENSOR_SENSITIVITY ISO感光度(手动模式) 不设置(使用AE自动)
SENSOR_EXPOSURE_TIME 曝光时间(纳秒) 不设置(使用AE自动)
EDGE_MODE 边缘增强/锐化 EDGE_MODE_FAST(低延迟)
NOISE_REDUCTION_MODE 降噪强度 NOISE_REDUCTION_MODE_FAST(低延迟)
TONEMAP_MODE 色调映射曲线 TONEMAP_MODE_FAST(低延迟)

4.4 预览请求构建流程SVG图

下图展示了从Builder创建到请求提交的完整流程,以及各阶段的关键操作:

预览请求构建与提交流程 预览请求构建与提交流程 CameraDevice createCaptureRequest(TEMPLATE_PREVIEW) Builder配置阶段 • addTarget(Surface) — 绑定输出Surface • set(CONTROL_AE_MODE, ...) — 设置3A参数 • set(CONTROL_AE_TARGET_FPS_RANGE, ...) — 帧率控制 build() → CaptureRequest CaptureSession.setRepeatingRequest(request) 说明:Builder不可复用,每次新请求需重新调用createCaptureRequest获取新Builder实例

4.5 常见配置错误与避坑指南

错误1: 在预览请求中设置了CONTROL_CAPTURE_INTENT为CAPTURE_INTENT_STILL_CAPTURE。
后果: 传感器进入拍照模式,预览帧率急剧下降,甚至出现卡顿。
修正: 预览请求应保持CAPTURE_INTENT_PREVIEW(模板已自动设置)。
错误2: 多次调用addTarget()添加同一个Surface。
后果: 虽然不会崩溃,但会导致底层重复写入,浪费带宽。
修正: 确保每个Surface只添加一次,或在添加前检查集合。
错误3: 在Builder上设置与模板冲突的参数(如手动ISO+AE ON)。
后果: 参数覆盖顺序可能导致AE失效或手动值被忽略。
修正: 手动模式应使用TEMPLATE_MANUAL或显式关闭AE。

4.6 参数优先级与覆盖规则

当Builder上设置的参数与模板预置参数冲突时,遵循以下优先级规则:

  1. 显式设置的参数(通过set()方法)优先级最高,会覆盖模板默认值。
  2. 模板预置参数作为基础配置,仅在开发者未显式设置时生效。
  3. HAL层最终决定权:部分参数(如AE状态)可能被HAL根据传感器能力调整,应用层设置仅作为建议。
// 示例:覆盖模板的AE模式
// TEMPLATE_PREVIEW默认AE为CONTROL_AE_MODE_ON
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
// 此时AE被强制关闭,需要手动设置曝光时间和ISO
builder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 10000000L); // 10ms
builder.set(CaptureRequest.SENSOR_SENSITIVITY, 400); // ISO 400

4.7 预览请求参数设置决策树SVG图

以下决策树帮助开发者在不同场景下快速选择正确的参数配置:

预览请求参数设置决策树 预览请求参数设置决策树 开始构建预览请求 是否标准预览(30fps以内)? 是 否 标准预览配置 • 模板:TEMPLATE_PREVIEW • FPS:30(或自动范围) • 3A:全部自动 高帧率/视频预览配置 • 模板:TEMPLATE_RECORD • FPS:60(需设备支持) • AE锁定倾向 是否需要图像分析Surface? 是 否 添加ImageReader Surface • addTarget(imageReaderSurface) • 注意格式与尺寸匹配 仅预览Surface • addTarget(previewSurface) • 无需额外配置

4.8 性能优化建议

  • 减少参数设置次数: 在Builder上一次性设置所有参数,避免多次调用set()造成内部状态切换开销。
  • 复用请求对象: 对于重复性预览(如setRepeatingRequest),构建一次CaptureRequest后持续使用,无需每帧重建。
  • 避免不必要的参数: 只设置与当前预览相关的参数。例如,如果不需要手动控制曝光,就不要设置SENSOR_EXPOSURE_TIME,让AE自动处理。
  • 使用FAST模式: 对于EDGE_MODE、NOISE_REDUCTION_MODE、TONEMAP_MODE等处理管线参数,优先选择FAST模式以降低延迟。
总结: CaptureRequest.Builder的配置是预览数据通路的起点。正确的模板选择、精准的参数设置以及合理的Surface绑定,能够确保预览帧以最低延迟、最优画质从传感器流向应用层。下一章将深入探讨Surface绑定后的缓冲区管理机制。