6、Camera Metadata与3A:曝光、增益、白平衡控制、AE/AF/AWB策略、多Camera同步

各位做Camera的朋友,咱们今天聊聊3A。说实话,3A是Camera HAL里最磨人的模块之一。你想想看,曝光、增益、白平衡,这三个东西互相耦合,牵一发动全身。我早年做手机Camera时,就被AE和AWB打架的问题坑过——画面刚稳定,白平衡一变,亮度又跳了,来回震荡,用户拍出来的照片忽明忽暗。

嗯,咱们今天就把这块彻底讲透。从Metadata怎么传递控制参数,到AE/AF/AWB各自的策略,再到多Camera同步的坑,一个一个来。

6.1 Camera Metadata:控制3A的“信使”

先说Metadata。在Android Camera框架里,Metadata就是HAL和Framework之间的通信协议。说白了,Framework下发请求,HAL上报结果,全靠Metadata这个结构体来传。

我个人习惯把Metadata分成两类:

  • 控制型Metadata:Framework发给HAL的,比如“我要曝光时间30ms,增益2x”。
  • 结果型Metadata:HAL上报给Framework的,比如“实际曝光时间29.8ms,当前AWB色温4500K”。

对于3A控制,最核心的几个Key如下:

Metadata Key 类型 说明
ANDROID_SENSOR_EXPOSURE_TIME 控制 曝光时间,单位纳秒
ANDROID_SENSOR_SENSITIVITY 控制 ISO增益
ANDROID_CONTROL_AE_MODE 控制 AE模式:ON/OFF/AE_SCENE_MODE等
ANDROID_CONTROL_AWB_MODE 控制 AWB模式:AUTO/DAYLIGHT/FLUORESCENT等
ANDROID_CONTROL_AF_MODE 控制 AF模式:AUTO/MACRO/CONTINUOUS_PICTURE等
ANDROID_CONTROL_AE_REGIONS 控制 测光区域,用于指定画面中哪些区域参与AE计算
ANDROID_CONTROL_AE_STATE 结果 AE状态:INACTIVE/SEARCHING/CONVERGED/LOCKED等

这里有个坑,我提醒一下:曝光时间和增益不是独立设置的。你设了曝光时间100ms,增益4x,但Sensor可能不支持这个组合。HAL内部要做归一化处理,把不支持的组合映射到最近的可用档位。我曾经在项目里遇到一个问题:上层设了30fps,曝光时间却给了50ms,结果帧率根本跑不到30fps,画面卡顿。后来我加了一段校验逻辑,曝光时间不能超过帧周期的80%,问题就解决了。

核心原则:Metadata是HAL的“输入”,也是“输出”。Framework下发控制参数,HAL上报实际执行结果。两者必须一致,否则上层算法会混乱。

6.2 AE策略:曝光与增益的博弈

AE(自动曝光)的目标很简单:让画面亮度适中。但实现起来,却是一场曝光时间和增益之间的博弈。

为什么?因为曝光时间长了,运动物体会模糊;增益高了,噪点会爆炸。所以AE算法要在这两者之间找平衡。

我常用的AE策略分三步:

  1. 粗调:先调曝光时间,从短到长,直到画面亮度接近目标。
  2. 细调:曝光时间到位后,再用增益微调,把亮度误差控制在±0.3EV以内。
  3. 防抖:如果曝光时间超过安全阈值(比如1/30s),就要考虑数字防抖或降低帧率。

这里有个典型的AE收敛曲线,我画了个图:

AE收敛过程示意图 目标 0 帧数 N 目标亮度 粗调阶段 过冲 收敛 实际亮度

你看这个曲线,刚开始亮度很低,AE快速增加曝光时间,亮度迅速上升。但到了目标附近,容易过冲——这就是我前面说的,曝光时间和增益切换时,算法反应慢了半拍。我一般会在HAL里加一个阻尼系数,让调整幅度逐渐减小,避免震荡。

避坑指南:我曾经在车载项目里遇到一个场景——车辆从隧道出来,亮度瞬间从10lux跳到10000lux。AE如果反应太快,画面会闪烁;反应太慢,司机看不清路。我的做法是:检测到亮度突变时,先快速跳到估算值附近,再慢慢微调。这样既快又稳。

6.3 AF策略:对焦的“快准稳”

AF(自动对焦)在车载场景下特别重要。你想,ADAS系统要识别前方车辆、行人、交通标志,对焦不准,识别率直接崩。

AF的三种主流模式:

  • 反差对焦(CDAF):通过图像对比度判断是否合焦。优点是精度高,缺点是慢,需要来回扫。
  • 相位对焦(PDAF):通过专用像素检测相位差。速度快,但精度受限于像素数量。
  • 激光/ToF辅助对焦:直接测距,一步到位。但受限于测距范围。

在车载Camera里,我推荐用混合对焦:先用PDAF快速跳到大致位置,再用CDAF微调。这样既快又准。

AF策略的核心是对焦窗口。你不能对整个画面做AF,那样计算量太大,而且容易对到背景上。我一般把画面分成9x9的网格,让上层指定一个或多个ROI(感兴趣区域)。比如,ADAS系统会告诉HAL:“我对焦在画面中央的车辆上”,HAL就只在这个ROI内计算对比度。

关键参数:AF的收敛时间一般要求<100ms,否则用户会感觉“拉风箱”。在车载场景下,这个要求更严格——如果车辆高速行驶,对焦跟不上,画面就糊了。

6.4 AWB策略:白平衡的“色温追踪”

AWB(自动白平衡)是3A里最“玄学”的部分。为什么?因为色温是主观感受。同一个场景,有人觉得偏暖,有人觉得偏冷。

但从技术角度看,AWB的核心是色温估计。算法通过分析画面中的“灰色区域”来推算当前色温。如果画面中有白色物体,那就简单了;如果没有,就得靠统计模型猜。

我常用的AWB策略:

  1. 色温分区:把色温分成几个区间,比如日光(5500K)、阴天(6500K)、荧光灯(4000K)、白炽灯(2800K)。
  2. 统计匹配:计算画面中R/G/B通道的比值,匹配到最近的色温区间。
  3. 平滑过渡:色温变化不能跳变,要加一个低通滤波器,让白平衡缓慢变化。

这里有个经典问题:AWB和AE的耦合。你想想看,AE调整曝光时间,会影响画面的亮度分布;亮度分布变了,AWB的色温估计也会变。反过来,AWB调整白平衡增益,会影响R/G/B通道的亮度,进而影响AE的测光结果。

我踩过这个坑。有一次,AE和AWB的更新频率都是30fps,结果两者互相干扰,画面一直在“闪烁”。后来我把AWB的更新频率降到15fps,AE保持30fps,问题就解决了。说白了,就是让AWB“慢半拍”,给AE一个稳定的画面去做测光。

注意:在车载场景下,AWB不能太“敏感”。比如车辆经过一排路灯,色温快速变化,如果AWB跟着跳,画面会忽黄忽蓝,非常影响视觉体验。我一般会加一个“色温锁定”机制——如果色温变化超过500K/s,就暂时锁定AWB,等稳定了再更新。

6.5 多Camera同步:3A的“合唱团”

多Camera同步,是车载系统里最头疼的问题。你想想,一个环视系统有4个Camera,如果每个Camera的AE、AWB各自为政,那拼接出来的画面就是“阴阳脸”——左边亮右边暗,左边暖右边冷。

多Camera同步的核心是统一控制。我常用的方案有两种:

方案 原理 优点 缺点
主从同步 选一个Camera做主,其他Camera跟随它的3A参数 实现简单,参数一致 主Camera如果被遮挡,所有Camera都受影响
独立同步 每个Camera独立计算3A,但通过算法强制结果一致 鲁棒性好,一个Camera出问题不影响其他 实现复杂,需要额外的同步算法

我个人更倾向于独立同步。为什么?因为车载场景下,每个Camera的视野不同,光照条件也不同。比如左Camera对着太阳,右Camera对着阴影,如果强制用同一个曝光参数,两边都会出问题。

独立同步的做法是:每个Camera自己算AE/AWB,但HAL层会做一个参数仲裁。比如,4个Camera的曝光时间分别是10ms、12ms、8ms、15ms,仲裁算法取中位数11ms,然后所有Camera都用11ms。这样既保留了每个Camera的独立性,又保证了最终参数的一致性。

这里有个细节:帧同步。多Camera的曝光时间必须对齐到同一个时间点,否则拼接画面会有“撕裂”。我一般用硬件触发信号(比如VSYNC)来同步所有Camera的曝光起始时间。

总结一下:多Camera同步,说白了就是让3A算法“合唱”而不是“独唱”。每个Camera可以有自己的“声部”,但最终要唱到同一个调上。

6.6 实战:3A参数调优的“三板斧”

最后,我分享一个实战经验。如果你在调3A参数时遇到问题,按这个顺序排查:

  1. 看Metadata日志:先确认Framework下发的参数和HAL上报的参数是否一致。很多时候,问题出在Metadata传递过程中被截断了。
  2. 看AE收敛曲线:用工具抓取AE的曝光时间和增益变化曲线,看是否震荡。如果震荡,加阻尼系数或降低更新频率。
  3. 看AWB色温变化:如果画面颜色跳变,检查AWB的平滑滤波器是否生效,或者色温变化阈值是否太敏感。

我曾经在一个项目里,AE和AWB的更新频率都是30fps,结果画面一直在“呼吸”——忽明忽暗,忽黄忽蓝。排查了三天,最后发现是AWB的更新频率太高,和AE形成了正反馈。把AWB降到15fps后,问题立刻消失。嗯,有时候问题就是这么简单,但你不去抓日志,永远想不到。

个人习惯:我一般在HAL里加一个“3A调试开关”,可以动态切换AE/AWB/AF的模式。调试时,先锁定两个,调第三个;三个都调好了,再放开。这样能快速定位问题。

好了,关于Camera Metadata和3A,今天就聊到这里。记住,3A不是孤立的,它们互相耦合,牵一发动全身。调好了,画面稳如泰山;调不好,用户骂娘。希望今天的分享能帮你少踩几个坑。


公众号:蓝海资料掘金营,微信deep3321