4. Request模板(Template)机制:TEMPLATE_PREVIEW、TEMPLATE_STILL_CAPTURE、TEMPLATE_VIDEO_RECORD等模板的默认参数
4.1 模板机制概述
Android Camera HAL3 框架提供了预定义的 Request 模板(Template),用于快速生成符合常见场景的 CaptureRequest。应用层通过 CameraDevice.createCaptureRequest(int templateType) 获取一个预填充了默认参数的 Request Builder,然后根据需求微调参数。模板机制的核心目的是:降低应用开发复杂度,确保 HAL 层在标准场景下获得合理且一致的参数输入。
关键理解: 模板不是硬编码的固定值,而是 HAL 厂商在
camera_metadata_t 中声明的默认参数集合。应用可以覆盖任意参数,但模板提供了“安全起点”。
4.2 标准模板类型与用途
| 模板类型 | 整型常量 | 典型应用场景 | 核心特征 |
|---|---|---|---|
TEMPLATE_PREVIEW |
1 | 取景器预览、视频通话预览 | 低延迟、持续帧率、自动对焦连续 |
TEMPLATE_STILL_CAPTURE |
2 | 拍照、高分辨率单帧采集 | 最高画质、慢速快门、3A稳定后触发 |
TEMPLATE_VIDEO_RECORD |
3 | 视频录制、慢动作 | 稳定帧率、功耗优化、连续自动对焦 |
TEMPLATE_VIDEO_SNAPSHOT |
4 | 视频录制中拍照 | 兼顾视频帧率与拍照画质 |
TEMPLATE_ZERO_SHUTTER_LAG |
5 | 零快门延迟拍照 | 环形缓冲区、持续流、低延迟捕获 |
TEMPLATE_MANUAL |
6 | 专业模式、第三方相机 | 所有参数由应用完全控制,模板仅提供基础默认值 |
4.3 核心模板的默认参数对比
以下表格列出三个最常用模板在关键参数上的默认值差异。这些参数直接影响 HAL 链路的 3A 策略、帧率控制和图像质量。
| 参数 Key | TEMPLATE_PREVIEW | TEMPLATE_STILL_CAPTURE | TEMPLATE_VIDEO_RECORD |
|---|---|---|---|
CONTROL_AE_MODE |
ON | ON | ON |
CONTROL_AE_LOCK |
FALSE | FALSE | FALSE |
CONTROL_AE_TARGET_FPS_RANGE |
[15, 30] | [15, 30] | [30, 30] 或设备支持的最高稳定帧率 |
CONTROL_AE_ANTIBANDING_MODE |
AUTO | AUTO | AUTO |
CONTROL_AWB_MODE |
AUTO | AUTO | AUTO |
CONTROL_AF_MODE |
CONTINUOUS_PICTURE | CONTINUOUS_PICTURE | CONTINUOUS_VIDEO |
CONTROL_AF_TRIGGER |
IDLE | IDLE | IDLE |
CONTROL_AE_PRECAPTURE_TRIGGER |
IDLE | IDLE | IDLE |
CONTROL_CAPTURE_INTENT |
PREVIEW | STILL_CAPTURE | VIDEO_RECORD |
STATISTICS_FACE_DETECT_MODE |
OFF | OFF | OFF |
JPEG_QUALITY |
85 | 95 | 85 |
JPEG_THUMBNAIL_SIZE |
[0, 0] | 设备支持的最大缩略图 | [0, 0] |
调试要点: 当 HAL 层收到
CONTROL_CAPTURE_INTENT 为 STILL_CAPTURE 时,通常会触发更长的 3A 收敛时间、更高的 ISP 处理精度和更积极的降噪策略。如果预览帧率异常,请检查 CONTROL_AE_TARGET_FPS_RANGE 是否被错误设置为固定高帧率。
4.4 模板参数生成流程
理解模板参数在 HAL3 链路中的生成与传递路径,有助于快速定位参数校验失败或行为异常的问题。
4.5 模板参数校验常见异常
- 参数超出范围: 应用覆盖的
SENSOR_SENSITIVITY(ISO)超出 HAL 声明的android.sensor.info.sensitivityRange,导致 Request 被拒绝。 - 模板与流配置不匹配: 使用
TEMPLATE_STILL_CAPTURE但输出流配置为YUV_420_888且分辨率超过 HAL 支持的最大尺寸,导致 processCaptureRequest 返回错误。 - 3A 冲突: 在
TEMPLATE_VIDEO_RECORD中强制设置CONTROL_AE_MODE = OFF且未提供合理的SENSOR_EXPOSURE_TIME,导致预览过曝或全黑。 - 帧率不一致:
CONTROL_AE_TARGET_FPS_RANGE设置为 [60, 60] 但传感器无法在目标分辨率下达到 60fps,HAL 可能降帧或返回错误。
调试建议: 在 HAL 的
construct_default_request_settings 中添加日志,输出每个模板返回的完整 metadata 内容。使用 dumpsys media.camera 可以查看当前会话的 Request 参数快照,对比模板默认值与实际提交值。
4.6 模板选择对 HAL 链路的影响
不同的模板会触发 HAL 内部不同的处理路径,主要体现在以下方面:
- ISP 管线配置:
TEMPLATE_STILL_CAPTURE通常启用更重的降噪和边缘增强算法,而TEMPLATE_PREVIEW优先保证帧率。 - 3A 收敛策略:
TEMPLATE_VIDEO_RECORD的 AE 算法会平滑亮度变化,避免录制中出现闪烁;TEMPLATE_STILL_CAPTURE允许更激进的曝光调整。 - 帧率控制:
TEMPLATE_VIDEO_RECORD强制固定帧率(如 30fps),而TEMPLATE_PREVIEW允许在目标范围内动态调整。 - 功耗管理:
TEMPLATE_PREVIEW和TEMPLATE_VIDEO_RECORD会限制传感器和 ISP 的时钟频率以降低功耗。
4.7 实战:验证模板默认参数
以下代码片段演示如何在应用层获取并打印 TEMPLATE_PREVIEW 的默认参数,用于调试对比:
// 获取 TEMPLATE_PREVIEW 的默认 Request
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW);
// 获取当前 Builder 中的所有参数
CaptureRequest request = builder.build();
for (CaptureRequest.Key<?> key : request.getKeys()) {
Object value = request.get(key);
if (value != null) {
Log.d("TemplateDebug", "Key: " + key.getName() + " = " + value.toString());
}
}
// 特别关注 3A 相关参数
Range<Integer> fpsRange = request.get(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE);
Log.d("TemplateDebug", "FPS Range: " + fpsRange.toString());
Integer captureIntent = request.get(CaptureRequest.CONTROL_CAPTURE_INTENT);
Log.d("TemplateDebug", "Capture Intent: " + captureIntent);
输出示例: 在 Pixel 设备上,
TEMPLATE_PREVIEW 的 CONTROL_AE_TARGET_FPS_RANGE 通常为 [15, 30],CONTROL_CAPTURE_INTENT 为 1(PREVIEW)。如果 HAL 返回了 [30, 30] 或 [10, 30],说明厂商对模板进行了定制,需要进一步确认是否符合预期。