Используйте сеанс усиления при слабом освещении, чтобы включать и выключать функцию Google Low Light Boost.
Котлин
dependencies {
val low_light_boost_version = "16.0.1-beta04"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")
implementation("com.google.android.gms:play-services-base:18.7.0")
implementation("com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}")
implementation("com.google.android.gms:play-services-tasks:18.3.0")
}
Круто
dependencies {
def low_light_boost_version = "16.0.1-beta04"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2'
implementation 'com.google.android.gms:play-services-base:18.7.0'
implementation 'com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}'
implementation 'com.google.android.gms:play-services-tasks:18.3.0'
}
LowLightBoostSession предоставляется пакетом com.google.android.gms.cameralowlight сервисов Google Play. Информацию о доступе к API сервисов Google Play см. в документации сервисов Google Play.
Создать объект обратного вызова
При создании сеанса усиления низкой освещённости необходимо передать ему объект, реализующий интерфейс LowLightBoostCallback . Функции этого объекта вызываются при отключении или завершении сеанса. Следующий код показывает, как создать обратный вызов:
Котлин
private fun createLowLightBoostCallback(): LowLightBoostCallback =
object : LowLightBoostCallback() {
override fun onSessionDestroyed() {
Log.d(TAG, "onSessionDestroyed")
lowLightBoostSession = null
}
override fun onSessionDisconnected(statusCode: Int) {
Log.d(TAG, "onSessionDisconnected: error=$statusCode")
lowLightBoostSession = null
}
}
Ява
private LowLightBoostCallback createLowLightBoostCallback() {
LowLightBoostCallback lowLightBoostCallback = new LowLightBoostCallback() {
@Override
public void onSessionDestroyed() {
Log.d(TAG, "onSessionDestroyed");
lowLightBoostSession = null;
}
@Override
public void onSessionDisconnected(int statusCode) {
Log.d(TAG, "onSessionCreationFailed: error=" + statusCode);
lowLightBoostSession = null;
}
}
return lowLightBoostCallback;
}
Ключевые моменты этого кода
- Этот код определяет закрытый метод
createLowLightBoostCallback(), который создаёт объект обратного вызова. Вы вызовете этот метод при фактическом создании сеанса усиления низкой освещённости, как описано в разделе Создание сеанса . - Обратный вызов вызывается при отключении или уничтожении сеанса. Он не вызывается при создании сеанса. Чтобы проверить, был ли сеанс успешно создан, проверьте объект
TaskвозвращаемыйLowLightBoostClient.createSession.
Создать сеанс
Чтобы создать сеанс низкой освещенности, вызовите метод LowLightBoostClient.createSession .
Котлин
val options = LowLightBoostOptions(
previewSurface,
cameraId,
previewWidth,
previewHeight,
enableLowLightBoost
)
launch {
try {
val lowLightBoostSession = lowLightBoostClient
.createSession(options, createLowLightBoostCallback()).await()
Log.d(TAG, "Session created successfully")
// Get the surface from the LLB session;
// give it to camera so camera can write frames to it
} catch (e: CancellationException) {
Log.w(TAG, "Session creation was canceled", e)
lowLightBoostSession = null
} catch (e: ApiException) {
Log.e(TAG, "Session creation failed with ApiException:", e)
lowLightBoostSession = null
} catch (e: Exception) {
Log.e(TAG, "Session creation failed with Exception", e)
lowLightBoostSession = null
}
}
Ява
LowLightBoostOptions options = new LowLightBoostOptions(
previewSurface,
cameraId,
previewWidth,
previewHeight,
enableLowLightBoost);
lowLightBoostClient
.createSession(options, createLowLightBoostCallback())
.addOnSuccessListener(
lowLightBoostExecutor,
(session) -> {
Log.d(TAG, "Session created successfully");
// Get the surface from the LLB session;
// give it to camera so camera can write frames to it
})
.addOnFailureListener(
lowLightBoostExecutor,
(e) -> {
ApiException apiException = (ApiException) e;
Log.d(TAG, "Session creation failed: " + e);
lowLightBoostSession = null;
})
.addOnCompleteListener(
lowLightBoostExecutor,
(task) -> Log.d(TAG, "Session creation complete"))
.addOnCanceledListener(
lowLightBoostExecutor,
() -> {
throw new RuntimeException("Session creation canceled");
});
Ключевые моменты этого кода
- Для настройки сеанса вы передаёте объект
LowLightBoostOptionsвcreateSession(). Этот объект определяет такие параметры, как целевая поверхность , идентификатор используемой камеры и размеры области предварительного просмотра. - Этот код предполагает, что вы уже открыли соединение с камерой Camera2 и использовали эту информацию для установки значений
cameraId, previewWidth, previewHeight. Подробнее см. в документации по Camera2 . -
enableLowLightBoost— логическое значение, указывающее, следует ли включить или выключить усиление при слабом освещении. -
createLowLightBoostCallback— это метод, который вы пишете для создания объекта обратного вызова. Этот объект вызывается при отключении или завершении сеанса. - Метод
LowLightBoostClient.createSession()возвращает объектTask. Этот объект используется для настройки обработчиков успешного и неудачного выполнения. Захват видео осуществляется внутри обработчика успешного выполнения. - Вы можете указать
Executorдля запуска прослушивателей. ЕслиExecutorне указан, прослушиватели запускаются в основном потоке. В этом коде мы предполагаем, чтоlowLightBoostExecutor— подходящийExecutor.
Передайте результаты захвата
Для Google Low Light Boost требуются определённые метаданные камеры, чтобы определить правильный уровень яркости. Необходимо передать TotalCaptureResult методу processCaptureResult() . Получить TotalCaptureResult можно в методе обратного вызова onCaptureCompleted() .
Котлин
val captureCallback = CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
lowLightBoostSession?.processCaptureResult(result)
}
}
Ява
CameraCaptureSession.CaptureCallback captureCallback =
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(
@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result)
if (lowLightBoostSession != null) {
lowLightBoostSession.processCaptureResult(result);
}
}
};
Ключевые моменты этого кода
- Этот код отображает только код
CaptureCallbackотносящийся к Google LLB. Скорее всего, в этих обратных вызовах будет присутствовать и другой код. - Передача
TotalCaptureResultпозволяет Google LLB анализировать данные автоматической экспозиции и другие метаданные, необходимые для усиления экспозиции при слабом освещении, чтобы обрабатывать обнаружение сцены и определять, какое усиление следует применить к кадру. - При создании сеанса камеры необходимо передать объект
captureCallback, например, с помощью ` setSingleRepeatingRequest() .
Начать предварительный просмотр камеры
После создания сеанса при слабом освещении можно запустить поток предварительного просмотра с камеры. Это следует сделать внутри обратного вызова onSuccess() который вы передаете сеансу при слабом освещении, как описано в разделе «Создание сеанса» . Следующий код показывает, как захватить видео:
Котлин
MainActivity.this.lowLightBoostSession =
lowLightBoostSession
MainActivity.this.lowLightBoostSession
.setSceneDetectorCallback(
(lowLightBoostSession, boostStrength) -> {
Log.d(TAG, "onSceneBrightnessChanged: " +
"boostStrength=$boostStrength")
// boostStrength > 0.5 indicates a low light scene.
// Update UI accordingly.
},
lowLightBoostExecutor
)
try {
startCaptureSession(
lowLightBoostSession.getCameraSurface())
// Start a Camera2 session here. Pass the LLB surface
// to the camera so the camera can write frames to it.
} catch (e: CameraAccessException) {
Log.e(TAG, "Failed to start capture session", e)
// Must try again or start the capture session without LLB.
}
Ява
MainActivity.this.lowLightBoostSession =
lowLightBoostSession;
MainActivity.this.lowLightBoostSession
.setSceneDetectorCallback(
(lowLightBoostSession, boostStrength) -> {
Log.d(TAG, "onSceneBrightnessChanged: " +
"boostStrength=" + boostStrength);
// boostStrength > 0.5 indicates a low light scene.
// Update UI accordingly.
},
lowLightBoostExecutor
);
try {
startCaptureSession(
lowLightBoostSession.getCameraSurface());
// Start a Camera2 session here. Pass the LLB surface
// to the camera so the camera can write frames to it.
} catch (CameraAccessException e) {
Log.e(TAG, "Failed to start capture session", e);
// Must try again or start the capture session without LLB.
}
Ключевые моменты этого кода
-
lowLightBoostSession— это сеанс, созданный вами в разделе «Создание сеанса» . -
setSceneDetectorCallback()определяет объект обратного вызова, реализующий интерфейсSceneDetectorCallback. Сеанс вызывает методonSceneBrightnessChanged()этого объекта при изменении яркости сцены. Ваша реализация должна соответствующим образом настроить пользовательский интерфейс камеры. - Вы можете указать
Executorдля выполнения обратного вызова. ЕслиExecutorне указан, обратный вызов выполняется в основном потоке. В этом коде мы предполагаем, чтоlowLightBoostExecutor— подходящийExecutor. -
lowLightBoostSession.getCameraSurface()возвращаетSurfaceс захваченным видео.
Освободите сессию
Когда камера перестанет быть активной, завершите сеанс усиления низкой освещённости, вызвав метод LowLightBoostSession.release() . В частности, необходимо обязательно завершить сеанс при уничтожении вашей активности. Это можно сделать, вызвав метод onDestroy() вашей активности:
Котлин
override protected void onDestroy() {
super.onDestroy()
if (lowLightBoostSession != null) {
lowLightBoostSession.release()
lowLightBoostSession = null
}
}
Ява
@Override
protected void onDestroy() {
super.onDestroy();
if (lowLightBoostSession != null) {
lowLightBoostSession.release();
lowLightBoostSession = null;
}
}
Ключевые моменты этого кода
- После завершения сеанса не следует вызывать никакие его методы. Следует очистить все переменные, указывающие на сеанс, как это делает этот код.