微光增强自动曝光模式

Android 15 引入了 微光增强自动曝光 (AE) 模式,这是一种适用于 Camera 2夜间模式相机扩展 的新自动曝光模式。微光增强自动曝光模式可在低光条件下自动调整预览流的亮度。这与夜间模式相机扩展创建静态图像的方式不同,因为夜间模式会结合多张照片以创建单张增强图像。虽然夜间模式非常适合创建静态图像,但它无法创建连续的帧流,而微光增强自动曝光模式可以。因此,微光增强自动曝光模式实现了新的相机功能,例如:

  • 提供增强的图像预览,以便用户更好地构图他们的微光照片。
  • 在微光下扫描二维码。

如果启用微光增强自动曝光模式,它会在光线水平较低时自动开启,并在光线充足时关闭。

应用可以在低光条件下从预览流中录制,以保存增强亮度的视频。

您可以在 Camera2 或通过 相机扩展 使用微光增强自动曝光模式。本文档介绍如何在 Camera2 中使用微光增强自动曝光模式。如果设备支持夜间模式相机扩展,您也可以将其与微光增强自动曝光模式一起使用。

检查可用性

在使用微光增强自动曝光模式之前,请检查设备是否支持它。如果可用,微光增强自动曝光模式是 camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES 中列出的曝光模式之一。(微光增强是一种独立的自动曝光设置,因为其他自动曝光设置与微光增强自动曝光模式执行的预览增强亮度不兼容。)

因此,要检查微光增强自动曝光模式是否可用,请调用 CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) 并检查返回的模式是否包含 ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY

Kotlin

val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val autoExposureModes =
    characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)!!
val lowLightBoostSupported = autoExposureModes.contains(
        CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY)

if (lowLightBoostSupported) {
  // Enable Low Light Boost AE Mode (next section)
} else {
  // Proceed without Low Light Boost AE Mode
}

Java

CameraCharacteristics characteristics =
    mCameraManager.getCameraCharacteristics(cameraId);
int[] autoExposureModes =
    characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
boolean lowLightBoostSupported = autoExposureModes.contains(
        CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY);

if (lowLightBoostSupported) {
  // Enable Low Light Boost AE Mode (next section)
} else {
  // Proceed without Low Light Boost AE Mode
}

启用微光增强自动曝光模式

要在 Camera2 会话中启用微光增强自动曝光模式,请将 CaptureRequest.CONTROL_AE_MODE 设置为 ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY。执行此操作后,您需要确认微光增强自动曝光模式已开启;您可以通过检查 CaptureResult.CONTROL_AE_MODE 字段来执行此操作。您需要检查,因为微光增强并非与所有相机配置都兼容。例如,由于帧率方面的考虑,高速录制不支持微光增强自动曝光模式。如果微光增强自动曝光模式未开启,您可能需要更改相机配置并重试。

Kotlin

val captureRequestBuilder = camera.createCaptureRequest(
  CameraDevice.TEMPLATE_PREVIEW)
if (isLowLightBoostAvailable(cameraId)) {
  captureRequestBuilder.set(
    CaptureRequest.CONTROL_AE_MODE,
    CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
  )
}
// other capture request params

session.setRepeatingRequest(
  captureRequestBuilder.build(),
  object : CaptureCallback() {
    @Override
    fun onCaptureCompleted(session: CameraCaptureSession,
        request: CaptureRequest, result: TotalCaptureResult) {
      // verify Low Light Boost AE Mode AE mode set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
    }
  },
  cameraHandler
)

Java

CaptureRequest.Builder captureRequestBuilder =
  mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
if (isLowLightBoostAvailable(cameraId)) {
  captureRequestBuilder.set(
    CaptureRequest.CONTROL_AE_MODE,
    CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY);
}
// other capture request params

mSession.setRepeatingRequest(
  captureRequestBuilder.build(),
  new CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
        CaptureRequest request, TotalCaptureResult result) {
      // verify Low Light Boost AE Mode AE mode set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY;
    }
  },
  mCameraHandler
);

监控微光增强自动曝光模式

微光增强自动曝光模式可在低光条件下增强预览流的亮度,如果在光线充足的环境下,它不会产生任何影响。您可以通过检查 CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE 字段来确认微光增强自动曝光模式当前是否处于活动状态。如果您已开启微光增强自动曝光模式 它当前处于活动状态,则该字段会被设置为 CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE。然后,您可以显示月亮图标或其他指示,表明预览正在被增强亮度。

Kotlin

session.setRepeatingRequest(
  captureRequestBuilder.build(),
  object : CaptureCallback() {
    @Override
    fun onCaptureCompleted(session: CameraCaptureSession,
        request: CaptureRequest, result: TotalCaptureResult) {
      // check if Low Light Boost AE Mode is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost AE Mode state is active
        // Show Moon Icon
      } else {
        // Low Light Boost AE Mode state is inactive or AE mode is not set
        // to Low Light Boost AE Mode
        // Hide Moon Icon
      }
    }
  },
  cameraHandler
)

Java

mSession.setRepeatingRequest(
  captureRequestBuilder.build(),
  new CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
        CaptureRequest request, TotalCaptureResult result) {
      // check if Low Light Boost AE Mode is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost AE Mode state is active
        // Show Moon Icon
      } else {
        // Low Light Boost AE Mode state is inactive or AE mode is not set
        // to Low Light Boost AE Mode
        // Hide Moon Icon
      }
    }
  },
  mCameraHandler
);