ローライト ブースト セッションを使用する

ローライト ブースト セッションを使用して、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 は、Google Play 開発者サービスの com.google.android.gms.cameralowlight パッケージによって提供されます。Google Play 開発者サービス API へのアクセスについては、Google Play 開発者サービスのドキュメントをご覧ください。

コールバック オブジェクトを作成する

ローライト ブースト セッションを作成するときに、LowLightBoostCallback インターフェースを実装するオブジェクトを渡す必要があります。このオブジェクトの関数は、セッションが切断または破棄されたときに呼び出されます。次のコードは、コールバックを作成する方法を示しています。

Kotlin

private fun createLowLightBoostCallback(): LowLightBoostCallback =
    object : LowLightBoostCallback {
        override fun onSessionDestroyed() {
            Log.d(TAG, "onSessionDestroyed")
            lowLightBoostSession = null
        }

        override fun onSessionDisconnected(statusCode: Status) {
            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() を定義しています。このメソッドは、セッションを作成するで説明されているように、実際にローライト ブースト セッションを作成するときに呼び出します。
  • このコールバックは、セッションが切断または破棄されたときに呼び出されます。セッションの作成時には呼び出されません。セッションが正常に作成されたかどうかを確認するには、LowLightBoostClient.createSession から返された Task オブジェクトを調べます。

セッションを作成する

ローライト セッションを作成するには、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");
    });

このコードに関する主なポイント

  • LowLightBoostOptions オブジェクトを createSession() に渡してセッションを構成します。このオブジェクトでは、ターゲット サーフェス、使用するカメラの ID、プレビューのサイズなどを指定します。
  • このコードは、Camera2 カメラへの接続をすでに開いており、その情報を使用して cameraId, previewWidth, previewHeight の値を設定していることを前提としています。詳しくは、Camera2 のドキュメントをご覧ください。
  • enableLowLightBoost は、ローライト ブーストをオンまたはオフのどちらで開始するかを指定するブール値です。
  • createLowLightBoostCallback は、コールバック オブジェクトを作成するために記述するメソッドです。このオブジェクトは、セッションが切断または破棄されたときに呼び出されます。
  • LowLightBoostClient.createSession() メソッドは Task オブジェクトを返します。このオブジェクトを使用して、成功リスナーと失敗リスナーを設定します。成功リスナー内で動画をキャプチャします。
  • Executor を指定してリスナーを実行できます。Executor を指定しない場合、リスナーはメインスレッドで実行されます。このコードでは、lowLightBoostExecutor が適切な Executor であると想定しています。

キャプチャ結果を渡す

Google Low Light Boost では、適用する明るさの適切な量を判断するために、特定のカメラ メタデータが必要です。TotalCaptureResult を processCaptureResult() メソッドに渡す必要があります。TotalCaptureResult は onCaptureCompleted() コールバック メソッドで取得できます。

Kotlin

val captureCallback = object : 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);
          }
        }
      };

このコードに関する主なポイント

  • このコードは、Google LLB に関連する CaptureCallback コードのみを示しています。これらのコールバックには、他のコードが含まれている可能性があります。
  • TotalCaptureResult を渡すと、Google LLB は自動露出データと、低照度ブーストがシーン検出を処理してフレームに適用するブースト量を決定するために必要なその他のメタデータを分析できます。
  • カメラ セッションを作成するときに、captureCallback オブジェクトを渡す必要があります(例: setSingleRepeatingRequest() を使用)。

カメラ プレビューを開始する

ローライト セッションを作成したら、カメラ プレビュー ストリームを開始できます。これは、セッションを作成するで説明されているように、ローライト セッションに渡す onSuccess() コールバック内で行う必要があります。次のコードは、動画をキャプチャする方法を示しています。

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

このコードに関する主なポイント

  • lowLightBoostSession は、セッションを作成するで作成したセッションです。
  • setSceneDetectorCallback() は、SceneDetectorCallback インターフェースを実装するコールバック オブジェクトを定義します。セッションは、シーンの明るさが変化すると、そのオブジェクトの onSceneBrightnessChanged() メソッドを呼び出します。実装では、カメラの UI を適切に調整する必要があります。
  • Executor を指定してコールバックを実行できます。Executor を指定しない場合、コールバックはメインスレッドで実行されます。このコードでは、lowLightBoostExecutor が適切な Executor であると想定しています。
  • lowLightBoostSession.getCameraSurface() は、キャプチャされた動画を含む Surface を返します。

セッションを解放する

カメラがアクティブでなくなったら、LowLightBoostSession.release() を呼び出してローライト ブースト セッションを解放します。特に、アクティビティが破棄されたときにセッションを解放する必要があります。そのためには、アクティビティの onDestroy() メソッドでこのメソッドを呼び出します。

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

このコードに関する主なポイント

  • セッションが解放された後は、そのメソッドを呼び出さないでください。このコードのように、セッションを指す変数をすべてクリアする必要があります。