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

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

Основные моменты, касающиеся этого кода

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