ローライト ブースト セッションを使用して、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: 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()
を定義します。このメソッドは、セッションを作成するで説明されているように、実際に低照度ブースト セッションを作成するときに呼び出します。 - セッションが切断または破棄されると、コールバックが呼び出されます。セッションの作成時には呼び出されません。セッションが正常に作成されたかどうかを確認するには、
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 の低照度ブーストでは、適用する明るさの量を正しく把握するために、特定のカメラ メタデータが必要です。TotalCaptureResult
を processCaptureResult()
メソッドに渡す必要があります。TotalCaptureResult
は 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);
}
}
};
このコードに関する主なポイント
- このコードは、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;
}
}
このコードに関する主なポイント
- セッションがリリースされた後は、そのメソッドを呼び出すことはできません。このコードのように、セッションを指す変数はすべてクリアする必要があります。