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

برای روشن و خاموش کردن «تقویت نور کم 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: Int) {
      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 = 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;
  }
}

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

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