Используйте режим усиления освещения при слабом освещении, чтобы включить или выключить функцию 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 Services. Информацию о доступе к API Google Play Services см. в документации Google Play Services.
Создайте объект обратного вызова.
При создании сессии Low Light Boost вам потребуется передать ей объект, реализующий интерфейс 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
}
}
Java
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(), который создает объект обратного вызова. Вы будете вызывать этот метод при фактическом создании сессии Low Light Boost, как описано в разделе «Создание сессии» . - Функция обратного вызова вызывается при отключении или уничтожении сессии. Она не вызывается при создании сессии. Чтобы проверить, была ли сессия успешно создана, изучите объект
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
}
}
Java
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");
});
Основные моменты, касающиеся этого кода
- Для настройки сессии в метод
createSession()передается объектLowLightBoostOptions. Этот объект определяет такие параметры, как целевая поверхность , идентификатор используемой камеры и размеры предварительного просмотра. - Этот код предполагает, что вы уже установили соединение с камерой Camera2 и использовали эту информацию для установки значений
cameraId, previewWidth, previewHeight. Для получения дополнительной информации см. документацию Camera2 . -
enableLowLightBoost— это логическое значение, указывающее, следует ли включать или выключать режим усиления низкой освещенности. -
createLowLightBoostCallback— это метод, который вы пишете для создания объекта обратного вызова. Этот объект вызывается при отключении или уничтожении сессии. - Метод
LowLightBoostClient.createSession()возвращает объектTask. Этот объект используется для настройки обработчиков событий успешного и неудачного выполнения. Захват видео происходит внутри обработчика успешного выполнения. - Вы можете указать
Executorдля запуска обработчиков событий. Если вы не укажетеExecutor, обработчики событий будут выполняться в основном потоке. В этом коде мы предполагаем, чтоlowLightBoostExecutorявляется подходящимExecutor.
Передайте результаты захвата
Для определения правильного уровня осветления в Google Low Light Boost необходимы определенные метаданные камеры. В метод processCaptureResult() необходимо передать значение TotalCaptureResult . Получить TotalCaptureResult можно в методе обратного вызова onCaptureCompleted() .
Котлин
val captureCallback = CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
lowLightBoostSession?.processCaptureResult(result)
}
}
Java
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.
}
Java
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
}
}
Java
@Override
protected void onDestroy() {
super.onDestroy();
if (lowLightBoostSession != null) {
lowLightBoostSession.release();
lowLightBoostSession = null;
}
}
Основные моменты, касающиеся этого кода
- После освобождения сессии не следует вызывать никакие её методы. Необходимо очистить все переменные, указывающие на сессию, как это делает данный код.