ใช้เซสชันการเพิ่มแสงในสภาวะแสงน้อยเพื่อเปิดและปิดการเพิ่มแสงในสภาวะแสงน้อยของ 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
ดูข้อมูลเกี่ยวกับการเข้าถึง API ของบริการ Google Play ได้ในเอกสารประกอบของบริการ 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()
ซึ่ง สร้างออบเจ็กต์การเรียกกลับ คุณจะเรียกใช้เมธอดนั้นเมื่อสร้างเซสชันการเพิ่มประสิทธิภาพในที่แสงน้อยจริงๆ ตามที่อธิบายไว้ในสร้างเซสชัน - ระบบจะเรียกใช้ Callback เมื่อเซสชันถูกยกเลิกการเชื่อมต่อหรือถูกทำลาย ระบบไม่เรียกใช้เมื่อสร้างเซสชัน หากต้องการตรวจสอบว่าสร้างเซสชันสําเร็จหรือไม่ ให้ตรวจสอบออบเจ็กต์
Task
ที่LowLightBoostClient.createSession
ส่งคืน
สร้างเซสชัน
หากต้องการสร้างเซสชันแสงน้อย ให้เรียกใช้เมธอด
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()
เพื่อ กำหนดค่าเซสชัน ออบเจ็กต์นี้ระบุสิ่งต่างๆ เช่น target surface, รหัสของกล้องที่จะใช้ และขนาดของตัวอย่าง - โค้ดนี้ถือว่าคุณได้เปิดการเชื่อมต่อกับกล้อง Camera2 แล้ว
และใช้ข้อมูลดังกล่าวเพื่อตั้งค่าของ
cameraId, previewWidth, previewHeight
ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบ Camera2 enableLowLightBoost
คือค่าบูลีนที่ระบุว่าจะเปิดหรือปิดการเพิ่มประสิทธิภาพในสภาวะแสงน้อยcreateLowLightBoostCallback
คือเมธอดที่คุณเขียนเพื่อสร้างออบเจ็กต์ Callback ระบบจะเรียกใช้ออบเจ็กต์นี้เมื่อเซสชันถูกยกเลิกการเชื่อมต่อหรือถูกทำลาย- เมธอด
LowLightBoostClient.createSession()
จะแสดงผลออบเจ็กต์Task
คุณใช้ออบเจ็กต์นี้เพื่อตั้งค่าเครื่องมือฟังที่สำเร็จและล้มเหลว บันทึกวิดีโอภายในเครื่องมือฟังที่สำเร็จ - คุณระบุ
Executor
เพื่อเรียกใช้ Listener ได้ หากคุณไม่ได้ ระบุExecutor
ตัว Listener จะทำงานในเทรดหลัก ในโค้ดนี้ เราถือว่าlowLightBoostExecutor
เป็นExecutor
ที่เหมาะสม
ส่งผลการจับภาพ
ฟีเจอร์เพิ่มคุณภาพในที่แสงน้อยของ Google ต้องใช้ข้อมูลเมตาบางอย่างของกล้องเพื่อทราบปริมาณการเพิ่มความสว่างที่ถูกต้อง
ที่จะใช้ คุณต้องส่ง TotalCaptureResult
ไปยังเมธอด processCaptureResult()
คุณจะได้รับ TotalCaptureResult
ในเมธอด Callback 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);
}
}
};
ประเด็นสำคัญเกี่ยวกับรหัสนี้
- โค้ดนี้แสดงเฉพาะโค้ด
CaptureCallback
ที่เกี่ยวข้องกับ Google LLB คุณอาจมีโค้ดอื่นๆ ในการเรียกกลับเหล่านี้ - การส่ง
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;
}
}
ประเด็นสำคัญเกี่ยวกับรหัสนี้
- หลังจากเผยแพร่เซสชันแล้ว คุณไม่ควรเรียกใช้เมธอดใดๆ ของเซสชัน คุณ ควรกำหนดตัวแปรที่ชี้ไปยังเซสชันใหม่ เนื่องจากโค้ดนี้จะทำเช่นนั้น