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

ใช้เซสชันการเพิ่มแสงในสภาวะแสงน้อยเพื่อเปิดและปิดการเพิ่มแสงในสภาวะแสงน้อยของ 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() ซึ่ง สร้างออบเจ็กต์การเรียกกลับ คุณจะเรียกใช้เมธอดนั้นเมื่อสร้างเซสชันการเพิ่มประสิทธิภาพในที่แสงน้อยจริง ตามที่อธิบายไว้ในสร้างเซสชัน
  • ระบบจะเรียกใช้ฟังก์ชันเรียกกลับเมื่อเซสชันถูกยกเลิกการเชื่อมต่อหรือถูกทำลาย ระบบจะไม่เรียกใช้เมื่อสร้างเซสชัน หากต้องการตรวจสอบว่าสร้างเซสชันสําเร็จหรือไม่ ให้ตรวจสอบออบเจ็กต์ 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 ผู้ฟังจะทำงานในเทรดหลัก ในโค้ดนี้ เราถือว่า lowLightBoostExecutor เป็น Executor ที่เหมาะสม

ส่งผลการจับภาพ

การเพิ่มคุณภาพในสภาวะแสงน้อยของ Google ต้องใช้ข้อมูลเมตาของกล้องบางอย่างเพื่อทราบปริมาณ การเพิ่มความสว่างที่ถูกต้องที่จะใช้ คุณต้องส่ง TotalCaptureResult ไปยังเมธอด processCaptureResult() คุณจะได้รับ TotalCaptureResult ในเมธอดonCaptureCompleted() Callback

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

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

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