4. HDR拍摄流程设计:从预览到捕获的完整Pipeline、AWB/AEC/AF策略调整

HDR(高动态范围)拍摄并非简单的多帧连拍,而是一套从预览阶段就开始介入的精密控制流程。本章将深入剖析Android相机HDR拍摄的完整Pipeline,重点讲解在预览、触发、捕获、融合四个阶段中,自动白平衡(AWB)、自动曝光(AEC)和自动对焦(AF)策略如何针对多帧融合进行特殊调整。

4.1 HDR拍摄完整Pipeline概览

一个典型的HDR拍摄流程包含以下四个核心阶段,每个阶段都涉及不同的算法模块与硬件交互:

  1. 预览阶段(Preview):实时分析场景动态范围,决定是否启用HDR模式,并初始化AWB/AEC/AF参数。
  2. 触发阶段(Trigger):用户按下快门后,系统锁定当前帧的3A参数,并快速决定曝光帧序列(如短、中、长曝光)。
  3. 捕获阶段(Capture):以Burst模式连续捕获多帧RAW图,每帧使用不同的曝光时间和ISO,同时保持AWB/AF锁定。
  4. 融合阶段(Fusion):对多帧RAW图进行对齐、去鬼影、色调映射,最终输出一张高动态范围的YUV或JPEG图像。
关键指标: 从触发到融合完成的端到端延迟通常需要控制在 500ms-800ms 以内,以保证用户体验。其中,Burst捕获帧间隔应小于 33ms(30fps),以避免场景内物体运动过大。
HDR拍摄Pipeline流程图 预览分析 场景动态范围评估 触发锁定 3A参数冻结 Burst捕获 多帧RAW序列 多帧融合 对齐+色调映射 端到端延迟目标:500-800ms | Burst帧间隔:≤33ms AWB/AF在触发后锁定,AEC在Burst期间按预设序列切换

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,重新开始连续对焦
HDR 3A策略调整时序图 预览阶段 触发锁定 Burst捕获 融合回传 AEC:动态调整,目标12%灰 AEC:锁定 AEC:按预设序列切换 恢复 AWB:持续更新,速率平滑 AWB:锁定 AWB:锁定(所有帧共享) 更新 AF:连续对焦 AF:锁定 AF:锁定(不重新对焦) 解锁 关键原则:触发后AWB/AF立即锁定,AEC在Burst期间按预设EV序列切换,融合后恢复预览状态

4.5 常见问题与避坑指南

案例1:融合后色温偏绿
原因:Burst帧中某一帧的AWB增益未锁定,导致短帧与长帧的色温不一致。
解决方案:在 captureBurst 前显式设置 CONTROL_AWB_LOCK = TRUE,并确认所有帧的 ColorCorrectionGains 相同。
案例2:长帧过曝导致鬼影
原因:AEC在预览阶段未下调目标亮度,长帧高光区域完全饱和。
解决方案:将预览AEC目标从18%灰下调至12%灰,并限制长帧曝光时间不超过1/30s。
案例3:Burst帧间隔不稳定
原因:未使用 captureBurst 而使用多次 capture 调用,导致帧间延迟增大。
解决方案:始终使用 captureBurst 提交List,并确保Sensor输出帧率稳定在30fps以上。

4.6 本章小结

HDR拍摄流程的核心在于“预览分析-触发锁定-Burst捕获-融合回传”的闭环控制。AEC需要为多帧预留动态范围,AWB和AF必须在触发后严格锁定,Burst捕获必须使用高速稳定的帧序列。掌握这些策略调整,是构建高质量HDR相机应用的基础。