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 链路中的生成与传递路径,有助于快速定位参数校验失败或行为异常的问题。

TEMPLATE 参数生成与传递流程 应用层 createCaptureRequest(TEMPLATE_X) Camera Framework 填充默认 metadata HAL 厂商实现 construct_default_request_settings templateType 请求默认参数 参数校验 validateRequestSettings 返回默认 metadata 应用覆盖参数 set() 修改特定 Key 覆盖后的 Request 最终 CaptureRequest 提交至 CameraDevice HAL 处理 processCaptureRequest ⚠ 异常定位提示: 如果 HAL 返回的默认参数与应用预期不符,优先检查 HAL 的 construct_default_request_settings 实现; 如果应用覆盖参数后 HAL 行为异常,检查参数校验阶段是否拒绝了覆盖值。

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 内部不同的处理路径,主要体现在以下方面:

  1. ISP 管线配置: TEMPLATE_STILL_CAPTURE 通常启用更重的降噪和边缘增强算法,而 TEMPLATE_PREVIEW 优先保证帧率。
  2. 3A 收敛策略: TEMPLATE_VIDEO_RECORD 的 AE 算法会平滑亮度变化,避免录制中出现闪烁;TEMPLATE_STILL_CAPTURE 允许更激进的曝光调整。
  3. 帧率控制: TEMPLATE_VIDEO_RECORD 强制固定帧率(如 30fps),而 TEMPLATE_PREVIEW 允许在目标范围内动态调整。
  4. 功耗管理: 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],说明厂商对模板进行了定制,需要进一步确认是否符合预期。