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

استخدِم جلسة "تحسين الإضاءة المنخفضة" لتفعيل ميزة "تحسين الإضاءة المنخفضة" من 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 من خلال حزمة com.google.android.gms.cameralowlight "خدمات Google Play". راجِع مستندات "خدمات 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() لضبط إعدادات الجلسة. يحدّد هذا العنصر أمورًا مثل السطح المستهدف ومعرّف الكاميرا التي سيتم استخدامها وأبعاد المعاينة.
  • يفترض هذا الرمز أنّك فتحت من قبل اتصالاً بكاميرا 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);
          }
        }
      };

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

  • لا يعرض هذا الرمز سوى رمز CaptureCallback ذي الصلة بـ Google LLB. من المحتمل أن يكون لديك رمز آخر في عمليات معاودة الاتصال هذه.
  • يسمح تمرير 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;
  }
}

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

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