4. HDR拍摄流程设计:从预览到捕获的完整Pipeline、AWB/AEC/AF策略调整
HDR(高动态范围)拍摄并非简单的多帧连拍,而是一套从预览阶段就开始介入的精密控制流程。本章将深入剖析Android相机HDR拍摄的完整Pipeline,重点讲解在预览、触发、捕获、融合四个阶段中,自动白平衡(AWB)、自动曝光(AEC)和自动对焦(AF)策略如何针对多帧融合进行特殊调整。
4.1 HDR拍摄完整Pipeline概览
一个典型的HDR拍摄流程包含以下四个核心阶段,每个阶段都涉及不同的算法模块与硬件交互:
- 预览阶段(Preview):实时分析场景动态范围,决定是否启用HDR模式,并初始化AWB/AEC/AF参数。
- 触发阶段(Trigger):用户按下快门后,系统锁定当前帧的3A参数,并快速决定曝光帧序列(如短、中、长曝光)。
- 捕获阶段(Capture):以Burst模式连续捕获多帧RAW图,每帧使用不同的曝光时间和ISO,同时保持AWB/AF锁定。
- 融合阶段(Fusion):对多帧RAW图进行对齐、去鬼影、色调映射,最终输出一张高动态范围的YUV或JPEG图像。
关键指标: 从触发到融合完成的端到端延迟通常需要控制在 500ms-800ms 以内,以保证用户体验。其中,Burst捕获帧间隔应小于 33ms(30fps),以避免场景内物体运动过大。
4.2 预览阶段的3A策略调整
在HDR模式下,预览阶段的3A算法不能按照常规单帧模式工作,必须为后续的多帧捕获预留控制余量。
4.2.1 AEC(自动曝光)策略
- 目标亮度偏移:常规AEC将Y目标锁定在18%灰(约100-120 lux),HDR模式下需将目标亮度下调至 12%-15%,避免过曝区域在长帧中完全饱和。
- 动态范围探测:通过直方图分析,计算场景的对比度(最亮区域与最暗区域的比值)。若对比度超过 1000:1,则触发HDR准备。
- 曝光帧决策:预览阶段即确定短帧(EV-2)、中帧(EV0)、长帧(EV+2)的曝光参数,并缓存至CaptureRequest中。
4.2.2 AWB(自动白平衡)策略
- 锁定机制:HDR模式下,AWB在预览阶段持续更新,但一旦用户触发快门,AWB参数立即锁定。所有Burst帧共享同一组AWB增益,避免融合后出现色偏。
- 色温平滑:在预览到触发的过渡期,AWB增益变化速率降低50%,防止最后一帧的色温突变。
4.2.3 AF(自动对焦)策略
- 对焦锁定:触发快门时,AF立即锁定当前对焦位置。Burst期间不进行任何重新对焦。
- 景深扩展:对于近距离拍摄,建议在预览阶段将焦点略微后移(约1个焦深单位),以平衡短帧与长帧的景深差异。
实战建议: 在预览阶段,可以通过
CaptureResult 中的 CONTROL_AE_STATE 和 CONTROL_AWB_STATE 状态机判断3A是否收敛。建议在3A状态达到 CONVERGED 后再允许用户触发HDR拍摄,否则容易产生曝光不稳定或色偏。
4.3 触发与捕获阶段的Pipeline控制
用户按下快门后,系统进入高速Burst捕获模式。以下是Android Camera2 API下的典型控制流程:
// 伪代码:HDR Burst捕获流程
// 1. 锁定3A参数
captureRequest.set(CaptureRequest.CONTROL_AE_LOCK, true);
captureRequest.set(CaptureRequest.CONTROL_AWB_LOCK, true);
captureRequest.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
// 2. 构建多帧序列(短、中、长曝光)
List<CaptureRequest> burstList = new ArrayList<>();
// 短帧:EV-2,ISO 100,曝光时间 1/2000s
CaptureRequest shortFrame = buildRequest(aeTarget - 2, 100, 1/2000f);
burstList.add(shortFrame);
// 中帧:EV0,ISO 200,曝光时间 1/500s
CaptureRequest midFrame = buildRequest(aeTarget, 200, 1/500f);
burstList.add(midFrame);
// 长帧:EV+2,ISO 400,曝光时间 1/125s
CaptureRequest longFrame = buildRequest(aeTarget + 2, 400, 1/125f);
burstList.add(longFrame);
// 3. 提交Burst捕获
cameraCaptureSession.captureBurst(burstList, hdrCaptureCallback, handler);
注意: 长帧的曝光时间不应超过 1/30s,否则手持拍摄时容易产生运动模糊,导致后续对齐算法失败。若场景照度极低,建议放弃长帧,改用多帧中帧降噪方案。
4.4 融合阶段的3A参数回传
融合完成后,需要将融合帧的3A统计信息回传给预览流,以维持预览与最终输出的一致性:
| 参数 | 融合前策略 | 融合后回传策略 |
|---|---|---|
| AWB增益 | 锁定在触发时刻 | 融合帧的色温统计更新预览AWB |
| AEC目标 | 预览阶段下调至12%灰 | 恢复至18%灰,避免预览过暗 |
| AF位置 | 触发时锁定 | 解锁AF,重新开始连续对焦 |
4.5 常见问题与避坑指南
案例1:融合后色温偏绿
原因:Burst帧中某一帧的AWB增益未锁定,导致短帧与长帧的色温不一致。
解决方案:在
原因:Burst帧中某一帧的AWB增益未锁定,导致短帧与长帧的色温不一致。
解决方案:在
captureBurst 前显式设置 CONTROL_AWB_LOCK = TRUE,并确认所有帧的 ColorCorrectionGains 相同。
案例2:长帧过曝导致鬼影
原因:AEC在预览阶段未下调目标亮度,长帧高光区域完全饱和。
解决方案:将预览AEC目标从18%灰下调至12%灰,并限制长帧曝光时间不超过1/30s。
原因:AEC在预览阶段未下调目标亮度,长帧高光区域完全饱和。
解决方案:将预览AEC目标从18%灰下调至12%灰,并限制长帧曝光时间不超过1/30s。
案例3:Burst帧间隔不稳定
原因:未使用
解决方案:始终使用
原因:未使用
captureBurst 而使用多次 capture 调用,导致帧间延迟增大。解决方案:始终使用
captureBurst 提交List,并确保Sensor输出帧率稳定在30fps以上。
4.6 本章小结
HDR拍摄流程的核心在于“预览分析-触发锁定-Burst捕获-融合回传”的闭环控制。AEC需要为多帧预留动态范围,AWB和AF必须在触发后严格锁定,Burst捕获必须使用高速稳定的帧序列。掌握这些策略调整,是构建高质量HDR相机应用的基础。