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

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

کاتلین

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 سرویس‌های گوگل پلی ارائه می‌شود. برای اطلاعات بیشتر در مورد دسترسی به APIهای سرویس‌های گوگل پلی، به مستندات سرویس‌های گوگل پلی مراجعه کنید.

ایجاد یک شیء فراخوانی مجدد

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

کاتلین

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() تعریف می‌کند که شیء callback را ایجاد می‌کند. شما این متد را زمانی که واقعاً جلسه تقویت نور کم را ایجاد می‌کنید، همانطور که در Create a session توضیح داده شده است، فراخوانی خواهید کرد.
  • تابع فراخوانی زمانی فراخوانی می‌شود که session قطع یا از بین برود. این تابع زمانی که session ایجاد می‌شود فراخوانی نمی‌شود . برای بررسی اینکه آیا session با موفقیت ایجاد شده است یا خیر، شیء 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 متدی است که برای ایجاد شیء callback می‌نویسید. این شیء زمانی فراخوانی می‌شود که session قطع یا از بین برود.
  • متد LowLightBoostClient.createSession() یک شیء Task برمی‌گرداند. شما از این شیء برای تنظیم شنونده‌های موفقیت و شکست استفاده می‌کنید. ویدیو را درون شنونده موفقیت ضبط کنید.
  • شما می‌توانید یک Executor برای اجرای listenerها مشخص کنید. اگر Executor مشخص نکنید، listenerها روی thread اصلی اجرا می‌شوند. در این کد، فرض می‌کنیم lowLightBoostExecutor یک Executor مناسب است.

نتایج ضبط را قبول کنید

Google Low Light Boost برای دانستن میزان صحیح روشنایی مورد نیاز، به فراداده‌های خاصی از دوربین نیاز دارد. شما باید 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 را نشان می‌دهد. احتمالاً کدهای دیگری نیز در این callbackها خواهید داشت.
  • ارسال 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 همان session ای است که شما در Create a session ایجاد کردید.
  • setSceneDetectorCallback() یک شیء فراخوانی تعریف می‌کند که رابط SceneDetectorCallback را پیاده‌سازی می‌کند. این جلسه (session) هنگامی که روشنایی صحنه تغییر می‌کند، متد onSceneBrightnessChanged() آن شیء را فراخوانی می‌کند. پیاده‌سازی شما باید رابط کاربری دوربین را به طور مناسب تنظیم کند.
  • شما می‌توانید یک Executor برای اجرای callback مشخص کنید. اگر Executor مشخص نکنید، callback روی thread اصلی اجرا می‌شود. در این کد، فرض می‌کنیم 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;
  }
}

نکات کلیدی در مورد این کد

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