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

Użyj sesji wzmocnienia przy słabym oświetleniu, aby włączyć i wyłączyć funkcję wzmocnienia przy słabym oświetleniu.

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

Groovy

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 udostępniana przez pakiet Usług Google Play com.google.android.gms.cameralowlight. Informacje o uzyskiwaniu dostępu do interfejsów API Usług Google Play znajdziesz w dokumentacji Usług Google Play.

Tworzenie obiektu wywołania zwrotnego

Podczas tworzenia sesji wzmocnienia przy słabym oświetleniu musisz przekazać do niej obiekt, który implementuje interfejs LowLightBoostCallback. Funkcje tego obiektu są wywoływane, gdy sesja zostanie odłą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ę, gdy utworzysz sesję wzmocnienia przy 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 ona wywoływana podczas tworzenia sesji. Aby sprawdzić, czy sesja została utworzona, zbadaj obiekt Task zwrócony przez LowLightBoostClient.createSession.

Tworzenie sesji

Aby utworzyć sesję przy 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(). Ten obiekt określa takie elementy jak powierzchnia docelowa, identyfikator kamery do użycia i wymiary podglądu.
  • Ten kod zakłada, że masz już otwarte połączenie z aparatem Camera2 i używasz tych informacji do ustawiania wartości cameraId, previewWidth, previewHeight. Więcej informacji znajdziesz w dokumentacji Camera2.
  • enableLowLightBoost to wartość logiczna określająca, czy wzmocnienie przy 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 odłączona lub zniszczona.
  • Metoda LowLightBoostClient.createSession() zwraca obiekt Task. Używasz tego obiektu do konfigurowania odbiorników sukcesu i niepowodzenia. Zrób zdjęcie w funkcji nasłuchiwania zdarzenia powodzenia.
  • Możesz określić Executor, aby uruchamiać 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

Aby określić odpowiednią wartość rozjaśnienia, funkcja Google Low Light Boost potrzebuje określonych metadanych aparatu. Musisz przekazać parametr TotalCaptureResult do metody processCaptureResult(). Wartość TotalCaptureResult możesz uzyskać 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 wyświetla tylko kod CaptureCallback odpowiedni dla Google LLB. W tych wywołaniach zwrotnych prawdopodobnie będziesz mieć inny kod.
  • Przekazywanie wartości TotalCaptureResult umożliwia Google LLB analizowanie danych automatycznej ekspozycji i innych metadanych, które są niezbędne do przetwarzania wykrywania sceny i określania, jak bardzo należy wzmocnić klatkę.
  • Podczas tworzenia sesji aparatu należy przekazać obiekt captureCallback, np. za pomocą funkcji setSingleRepeatingRequest().

Uruchamianie podglądu z kamery

Po utworzeniu sesji przy słabym oświetleniu możesz uruchomić strumień podglądu z kamery. Należy to zrobić w onSuccess()wywołaniu zwrotnym przekazywanym do sesji przy słabym oświetleniuonSuccess(), zgodnie z opisem w sekcji Tworzenie sesji. Poniższy kod pokazuje, jak nagrać film:

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

Zakończ sesję

Gdy kamera nie jest już aktywna, zakończ sesję wzmocnienia przy słabym oświetleniu, wywołując funkcję LowLightBoostSession.release(). Pamiętaj w szczególności, aby zwolnić sesję, gdy Twoja 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 sesję, tak jak w tym kodzie.