استفاده از جلسه تقویت نور کم

از جلسه تقویت نور کم برای روشن و خاموش کردن «تقویت نور کم Google» استفاده کنید.

کاتلین

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 توسط بسته com.google.android.gms.cameralowlight خدمات Google Play ارائه می‌شود. برای کسب اطلاعات درباره دسترسی به میاناهای برنامه‌سازی کاربردی خدمات Google Play، به اسناد خدمات Google Play مراجعه کنید.

ایجاد شیء فراخوانی برگشتی

وقتی جلسه تقویت نور کم را ایجاد می‌کنید، باید شیئی را به آن ارسال کنید که میانای LowLightBoostCallback را پیاده‌سازی می‌کند. وقتی جلسه قطع یا نابود می‌شود، عملکردهای این شیء فراخوانی می‌شود. کد زیر نحوه ایجاد فراخوانی برگشتی را نشان می‌دهد:

کاتلین

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

جاوا

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 را فراخوانی کنید.

کاتلین

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

جاوا

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() دریافت کنید.

کاتلین

val captureCallback = object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
        session: CameraCaptureSession,
        request: CaptureRequest,
        result: TotalCaptureResult
    ) {
        super.onCaptureCompleted(session, request, result)
        lowLightBoostSession?.processCaptureResult(result)
    }
}

جاوا

  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() که به جلسه نور کم ارسال می‌کنید انجام دهید، همان‌طور که در ایجاد جلسه توضیح داده شده است. کد زیر نحوه ضبط ویدیو را نشان می‌دهد:

کاتلین

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

جاوا

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() فعالیتتان انجام دهید:

کاتلین

override protected void onDestroy() {
  super.onDestroy()
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release()
    lowLightBoostSession = null
  }
}

جاوا

@Override
protected void onDestroy() {
  super.onDestroy();
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release();
    lowLightBoostSession = null;
  }
}

نکات کلیدی درباره این کد

  • پس‌از انتشار جلسه، نباید هیچ‌کدام از روش‌های آن را فراخوانی کنید. باید هر متغیری را که به جلسه اشاره می‌کند پاک کنید، همان‌طور که این کد انجام می‌دهد.