本讲是Android Camera专题系列的第31讲,我们介绍Android Camera2 API专题的AE自动曝光第1部分,AE自动曝光包括如下内容,第一部分。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
AE是什么
AE(Auto Exposure)/AEC(Auto Exposure Control)自动曝光
AE 算法的主要工作原理
- 实时获取输入图像的统计信息并与设定目标亮度进行比较,而动态调节 sensor 的曝光时间和增益以及镜头光圈大小以达到实际亮度与设定目标亮度接近
Android中3A总开关
CaptureRequest#CONTROL_MODE
读取CameraCharacteristics#CONTROL_AVAILABLE_MODES来判断支持哪些Control Mode
CONTROL_MODE取值 | 描述 |
---|---|
CONTROL_MODE_OFF | Manual 3A,3A参数完全由App决定;为了快速响应从OFF切到AUTO模式,有可能3A算法还在运行,只是结果不会使用(依赖HAL的实现) |
CONTROL_MODE_AUTO | 3A参数是由3A算法计算出来,触发3A算法运算可以是App,也可能是HAL自动触发 |
CONTROL_MODE_USE_SCENE_MODE | 3A参数由Scene Mode(比如ACTION,NIGHT, BEACH等)决定,但有一个例外:当Scene Mode为FACE_PRIORITY时,3A参数还是由3A算法决定 |
CONTROL_MODE_USE_EXTENDED_SCENE_MODE | 3A参数由Extended Scene Mode决定,比如BOKEH。 API 30新增该Mode |
CONTROL_MODE_OFF_KEEP_STATE | 跟OFF模式类似,区别在于3A参数被锁定在上一个模式的最新值上 |
AE模式
CaptureRequest#CONTROL_AE_MODE
只有当CaptureRequest#CONTROL_MODE为AUTO时设置的值才生效
当前平台支持哪些值:读取CameraCharacteristics#CONTROL_AE_AVAILABLE_MODES
行为
- 当设置为OFF模式时:AE算法不生效,通过CaptureRequest#SENSOR_EXPOSURE_TIME, CaptureRequest#SENSOR_SENSITIVITY, CaptureRequest#SENSOR_FRAME_DURATION控制曝光
-
当设置为非OFF模式时(CONTROL_AE_MODE_ON*):手动曝光参数不生效,会被AE算法的结果覆盖
-
当选择带有FLASH的模式时:表示FLASH由AE来控制,CaptureRequest#FLASH_MODE设置的参数不生效
CONTROL_AE_MODE取值 | 描述 |
---|---|
CONTROL_AE_MODE_OFF | 手动曝光模式。 Hardware Level为FULL的CameraDevice必须支持;Hardware Level为LEGACY的CameraDevice不支持;Hardware Level为LIMITED的CameraDevice同时支持MANUAL_SENSOR capability也必须支持 |
CONTROL_AE_MODE_ON | 自动曝光模式,所有设备必须支持 |
CONTROL_AE_MODE_ON_AUTO_FLASH | 与ON模式类似。在暗环境下会控制闪光灯打闪 |
CONTROL_AE_MODE_ON_ALWAYS_FLASH | 与ON模式类似,在拍照时(STILL_CAPTURE)一定会让闪光灯打闪 |
CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE | 与ON_AUTO_FLASH类似,会自动消除红眼 |
CONTROL_AE_MODE_ON_EXTERNAL_FLASH | 告诉Camera设备外部闪光灯(不受Camera系统控制)已经打开,需要快速进行重新测光。外部闪光灯关闭后,需要切到其他ON模式 |
AE状态
CaptureResult#CONTROL_AE_STATE表示AE算法当前帧的状态。
CONTROL_AE_MODE取值 | 描述 |
---|---|
CONTROL_AE_STATE_INACTIVE | AE算法未激活状态,每次切换AE模式 / CONTROL_MODE / CONTROL_SCENE_MODE时,AE状态都会重置到CONTROL_AE_STATE_INACTIVE,但在CaptureResult中不一定能看到这种状态 |
CONTROL_AE_STATE_SEARCHING | AE算法正在收敛过程中,正在调整曝光参数,在CaptureResult中不一定能看到这种状态 |
CONTROL_AE_STATE_CONVERGED | AE算法收敛完成 |
CONTROL_AE_STATE_LOCKED | 当前的AE参数固定不变了,被锁住了,是由CONTROL_AE_LOCK来控制的 |
CONTROL_AE_STATE_FLASH_REQUIRED | AE算法收敛了,但拍照时需要打闪以获得更好的图像亮度 |
CONTROL_AE_STATE_PRECAPTURE | AE算法进入precapture状态,可以将CONTROL_AE_PRECAPTURE_TRIGGER设置为START来触发,打闪测光或消除红眼时需要 |
拍照前AE测光
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER标识是否触发拍照前的测光动作:
- 在Flash为不OFF时,需要在拍照前需要触发测光动作,用来估计场景亮度和最终打闪需要的闪光灯功率
-
在Hardware Level为LEGACY的设备上,Camera HAL自己完成测光动作,不需要App参与,其他Hardware Level的设备都需要App参与
-
App只能在单个CaptureRequest中设置该参数,设置完后需要等待测光完成才能进行下一步动作(比如拍照)
-
测光完成后,Camera HAL内部为了给接下来的拍照,曝光可能会把AE锁住,因此如果App接下来不拍照,需要主动让AE恢复正常流程
-
< API 23 : 设置CONTROL_AE_LOCK为TRUE后,再设置CONTROL_AE_LOCK为FALSE
-
>= API 23 : 设置为CONTROL_AE_PRECAPTURE_TRIGGER为CANCEL
-
-
支持同时对AE和AF进行preCapture trigger
CONTROL_AE_PRECAPTURE_TRIGGER取值 | 描述 |
---|---|
CONTROL_AE_PRECAPTURE_TRIGGER_IDLE | 没有触发AE preCapture |
CONTROL_AE_PRECAPTURE_TRIGGER_START | 触发AE preCapture测光操作 |
CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL | 取消AE preCapture测光,回到AE初始状态。如果AE preCapture测光已经完成,该动作会将AE状态切到初始状态 |