استخدام جلسة تحسين الإضاءة المنخفضة

استخدِم جلسة تحسين الإضاءة المنخفضة لتفعيل ميزة "تحسين الإضاءة المنخفضة" من 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")
}

أنيق

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" للحصول على معلومات حول الوصول إلى واجهات برمجة تطبيقات "خدمات 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()، تنشئ عنصر رد الاتصال. يجب استدعاء هذه الطريقة عند إنشاء جلسة تحسين الإضاءة المنخفضة، كما هو موضّح في مقالة إنشاء جلسة.
  • يتم استدعاء دالة ردّ الاتصال عند قطع الاتصال بالجلسة أو إيقافها. لا يتم استدعاؤه عند إنشاء الجلسة. للتحقّق مما إذا تم إنشاء الجلسة بنجاح، افحص عنصر 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() لضبط الجلسة. يحدّد هذا الكائن عناصر مثل سطح الاستهداف ومعرّف الكاميرا المطلوب استخدامها وأبعاد المعاينة.
  • يفترض هذا الرمز أنّك فتحت اتصالاً بكاميرا Camera2، واستخدمت هذه المعلومات لضبط قيم cameraId, previewWidth, previewHeight. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Camera2.
  • ‫enableLowLightBoost هي قيمة منطقية تحدّد ما إذا كان يجب تفعيل ميزة "تحسين الإضاءة المنخفضة" أو إيقافها عند بدء التسجيل.
  • ‫createLowLightBoostCallback عبارة عن إجراء تكتبه لإنشاء عنصر رد الاتصال. يتم استدعاء هذا العنصر عند قطع الاتصال بالجلسة أو إيقافها.
  • يعرض الإجراء LowLightBoostClient.createSession() عنصر Task. يمكنك استخدام هذا العنصر لإعداد أدوات معالجة النجاح والفشل. التقط الفيديو داخل أداة معالجة النجاح.
  • يمكنك تحديد Executor لتشغيل المستمعين. إذا لم تحدّد Executor، سيتم تشغيل المستمعين في سلسلة التعليمات الرئيسية. في هذا الرمز، نفترض أنّ lowLightBoostExecutor هو Executor مناسب.

تمرير نتائج الالتقاط

تتطلّب ميزة "تحسين الإضاءة المنخفضة" من Google بعض البيانات الوصفية للكاميرا لمعرفة مقدار التحسين المناسب الذي يجب تطبيقه. يجب تمرير 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);
          }
        }
      };

نقاط رئيسية حول هذا الرمز

  • يعرض هذا الرمز فقط رمز CaptureCallback ذي الصلة ببرنامج LLB من Google. من المحتمل أن يكون لديك رمز آخر في عمليات الاستدعاء هذه.
  • يسمح تمرير TotalCaptureResult لميزة "تحسين الإضاءة المنخفضة" من Google بتحليل بيانات التعرض التلقائي للضوء والبيانات الوصفية الأخرى اللازمة لميزة "تحسين الإضاءة المنخفضة" لمعالجة رصد المشهد وتحديد مقدار التحسين الذي يجب تطبيقه على الإطار.
  • يجب تمرير العنصر 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() الخاص بهذا العنصر عند تغيُّر سطوع المشهد. يجب أن يضبط التنفيذ واجهة مستخدم الكاميرا بشكل مناسب.
  • يمكنك تحديد 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;
  }
}

نقاط رئيسية حول هذا الرمز

  • بعد إيقاف الجلسة، يجب عدم استدعاء أي من إجراءاتها. عليك محو أي متغيرات تشير إلى الجلسة، كما يفعل هذا الرمز.