Режим автоматической экспозиции при слабом освещении

В Android 15 появился режим автоматической экспозиции для слабого освещения, доступный как для Camera 2, так и для расширения камеры для ночного режима. Режим автоматической экспозиции "Усиление при слабом освещении" автоматически регулирует яркость потока предварительного просмотра в условиях низкой освещенности. Это отличается от того, как расширение камеры для ночного режима создает неподвижные изображения, поскольку ночной режим объединяет серию фотографий для создания одного улучшенного изображения. Ночной режим отлично подходит для создания неподвижных изображений, но не может создавать непрерывный поток кадров, в отличие от режима автоэкспозиции для слабого освещения. Таким образом, режим автоэкспозиции Low Light Boost позволяет использовать новые возможности камеры, например:

  • Улучшенный предпросмотр изображений, чтобы пользователям было проще кадрировать снимки, сделанные при слабом освещении.
  • Сканирование QR-кодов при слабом освещении.

Если вы включите режим автоэкспозиции "Усиление при слабом освещении", он будет автоматически включаться при низком уровне освещенности и отключаться при более высоком.

Приложения могут записывать видео из потока предварительного просмотра в условиях низкой освещенности, чтобы сохранить более яркое видео.

Режим Low Light Boost AE можно использовать в Camera2 или через расширения камеры. В этом документе рассказывается, как использовать режим автоэкспозиции "Улучшение при слабом освещении" с Camera2. Вы также можете использовать режим автоэкспозиции с усилением при слабом освещении с расширением камеры "Ночной режим", если оно поддерживается устройством.

Проверить доступность

Прежде чем использовать режим автоэкспозиции "Усиление при слабом освещении", убедитесь, что он поддерживается на устройстве. Если режим автоэкспозиции с усилением при слабом освещении доступен, он будет указан в списке режимов экспозиции в camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. (Усиление при слабом освещении – это отдельный режим автоэкспозиции, поскольку другие режимы несовместимы с осветлением предварительного просмотра, которое выполняется в режиме автоэкспозиции с усилением при слабом освещении.)

Чтобы проверить, доступен ли режим Low Light Boost AE, вызовите CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) и посмотрите, есть ли среди возвращенных режимов ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY.

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.
}

Включить режим автоэкспозиции для усиления при слабом освещении

Чтобы включить режим автоэкспозиции с усилением при слабом освещении в сеансе Camera2, задайте для параметра CaptureRequest.CONTROL_AE_MODE значение ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. После этого вам нужно будет убедиться, что режим Low Light Boost AE включен. Для этого проверьте поле CaptureResult.CONTROL_AE_MODE. Это необходимо, поскольку усиление при слабом освещении совместимо не со всеми конфигурациями камер. Например, при высокоскоростной записи не поддерживается режим автоэкспозиции с усилением при слабом освещении из-за ограничений по частоте кадров. Если режим автоэкспозиции Low Light Boost не включен, возможно, вам потребуется изменить конфигурацию камеры и повторить попытку.

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
)

Отслеживать режим автоэкспозиции при слабом освещении

Режим автоэкспозиции с усилением при слабом освещении делает изображение в режиме предварительного просмотра ярче, если света недостаточно. Если же освещение нормальное, этот режим не оказывает никакого эффекта. Чтобы узнать, включен ли режим Low Light Boost AE, проверьте поле CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Если вы включили режим автоэкспозиции "Усиление при слабом освещении" и он активен, в поле будет указано CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Затем вы можете показать значок луны или другой индикатор того, что изображение в режиме предварительного просмотра становится ярче.

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
)