ใช้เซสชันการเพิ่มแสงในสภาวะแสงน้อย

ใช้เซสชันการเพิ่มแสงในสภาวะแสงน้อยเพื่อเปิดและปิดการเพิ่มแสงในสภาวะแสงน้อยของ 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;
  }
}

ประเด็นสำคัญเกี่ยวกับรหัสนี้

  • หลังจากเผยแพร่เซสชันแล้ว คุณไม่ควรเรียกใช้เมธอดใดๆ ของเซสชัน คุณ ควรกำหนดตัวแปรที่ชี้ไปยังเซสชันใหม่ เนื่องจากโค้ดนี้จะทำเช่นนั้น