Utiliser une session d'amplification luminosité faible

Utilisez une session d'amplification luminosité faible pour activer et désactiver l'amplification luminosité faible de 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")
}

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 est fourni par le package des services Google Play com.google.android.gms.cameralowlight. Pour en savoir plus sur l'accès aux API des services Google Play, consultez la documentation des services Google Play.

Créer un objet de rappel

Lorsque vous créez la session d'amplification luminosité faible, vous devez lui transmettre un objet qui implémente l'interface LowLightBoostCallback. Les fonctions de cet objet sont appelées lorsque la session est déconnectée ou détruite. Le code suivant montre comment créer un rappel :

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

Points clés concernant ce code

  • Ce code définit une méthode privée, createLowLightBoostCallback(), qui crée l'objet de rappel. Vous appellerez cette méthode lorsque vous créerez la session d'amplification luminosité faible, comme décrit dans Créer une session.
  • Le rappel est appelé lorsque la session est déconnectée ou détruite. Il n'est pas appelé lorsque la session est créée. Pour vérifier si la session a été créée, examinez l'objet Task renvoyé par LowLightBoostClient.createSession.

Créer une session

Pour créer une session d'amplification luminosité faible, appelez la méthode 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");
    });

Points clés concernant ce code

  • Vous transmettez un LowLightBoostOptions objet à createSession() pour configurer la session. Cet objet spécifie des éléments tels que la surface cible, l'ID de la caméra à utiliser et les dimensions de l'aperçu.
  • Ce code suppose que vous avez déjà ouvert une connexion à une caméra Camera2, et que vous avez utilisé ces informations pour définir les valeurs de cameraId, previewWidth, previewHeight. Pour en savoir plus, consultez la documentation de Camera2.
  • enableLowLightBoost est une valeur booléenne qui indique si l'amplification luminosité faible doit être activée ou désactivée.
  • createLowLightBoostCallback est une méthode que vous écrivez pour créer l'objet de rappel. Cet objet est appelé lorsque la session est déconnectée ou détruite.
  • La méthode LowLightBoostClient.createSession() renvoie un Task objet. Vous utilisez cet objet pour configurer des écouteurs de réussite et d'échec. Capturez la vidéo dans l'écouteur de réussite.
  • Vous pouvez spécifier un Executor pour exécuter les écouteurs. Si vous ne spécifiez pas d'Executor, les écouteurs s'exécutent sur le thread principal. Dans ce code, nous supposons que lowLightBoostExecutor est un Executor approprié.

Transmettre les résultats de la capture

L'amplification luminosité faible de Google a besoin de certaines métadonnées de la caméra pour connaître le niveau d'éclaircissement approprié à appliquer. Vous devez transmettre le TotalCaptureResult à la processCaptureResult() méthode. Vous pouvez obtenir le TotalCaptureResult dans la onCaptureCompleted() méthode de rappel.

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

Points clés concernant ce code

  • Ce code n'affiche que le code CaptureCallback pertinent pour l'amplification luminosité faible de Google. Vous aurez probablement d'autres codes dans ces rappels.
  • La transmission du TotalCaptureResult permet à l'amplification luminosité faible de Google d'analyser les données d'exposition automatique et d'autres métadonnées nécessaires pour que l'amplification luminosité faible traite la détection de scène et détermine le niveau d'amplification à appliquer à la frame.
  • Vous devez transmettre l'objet captureCallback lors de la création de la session de la caméra, par exemple avec `setSingleRepeatingRequest().
consultez le guide sur l'interopérabilité de CameraX avec Camera2.

Démarrer l'aperçu de la caméra

Une fois que vous avez créé une session d'amplification luminosité faible, vous pouvez démarrer le flux d'aperçu de la caméra Vous devez le faire dans le rappel onSuccess() que vous transmettez à la session d'amplification luminosité faible, comme décrit dans Créer une session. Le code suivant montre comment capturer une vidéo :

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

Points clés concernant ce code

Libérer la session

Lorsque la caméra n'est plus active, libérez la session d'amplification luminosité faible en appelant LowLightBoostSession.release(). En particulier, veillez à libérer la session lorsque votre activité est détruite. Pour ce faire, appelez la méthode dans la méthode onDestroy() de votre activité :

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

Points clés concernant ce code

  • Une fois la session libérée, vous ne devez plus appeler aucune de ses méthodes. Vous devez effacer toutes les variables pointant vers la session, comme le fait ce code.