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创建到请求提交的完整流程,以及各阶段的关键操作:
4.5 常见配置错误与避坑指南
错误1: 在预览请求中设置了
后果: 传感器进入拍照模式,预览帧率急剧下降,甚至出现卡顿。
修正: 预览请求应保持
CONTROL_CAPTURE_INTENT为CAPTURE_INTENT_STILL_CAPTURE。后果: 传感器进入拍照模式,预览帧率急剧下降,甚至出现卡顿。
修正: 预览请求应保持
CAPTURE_INTENT_PREVIEW(模板已自动设置)。
错误2: 多次调用
后果: 虽然不会崩溃,但会导致底层重复写入,浪费带宽。
修正: 确保每个Surface只添加一次,或在添加前检查集合。
addTarget()添加同一个Surface。后果: 虽然不会崩溃,但会导致底层重复写入,浪费带宽。
修正: 确保每个Surface只添加一次,或在添加前检查集合。
错误3: 在Builder上设置与模板冲突的参数(如手动ISO+AE ON)。
后果: 参数覆盖顺序可能导致AE失效或手动值被忽略。
修正: 手动模式应使用
后果: 参数覆盖顺序可能导致AE失效或手动值被忽略。
修正: 手动模式应使用
TEMPLATE_MANUAL或显式关闭AE。
4.6 参数优先级与覆盖规则
当Builder上设置的参数与模板预置参数冲突时,遵循以下优先级规则:
- 显式设置的参数(通过
set()方法)优先级最高,会覆盖模板默认值。 - 模板预置参数作为基础配置,仅在开发者未显式设置时生效。
- 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图
以下决策树帮助开发者在不同场景下快速选择正确的参数配置:
4.8 性能优化建议
- 减少参数设置次数: 在Builder上一次性设置所有参数,避免多次调用
set()造成内部状态切换开销。 - 复用请求对象: 对于重复性预览(如setRepeatingRequest),构建一次
CaptureRequest后持续使用,无需每帧重建。 - 避免不必要的参数: 只设置与当前预览相关的参数。例如,如果不需要手动控制曝光,就不要设置
SENSOR_EXPOSURE_TIME,让AE自动处理。 - 使用FAST模式: 对于
EDGE_MODE、NOISE_REDUCTION_MODE、TONEMAP_MODE等处理管线参数,优先选择FAST模式以降低延迟。
总结:
CaptureRequest.Builder的配置是预览数据通路的起点。正确的模板选择、精准的参数设置以及合理的Surface绑定,能够确保预览帧以最低延迟、最优画质从传感器流向应用层。下一章将深入探讨Surface绑定后的缓冲区管理机制。