Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать функцию 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;
  }
}

Ключевые моменты этого кода

  • После завершения сеанса не следует вызывать никакие его методы. Следует очистить все переменные, указывающие на сеанс, как это делает этот код.