4. 拍照Capture延迟测试:从按下快门到JPEG回调的延迟分析、连拍性能测试、ZSL(零快门延迟)测试

拍照延迟是衡量相机用户体验的核心指标之一。CTS 中的 CameraTest 模块通过精确的时间戳测量,将“按下快门”到“JPEG 回调”之间的延迟拆解为多个子阶段。本章深入分析 Capture 延迟的构成、连拍性能的评估方法以及 ZSL(零快门延迟)的测试原理,并给出对应的 HAL 优化方向。

4.1 拍照延迟的构成与测量

一次完整的拍照流程从应用层调用 takePicture() 开始,到 JPEG 数据通过 ImageReader.OnImageAvailableListener 回调返回结束。CTS 使用 CameraTimestamp 和 CaptureResult 中的时间戳字段,将延迟分解为以下关键阶段:

阶段 起始事件 结束事件 典型延迟范围
T1: 应用层调度 takePicture() 调用 capture() 请求入队 0.5 – 2 ms
T2: HAL 预处理 capture() 请求到达 HAL Sensor 开始曝光 1 – 5 ms
T3: 曝光 + 读出 Sensor 曝光开始 RAW 数据读出完成 16 – 33 ms (取决于帧率)
T4: ISP 处理 RAW 数据进入 ISP YUV 输出完成 8 – 20 ms
T5: JPEG 编码 YUV 进入 JPEG Encoder JPEG 数据写入内存 10 – 30 ms
T6: 回调传递 JPEG 数据就绪 onImageAvailable 回调 0.5 – 2 ms

总延迟 = T1 + T2 + T3 + T4 + T5 + T6。CTS 要求总延迟通常不超过 200ms(标准模式),ZSL 模式要求更低。

关键指标: CTS 测试中,android.statistics.lensShadingMap 和 android.sensor.timestamp 用于校准各阶段时间戳。如果 T3 或 T4 超出预期,HAL 需要优先优化 Sensor 驱动和 ISP 管线。

4.2 连拍性能测试

连拍(Burst Capture)测试评估相机在连续拍照场景下的吞吐量和稳定性。CTS 通过 CameraBurstTest 用例,以固定间隔发送 capture 请求,并测量以下指标:

  • Burst FPS: 连续 30 帧的平均帧率,要求 ≥ 10fps(13MP 以上)或 ≥ 15fps(8MP 以下)。
  • 帧间隔抖动: 相邻两帧完成时间差的方差,要求 ≤ 5ms。
  • 丢帧率: 请求发出后未收到回调的帧数占比,要求 ≤ 1%。
  • 温度稳定性: 连拍 100 帧后,延迟增加不超过初始值的 20%。

连拍性能的瓶颈通常出现在 ISP 带宽和 JPEG 编码器吞吐量上。HAL 需要确保 process_capture_request 在连拍模式下不阻塞,且 flush() 能快速清空管线。

优化建议: 在 HAL 中为连拍场景预留独立的 ISP 管线实例,避免与预览流争抢带宽。同时,将 JPEG 编码卸载到硬件编码器,并启用编码队列的流水线模式。

4.3 ZSL(零快门延迟)测试

ZSL 技术通过持续缓存预览帧,在用户按下快门的瞬间直接输出已缓存的帧,从而消除曝光等待时间。CTS 的 CameraZSLTest 验证以下要点:

测试项 描述 通过标准
ZSL 延迟 从按下快门到 JPEG 回调的总时间 ≤ 100ms
帧对齐精度 输出 JPEG 对应的 Sensor 时间戳与按下快门时间戳的差值 ≤ 16ms
缓存深度 HAL 必须至少缓存 3 帧预览数据 ≥ 3 帧
AE/AWB 一致性 缓存帧的 AE/AWB 参数与当前场景的偏差 偏差 ≤ 5%

ZSL 的核心挑战在于:缓存帧的曝光参数必须与按下快门时的场景匹配。如果 AE/AWB 变化过快,HAL 需要丢弃旧缓存并重新捕获。

常见失败原因: HAL 在 ZSL 模式下未正确设置 android.control.enableZsl 为 true,或者缓存队列未使用 dequeueBuffer/queueBuffer 机制管理,导致 CTS 检测到帧时间戳不连续。

4.4 拍照延迟的 HAL 优化方向

针对上述测试项,HAL 层可以从以下方向进行优化:

  • 减少 T2 预处理延迟: 在 HAL 初始化阶段预分配 capture request 的 metadata 缓冲区,避免运行时动态分配。
  • 降低 T3 曝光读出时间: 使用 Sensor 的 HDR 或 binning 模式,在保证画质的前提下缩短曝光时间。
  • 加速 T4 ISP 处理: 启用 ISP 的硬件加速管线,并将 3A 统计计算与 ISP 处理并行化。
  • 优化 T5 JPEG 编码: 使用固定质量因子(如 95%)的硬件编码器,并启用编码器的多 slice 模式。
  • 连拍专用路径: 在 HAL 中为连拍创建独立的 request 队列,避免与预览请求互相阻塞。
  • ZSL 缓存管理: 实现环形缓冲区管理预览帧,并定期根据 AE/AWB 变化刷新缓存。
性能基线: 优化后,标准拍照延迟应 ≤ 150ms,ZSL 延迟 ≤ 80ms,连拍帧率 ≥ 15fps(13MP)。CTS 测试中,android.control.aePreCaptureTrigger 的触发时机也需要同步优化,避免预捕获引入额外延迟。

4.5 拍照延迟流程与优化点 SVG 图

下图展示了从按下快门到 JPEG 回调的完整流程,并标注了各阶段的优化切入点:

拍照延迟流程与优化点 拍照延迟流程与 HAL 优化点 T1: 应用调度 T2: HAL 预处理 T3: 曝光+读出 T4: ISP 处理 T5: JPEG 编码 优化点 1 预分配 metadata 缓冲区 减少动态分配延迟 优化点 2 使用 binning 模式 缩短曝光时间 优化点 3 ISP 硬件加速管线 3A 统计并行化 优化点 4 硬件 JPEG 编码器 多 slice 模式 连拍与 ZSL 特殊优化 连拍:独立 ISP 管线 + 编码队列流水线模式 ZSL:环形缓存管理 + AE/AWB 变化刷新策略 总延迟 = T1 + T2 + T3 + T4 + T5 + T6 | 目标:标准 ≤ 150ms,ZSL ≤ 80ms

4.6 测试用例与 HAL 配置对照表

下表列出 CTS 中与拍照延迟相关的核心测试用例,以及 HAL 需要对应的配置项:

CTS 测试用例 测试内容 HAL 关键配置
CameraCaptureLatencyTest 单帧拍照总延迟 android.control.aePreCaptureTrigger 设为 IDLE
CameraBurstTest 连拍帧率与稳定性 android.control.requestCount ≥ 30
CameraZSLTest ZSL 延迟与帧对齐 android.control.enableZsl = true
CameraTimestampTest 时间戳一致性 android.sensor.timestamp 与 SHUTTER 事件对齐
调试技巧: 使用 adb shell dumpsys media.camera 查看 HAL 的 capture 请求队列深度和延迟分布。如果 T3 阶段异常,检查 Sensor 驱动是否开启了 HDR 模式导致曝光时间翻倍。