跳转至

一、闪光灯概览

The existing flashlights are underrated if we compare the growth rate of cameras in recent years. The desired quality of flash which can complement such powerful cameras is still not achieved. The flashlights are must for better photography experience and to take smartphone photography to a next level. 来源

闪光灯是相机 3A(AE/AF/AWB)之外的重要外设之一,用于在低光环境下为被摄体补光。本篇以闪光灯的理论为主线(类型、指数、预闪、红眼、与 AE 协同),并在末节从实现视角补充闪光灯及其他外设(ALS、IMU、ToF、VCM 等)在手机平台上的下发控制概念。

二、显色指数(CRI)

显色指数(Color Rendering Index,CRI)是衡量光源还原物体真实颜色能力的指标,数值越接近 100 表示显色性越好。来源可采用世光表(Sekonic)等光谱仪来检测闪光灯的光谱和显色指数。

3A外设_CRI光谱.png

三、基本常识

3.1 红眼现象

夜晚使用闪光灯拍照时很容易出现红眼或亮点:环境亮度低时人眼瞳孔变大,闪光灯的光射入人眼后会将眼底的血管照出来,故照片中眼睛部分出现红点。来源这也是预闪(preflash)消红眼机制的由来——先以较弱光预闪使瞳孔收缩,再进行主闪。

3.2 数码变焦与闪光灯

数码变焦倍率较大时(曾为大于 2 倍)会连续拍摄多张照片用于后期算法处理,拍摄时间较长;而闪光灯属于瞬间闪烁光源,无法长时间开启,因此高倍数码变焦下曾无法使用闪光灯。数码变焦是拍照时通过处理器对图像处理达到放大目的的功能,属预置处理方式,不可关闭。现在部分无法使用闪光灯的场景,原因往往同上。

3.3 低温环境限制

手机在低温环境不能使用闪光灯,源于锂聚合物电池特性:低温下电池性能下降,闪光灯开启会引起瞬间耗电增大。为避免功能异常,系统在低温环境下自动禁止闪光灯,以优化低温环境下的用户体验。

3.4 灯罩上下颜色差异

部分手机闪光灯灯罩上下部分颜色不一样,上部偏黄且只有上半部分亮:灯罩上半部分是闪光灯,下半部分是色温传感器,所以只有上半部分亮。来源由于手机使用高显色指数闪光灯,闪光灯本身(不发光时)呈桔黄色,色温传感器呈黑白相间颜色,故透过灯罩可发现上下两部分颜色有别。

3.5 亮度调光方式

闪光灯的设计思路差别很大,电压调光与电流调光是两种差别显著的方式。LED 是电流驱动器件,光输出直接取决于正向电流,故可通过调节电流实现亮度分级。

四、闪光灯分类

来源

  • 氙气(Xenon)闪光灯:Xenon 提供了比 LED 更亮的闪光。随着对笨重手机的需求减少,LED 取代了氙气闪光灯,有助于消除额外体积并减少电池消耗。
  • LED 闪光灯:LED 是电流驱动器件,光输出直接取决于正向电流。具有能效高、体积小、点亮快(be strobed faster)的特点。
  • 双色温闪光灯(Dual LED / True Tone / CCT):有两个不同色温的光源(例如一颗白色、一颗琥珀色),在使用闪光灯作为补光或辅助光时使其与环境色温更自然地"契合"。True Tone 闪光灯和 CCT 闪光灯包括白色和琥珀色 LED,以改善白平衡并增加对更多色温的支持。

3A外设_闪光灯类型.png

五、闪光指数与闪光曝光

闪光指数(Guide Number,GN)是衡量闪光灯功率的指标,定义为基础 ISO(通常 ISO 100)下、闪光灯到被摄体的距离与所用光圈系数的乘积[1]

\[ GN = D \times F \]

其中 \(D\) 为闪光灯到被摄体的距离(m),\(F\) 为光圈系数。给定闪光指数与光圈,可求出最大有效闪光距离:

\[ D = \frac{GN}{F} \]

闪光曝光遵循距离平方反比定律:被摄体上的照度与到闪光灯距离的平方成反比,因此距离翻倍时照度降为 1/4(即 2 档)。结合 GN 定义可知,距离翻倍时光圈需开大 2 档(\(F\) 减半)才能维持相同曝光。这与 AE\(E' \approx \dfrac{\pi L}{4F^2}\) 的光圈系数结论一致——成片亮度随 \(F^2\) 增大而降低。

六、闪光灯使用技巧

来源 来源

6.1 压光

利用闪光灯"压光"的效果,可拍出主体突出的近物:闪光灯的亮度照射在近距离物体上往往比自然光更亮,在自动曝光算法下会优先以物体为测光对象,形成主体明亮、背景较暗的图像。来源

3A外设_压光效果1.png

3A外设_压光效果2.png

6.2 特效布光

闪光灯配合适当工具可做特效布光:来源

3A外设_闪光特效.png

七、闪光灯与 AE/AF 协同

7.1 预闪与闪光标定

预闪在拍照主闪之前发出一次较弱闪光,用于让 AE 估计场景亮度并决定主闪功率(参见 AE 中的 precapture 状态)。在 Android Camera2 中,启用闪光灯时触发预捕获会发出预闪脉冲以估计场景亮度与所需的最终捕获闪光灯功率。

闪光灯亮度的标定(flash calibration)建立 duty(驱动等级)与电流的对应关系:不同的 duty 对应不同的电流,进而对应不同的亮度。实际中开闪光灯拍照往往并不进行动态校准,而是使用出厂标定表——例如可从 0 到若干等级逐级下发 duty,生成一张亮度梯度表,验证亮度是否随等级梯度变化。闪光参数在 tuning 中常分为 preFlash 参数与 mainFlash 参数两组分别配置。

3A外设_flash参数.png

7.2 闪光曝光控制

闪光曝光量取决于主闪功率与被摄体距离。结合闪光指数与距离平方反比定律,被摄体上的闪光照度可近似为:

\[ E_{flash} \propto \frac{P \cdot t}{D^2} \]

其中 \(P\) 为闪光功率,\(t\) 为闪光持续时间,\(D\) 为闪光灯到被摄体的距离。实际手机平台中,AE 算法在预闪后根据测得的亮度反推主闪所需 duty,使最终成片亮度收敛到 target。需要指出,闪光灯问题有不少是 AP 侧(应用层)问题,调试时建议与友商参考机对比——只要是 Android 平台,一般现象都一致。

7.3 闪光灯与 AE/AF 的联动时序

闪光灯拍照并非"亮一下即拍",而是一段 AE/AF 协同的预捕获(precapture)序列:主闪之前先发一次较弱的预闪(preflash),AE 据此测光并决定主闪功率;序列期间 AE 处于 PRECAPTURE 状态,会阻塞 AP 的拍照请求,直到测光就绪、AE 收敛后再正式出片。来源 这正是前文红眼/预闪(3.1)与预闪标定(7.1)的状态机依据。

触发 precapture 的典型场景有二:① 拍照时 AE 尚未收敛;② 闪光灯模式需要预闪。API1 下拍照状态机由 framework 的 CaptureSequencer 控制,manageStandardStart() 发现 AE 不收敛或闪光灯模式为 ON 时进入 precapture;API2 下由 APP 显式下发 AE_PRECAPTURE_TRIGGER_START,并等待 HAL 依次返回 precapture、converged 状态。来源 来源

Camera2 中闪光由 CONTROL_AE_MODE 表达,常见取值:ON_AUTO_FLASH(自动,AE 判断是否闪光)、ON_ALWAYS_FLASH(强开,每次都闪)、ON_AUTO_FLASH_REDEYE(自动 + 预闪消红眼)。AE 状态机比 AWB 多出 FLASH_REQUIRED(判定需要闪光)与 PRECAPTURE 两个状态,专门刻画闪光场景。来源 Camera2 把相机建模为管道(pipeline),单个 capture request 同时承载 AE/AF/闪光等控制,并提供 FLASH_INFO_AVAILABLECONTROL_AE_AVAILABLE_MODES 等查询项。来源

AE precapture 与 AF trigger 的关系:二者可以同时激活,但需一个动作完成后再运行下一个——并发但串行。这意味着带闪光的触屏对焦里,AE 测光与 AF 对焦不会争抢,而是按序收敛(来自相机 3A 框架的 AE 笔记)。

闪光灯与 AF 的耦合还体现在两点:① 低光下闪光/补光能提高被摄体对比度,利于对焦——部分设备以补光灯或对焦辅助灯辅助 AF;而持续光源(后置 torch、前置补光灯)不进入 precapture 新 task。② 触屏 + 闪光时,AF 在 AE 不稳定下被重新触发,需先收敛 AE 再收敛 AF,这一先后由下文 8.5 的 task_ae_touch_start 判定决定。

7.4 预闪 + 主闪:为何要分两阶段

预闪 + 主闪是手机闪光灯的主流控制方式,对应 7.3 的 precapture 序列。

预闪(preflash / 预闪测光)

预闪在主闪之前发出一次较弱的脉冲闪光,让相机通过镜头(TTL)测量被摄体反射回来的光,据此反推主闪应使用的功率(duty)。

之所以必须预闪,是因为闪光曝光无法事先预算

  1. 闪光照度遵循距离平方反比定律(7.2,\(E \propto P\cdot t / D^2\)),其中距离 \(D\) 与被摄体反照率相机事先未知。预览时的环境光测光(普通 AE)只反映环境亮度,并非"打了闪光后的亮度";不预闪则主闪功率只能靠猜——近处/浅色过曝,远处/深色欠曝。
  2. 预闪用与主闪同光谱、同色温的脉冲做探针测光,故预闪测得的反射率可直接外推到主闪。AE 算法在预闪后据测得亮度反推主闪 duty,使成片收敛到 target(7.2 末)。这是预闪测光 TTL(佳能 E-TTL、尼康 i-TTL)的本质。
  3. 附带收益:为 AWB 提供闪光色温下的白平衡样本(双色温闪光尤其重要),并触发瞳孔收缩以减轻红眼(3.1)。

主闪(main flash)

主闪在快门开启期间发出按预闪测光结果算定功率的强光,完成成像曝光。这才是真正用于成像的光——预闪只是测光探针,预闪时快门未开、功率是试探性的小功率,不能用于成像。

两阶段的必要性

闪光曝光是一个闭环控制问题:闪光功率与距离/反照率强相关,而二者拍照前未知,故必须先"试探测光"再"正式闪光"。一次性主闪无法闭环、曝光精度差;预闪 + 主闪把 TTL 测光的"测 → 算 → 闪"拆成两次脉冲,使主闪功率由预闪测光结果决定。对应 3A 框架的状态流转:AE 进入 PRECAPTURE → 发预闪脉冲 → 测光 → 决定主闪 duty → 阻塞拍照直到收敛 → 主闪期间完成捕获。来源

其他闪光模式

除预闪 + 主闪外,按触发/时序方式还有:

模式 特点 平台
单闪 / 直接闪光 无预闪,固定或粗估功率一次闪。快、无延迟,但曝光不准 低端设备;myjoplin 中"闪光强开 + touch 不触发 precapture"即此简化路径
红眼消除闪光 主闪前发一次/多次预闪,目的在瞳孔收缩(兼可测光),属预闪 + 主闪变体 Camera2 ON_AUTO_FLASH_REDEYE
慢速同步(slow sync) 闪光 + 慢快门:前景闪光冻结、背景长曝光收环境光,平衡夜景人像前后景 手机夜景人像常用
前帘 / 后帘同步 闪光在快门开启瞬间(前帘)或关闭瞬间(后帘)触发;后帘配慢速同步产生光迹拖尾残影 相机为主,手机少暴露
频闪 / 多重闪光 单次曝光多次脉冲,产生多重运动残影特效 相机/外置灯
补光 / 强制闪光(fill flash) 强光下也闪,消除逆光阴影、补面部光 ON_ALWAYS_FLASH
常亮补光(torch) 持续发光,不进入拍照闪光序列,作手电筒/前置补光 myjoplin:后置 torch、前置补光灯不触发新 task
TTL 自动调光(无显式预闪) 曝光期间实时监测反射光,够量即切断闪光(thyristor 调光),与预闪 TTL 的"先测后闪"不同 传统外置闪光灯
高速同步(HSS) 快门高于同步速度时,闪光以高频脉冲持续发光覆盖帘幕扫描时间 外置灯/单反,手机罕见
闪光包围(bracketing) 不同闪光功率拍多张选优 相机

手机平台主流组合为:单闪(强开简化)+ 预闪 + 主闪(auto / auto-red-eye)+ torch 常亮。Camera2 用 CONTROL_AE_MODE 把手机闪光抽象为 OFF / ON(不闪)/ ON_AUTO_FLASH / ON_ALWAYS_FLASH / ON_AUTO_FLASH_REDEYE 几档(见 7.3)。来源

八、实现视角(3A 外设控制)

本节来自相机 3A 框架的外设控制笔记,补充闪光灯等外设在手机平台上的下发控制概念。其中代码细节(文件路径、函数名、属性键、tuning 路径)属工程实现,会随平台/版本变化,仅作概念理解。

8.1 外设与下发控制

手机相机的外设由一个外设控制器(PeripheralController)统一管理,采用 AP 下发、HAL 执行的模式:AP 通过事件通知接口(NotifyEvent)下发控制指令,HAL 读取外设状态并执行实际硬件操作。常见外设包括:

  • 闪光灯(Flash):补光,详见前文。
  • 环境光传感器(ALS):测环境光照度与色温,为 AE/AWB 提供参考,详见下文。
  • 陀螺仪(Gyroscope)/ 加速度计(Accelerometer):合称 IMU,输出角速度(rad/s)与比力(m/s²),用于防抖与姿态估计;出厂进行零偏与尺度因子的标定。
  • ToF(飞行时间):通过测量红外光反射时间计算距离,常用于激光对焦与景深估计,故也称为深度相机。
  • OIS(光学防抖):通过镜组位移补偿手抖。
  • VCM(音圈马达):驱动镜头移动以实现对焦。
  • Flicker 检测(Flicker DET):检测工频闪烁以避免 banding(参见 AE 的 Flicker 章节)。

8.2 闪光灯参数下发

闪光灯的控制本质上是在 preFlash 与 mainFlash 两个阶段分别下发 duty(驱动等级)。标定阶段建立"duty → 电流 → 亮度"的映射表;运行时 AE 算法根据预闪测光结果,从表中选取合适的主闪 duty。该映射表通常以 tuning 参数文件形式提供,平台间命名与结构不同,故不展开具体键名。

8.3 ALS(环境光/色温传感器)

ALS 的性能指标主要考察:光谱响应、IR 抑制、勒克斯数、光敏度、集成的信号调节功能、功耗与封装大小。来源其输出参数为照度。在满足奈奎斯特采样定理的前提下,可由采样数据计算出环境光的频率。

以光宝(LiteOn)LTR-381RGB 为例,它是一款环境光感测(ALS)与色温颜色识别(CS)集成的传感器,基于量测 CCT 色温能够有效识别颜色及颜色深浅,采用 I2C 数字接口,尺寸小,广泛用于手机/平板等需要颜色识别的领域,如白平衡及色彩校准。来源

辐照度(Irradiance)指单位面积上单位时间接收到的光能量,单位 \(\mu W/cm^2\)。以 TSL2522 这类 ALS 为例,其增益与积分时间可配置(如 ALS Gain = 128×、Integration Time = 10ms),增益比以 ALS gain = 128× 为基准计算;对于 940nm 的 IR LED,photopic 通道的辐照度响应率约为 57 counts/μW/cm²。

8.4 Sensor 静态信息

外设控制器通过事件通知接口可获取 sensor 的静态信息(如模组厂商等),用于区分不同模组来源。例如某平台上 module id = 3 对应索尼 sensor,module id = 7 对应欧菲模组。

8.5 policy 与 Task:闪光/触屏事件的状态机

闪光灯、触屏等操作与 AE 强耦合。但 AE 核心组件在设计上应是状态无关、与其他设备无耦合的,因此这类耦合关系需在 AE 外围组件(如 Hal3AFlowCtrl)中统一管控:不同场景对应不同 AE/AF 策略,policy 在程序不同阶段控制状态量与 Task,最终由 Task 完成具体动作。

不同场景下有不同的 AE/AF 策略,policy 在程序的不同阶段控制状态量和 Task,最终由 Task 完成任务。目前需要针对性处理的事件有:

  • 正常闪光灯拍照,强开、auto 模式;
  • 关闭/自动/强开模式,touch 屏幕 1 次和 2 次;
  • auto/强开模式,touch 屏幕触发闪光灯后/前,立即点拍照;
  • auto/强开模式,touch 屏幕触发闪光灯后/前,稍微缓 1-2 秒点拍照;
  • 设置里打开触屏拍照、闪光灯设为 auto/强开,touch 屏幕(自动拍照);
  • 使用 API1 的应用中,AE 未收敛时拍照和闪光灯相关操作。

注:后置闪光灯 torch 模式和前置补光灯模式不触发新 task(属持续光源,不进入 precapture 序列)。

机制:threadAE 承担 AE/AWB/Flash/Flicker/Shading 控制,threadAF 承担 AF。policy 设置 TaskActionTaskMgr 据此 sendEvent 派发事件。下述案例说明 AE/AF 在闪光、触屏下的联动行为。

touch 1 次:APP 下发一次 AF_TRIGGER_START,状态由 user_trig_status 记忆,AfTriggerStart Task 处理完后复位,AF 重新收敛一次;用户 touch 的生效时段用 is_user_touch 标记。

touch 2 次:第二次 trigger 前先下发 cancel,cancel 后 AF 变 unstable 需重新对焦;第二次 trigger 时 task_ae_touch_start 为真,AF unstable 下的 trigger 将先收敛 AE,再收敛 AF。判定逻辑(即"何时需要在 AF 前先收敛 AE"):

out.task_ae_touch_start =
  (out.af_start && is_flash_trig) ||   // 带闪光的 touch
  (out.af_start && !af_stable)   ||   // 普通 touch
  (out.af_start && !af_support)  ||   // 前置 touch
  (out.ae_start && is_flash_trig);    // 闪光拍照 + AE precapture

闪光强开 + touch:仍走 ae_touch_by_af 路径,区别在于不触发 precapture(对应 7.4 的"单闪/直接闪光"简化路径)。

系统相机闪光拍照时序(带时间戳的事件流,体现"AE precapture → AF → 主闪 → 拍照"的串行联动):

precapStart               // AE 进入 precapture(because aePrecapStart)
TouchAEStart              // because ae_start and is_flash
[FlashStage = 1/2 …]      // 预闪阶段(kPreCapture / kPreFlash)
AfTriggerStart            // because af start by ae —— AE 收敛后触发 AF
[FlashStage = 2/0 …]      // 预闪 / 无闪阶段交替
Capture(#...)             // 正式拍照
[FlashStage = 4 …]        // 主闪(kMainFlashByFlow),拍中及拍后数次
TouchAECancel / AfTriggerCancel   // because af_cancel

可见闪光拍照的本质是:AE 先经预闪完成测光与收敛,再驱动 AF 重新对焦,最后在主闪期间完成捕获;触屏则通过 task_ae_touch_start 在"AF 不稳 / 带闪光"时强制插入一次 AE 收敛,保证 AE/AF 先后到位再出片。

九、参考

  1. Guide number - Wikipedia
  2. Smartphone Camera Flash Review - Gadgets To Use
  3. 手机上的闪光灯,怎么就沦为「鸡肋」了 - 爱范儿
  4. 闪光灯拍照为何红眼 - 知乎
  5. ALS 性能指标 - 电子市场
  6. 光宝 LTR-381RGB 色温传感器
  7. Android Camera2 CaptureRequest - CONTROL_AE_PRECAPTURE_TRIGGER / CONTROL_AE_MODE
  8. Android 3A 状态机(AE/AWB)
  9. Handling Camera2 3A Parameters - toughcoder
  10. What is precapture sequence in Camera2 - Stack Overflow
  11. Android Camera 系列(五):Camera2 - 掘金