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 模式要求更低。
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() 能快速清空管线。
4.3 ZSL(零快门延迟)测试
ZSL 技术通过持续缓存预览帧,在用户按下快门的瞬间直接输出已缓存的帧,从而消除曝光等待时间。CTS 的 CameraZSLTest 验证以下要点:
| 测试项 | 描述 | 通过标准 |
|---|---|---|
| ZSL 延迟 | 从按下快门到 JPEG 回调的总时间 | ≤ 100ms |
| 帧对齐精度 | 输出 JPEG 对应的 Sensor 时间戳与按下快门时间戳的差值 | ≤ 16ms |
| 缓存深度 | HAL 必须至少缓存 3 帧预览数据 | ≥ 3 帧 |
| AE/AWB 一致性 | 缓存帧的 AE/AWB 参数与当前场景的偏差 | 偏差 ≤ 5% |
ZSL 的核心挑战在于:缓存帧的曝光参数必须与按下快门时的场景匹配。如果 AE/AWB 变化过快,HAL 需要丢弃旧缓存并重新捕获。
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 变化刷新缓存。
android.control.aePreCaptureTrigger 的触发时机也需要同步优化,避免预捕获引入额外延迟。
4.5 拍照延迟流程与优化点 SVG 图
下图展示了从按下快门到 JPEG 回调的完整流程,并标注了各阶段的优化切入点:
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 模式导致曝光时间翻倍。