1. 课程导论:连拍场景定义、帧率稳定性指标、HAL层在连拍中的角色
1.1 连拍场景定义与典型特征
连拍(Burst Shot)是移动设备相机最核心的高负载场景之一。用户按下快门后,系统需要在极短时间内连续捕获多帧图像,并完成自动曝光(AE)、自动对焦(AF)、自动白平衡(AWB)的实时收敛。连拍场景对 Camera HAL(硬件抽象层)的帧率稳定性提出了极高要求。
| 特征维度 | 典型值 / 范围 | 对HAL的挑战 |
|---|---|---|
| 帧率目标 | 10 fps ~ 30 fps(取决于传感器和ISP能力) | 帧间隔抖动必须控制在 ±1 ms 以内 |
| 连拍持续时长 | 2 s ~ 10 s(连续捕获 20 ~ 300 帧) | 长时间高负载下不能出现帧率掉队 |
| 传感器输出 | RAW10 / RAW12,分辨率 12MP ~ 50MP | 带宽压力大,DMA传输易成为瓶颈 |
| ISP管线 | 多帧降噪 + HDR + 拜耳处理 | 管线深度增加导致帧延迟累积 |
| 内存/CPU负载 | 高(大量帧数据在内存中排队) | 内存带宽竞争导致帧丢失 |
关键认知: 连拍不是简单的“拍很多张照片”,而是 实时视频流 + 逐帧静态处理 的混合模式。HAL层必须在每一帧的VSync中断到来前完成上一帧的送出,否则帧率就会下降。
1.2 帧率稳定性核心指标
帧率稳定性不能只看平均帧率,必须用以下三个指标量化评估:
- 瞬时帧率(Instant FPS):相邻两帧时间戳差值的倒数。理想情况下,10 fps 连拍时每帧间隔应为 100.0 ms,允许抖动 ≤ 1.0 ms。
- 帧间隔标准差(Frame Interval StdDev):统计连拍期间所有帧间隔的标准差。标准差越小,帧率越稳定。优秀阈值:≤ 0.5 ms。
- 丢帧率(Frame Drop Rate):HAL层因超时或缓冲区满而丢弃的帧数占总请求帧数的比例。连拍场景要求丢帧率 ≤ 0.1%。
| 指标 | 计算公式 | 优秀阈值 | 可接受阈值 |
|---|---|---|---|
| 瞬时帧率 | FPSi = 1000 / (ti - ti-1) | 目标值 ± 1% | 目标值 ± 5% |
| 帧间隔标准差 | σ = √( Σ(Δti - μ)² / N ) | ≤ 0.5 ms | ≤ 2.0 ms |
| 丢帧率 | D = Ndrop / Nrequest × 100% | ≤ 0.1% | ≤ 1.0% |
实训提示: 在后续章节中,你将使用
adb shell dumpsys media.camera 和 Choreographer 帧回调来采集这些指标。请提前准备好 Pixel 6/7 或等效设备。
1.3 HAL层在连拍中的核心角色
Camera HAL层位于 Android 相机框架与硬件驱动之间,是连拍帧率稳定性的 第一道防线。HAL层在连拍场景中承担以下关键职责:
- 帧请求调度:将上层下发的 capture request 按 VSync 节奏分发给 sensor 驱动,确保帧间隔均匀。
- 缓冲区管理:维护
GraphicBuffer池,避免因 buffer 分配延迟导致帧阻塞。 - ISP管线控制:协调 ISP 各模块(BLC、AWB、Demosaic、NR)的处理时间,防止单帧处理超时。
- 帧时间戳生成:在 sensor 曝光结束时刻打上硬件时间戳,用于上层计算帧间隔。
- 丢帧检测与上报:当 sensor 或 ISP 无法按时完成时,HAL层必须主动丢弃帧并通知框架。
1.4 连拍帧率稳定性关键路径
从用户按下快门到第一帧显示,再到连续帧稳定输出,HAL层需要经过以下关键路径:
- Request 下发:Framework 调用
processCaptureRequest(),HAL将请求加入内部队列。 - Sensor 曝光:HAL通过 V4L2 或 MIPI CSI 接口配置 sensor 曝光时间、增益。
- RAW 数据读取:sensor 输出 RAW 数据,经 DMA 写入系统内存。
- ISP 处理:HAL驱动 ISP 管线完成黑电平校正、去马赛克、降噪、色调映射。
- Buffer 返回:处理完成的帧通过
processCaptureResult()回调返回给 Framework。
常见陷阱: 很多开发者只关注 ISP 处理时间,却忽略了 DMA 带宽竞争 和 Buffer 分配延迟。在连拍场景中,这两个因素往往是帧率抖动的首要原因。后续章节将专门讲解如何通过
perfetto 抓取 DMA 延迟。
1.5 本章小结与实训目标
| 知识点 | 掌握要求 | 实训关联 |
|---|---|---|
| 连拍场景定义 | 理解连拍与普通拍照/录像的区别 | 实训1:使用 Camera2 API 触发连拍 |
| 帧率稳定性指标 | 能计算瞬时帧率、标准差、丢帧率 | 实训2:编写帧间隔采集脚本 |
| HAL层角色 | 掌握 HAL 在帧调度、buffer管理、ISP控制中的职责 | 实训3:HAL dump 日志分析 |
| 关键路径 | 能画出 request → sensor → ISP → callback 的时序图 | 实训4:perfetto 抓取连拍trace |