Używanie sesji ze wzmocnieniem w słabym oświetleniu

Użyj sesji wzmocnienia w słabym oświetleniu, aby włączyć i wyłączyć wzmocnienie w słabym oświetleniu od Google.

Kotlin

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")
}

Dynamiczny

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 jest dostępna w pakiecie com.google.android.gms.cameralowlight w ramach Usług Google Play. Informacje o dostępie do interfejsów API Usług Google Play znajdziesz w dokumentacji Usług Google Play.

Tworzenie obiektu wywołania zwrotnego

Podczas tworzenia sesji wzmocnienia w słabym oświetleniu musisz przekazać do niej obiekt, który implementuje interfejs LowLightBoostCallback. Funkcje tego obiektu są wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Poniższy kod pokazuje, jak utworzyć wywołanie zwrotne:

Kotlin

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

Najważniejsze informacje o tym kodzie

  • Ten kod definiuje metodę prywatną createLowLightBoostCallback(), która tworzy obiekt wywołania zwrotnego. Wywołasz tę metodę podczas tworzenia sesji wzmocnienia w słabym oświetleniu, zgodnie z opisem w sekcji Tworzenie sesji.
  • Wywołanie zwrotne jest wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Nie jest wywoływane, gdy sesja zostanie utworzona. Aby sprawdzić, czy sesja została utworzona, sprawdź obiekt Task zwrócony przez LowLightBoostClient.createSession.

Tworzenie sesji

Aby utworzyć sesję w słabym oświetleniu, wywołaj metodę LowLightBoostClient.createSession.

Kotlin

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");
    });

Najważniejsze informacje o tym kodzie

  • Aby skonfigurować sesję, przekaż obiekt LowLightBoostOptions do createSession() to. Ten obiekt określa m.in. powierzchnię docelową target surface, identyfikator aparatu, który ma być używany, oraz wymiary podglądu.
  • Ten kod zakłada, że masz już otwarte połączenie z aparatem Camera2, i używasz tych informacji do ustawienia wartości cameraId, previewWidth, previewHeight. Więcej informacji znajdziesz w dokumentacji Camera2.
  • enableLowLightBoost to wartość logiczna określająca, czy wzmocnienie w słabym oświetleniu ma być włączone czy wyłączone.
  • createLowLightBoostCallback to metoda, którą piszesz, aby utworzyć obiekt wywołania zwrotnego. Ten obiekt jest wywoływany, gdy sesja zostanie rozłączona lub zniszczona.
  • Metoda LowLightBoostClient.createSession() zwraca obiekt Task. Używasz tego obiektu do konfigurowania odbiorników sukcesu i niepowodzenia. Przechwyć film w odbiorniku sukcesu.
  • Możesz określić Executor, aby uruchomić odbiorniki. Jeśli nie określisz Executor, odbiorniki będą działać w wątku głównym. W tym kodzie, zakładamy, że lowLightBoostExecutor jest odpowiednim Executor.

Przekazywanie wyników przechwytywania

Wzmocnienie w słabym oświetleniu od Google potrzebuje określonych metadanych aparatu, aby wiedzieć, jakiego rozjaśnienia użyć. Musisz przekazać TotalCaptureResult do processCaptureResult() metody. Możesz uzyskać TotalCaptureResult w metodzie wywołania zwrotnego onCaptureCompleted().

Kotlin

  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);
          }
        }
      };

Najważniejsze informacje o tym kodzie

  • Ten kod pokazuje tylko kod CaptureCallback związany z wzmocnieniem w słabym oświetleniu od Google. W tych wywołaniach zwrotnych prawdopodobnie będziesz mieć inny kod.
  • Przekazanie TotalCaptureResult umożliwia wzmocnieniu w słabym oświetleniu od Google analizowanie danych automatycznej ekspozycji i innych metadanych, które są niezbędne do przetwarzania wykrywania sceny i określania, jakiego wzmocnienia użyć w przypadku klatki.
  • Podczas tworzenia sesji aparatu należy przekazać obiekt captureCallback, na przykład za pomocą setSingleRepeatingRequest().
znajdziesz w przewodniku dotyczącym interoperacyjności CameraX z Camera2.

Uruchamianie podglądu z aparatu

Po utworzeniu sesji w słabym oświetleniu możesz uruchomić strumień podglądu z aparatu. Powinno się to zrobić w wywołaniu zwrotnym onSuccess(), które przekazujesz do sesji w słabym oświetleniu, zgodnie z opisem w sekcji Tworzenie sesji. Poniższy kod pokazuje, jak nagrywać filmy:

Kotlin

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

Najważniejsze informacje o tym kodzie

Zwalnianie sesji

Gdy aparat nie jest już aktywny, zwolnij sesję wzmocnienia w słabym oświetleniu, wywołując LowLightBoostSession.release(). W szczególności należy zwolnić sesję, gdy aktywność zostanie zniszczona. Możesz to zrobić, wywołując metodę w metodzie onDestroy() aktywności:

Kotlin

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

Najważniejsze informacje o tym kodzie

  • Po zwolnieniu sesji nie należy wywoływać żadnych jej metod. Należy wyczyścić wszystkie zmienne wskazujące na sesję, tak jak w tym kodzie.