কম আলোর বুস্ট সেশন ব্যবহার করুন

Google Low Light Boost চালু ও বন্ধ করতে, Low Light Boost সেশন ব্যবহার করুন।

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 পরিষেবা API অ্যাক্সেস করা সংক্রান্ত তথ্যের জন্য 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
    }
  }

জাভা

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(), সংজ্ঞায়িত করে, যা কলব্যাক অবজেক্ট তৈরি করে। আপনি যখন আসলে কম আলোতে বুস্ট সেশন তৈরি করবেন, তখন সেই পদ্ধতিকে কল করবেন, যেমনটি সেশন তৈরি করুন-এ বর্ণনা করা হয়েছে।
  • সেশন ডিসকানেক্ট বা নষ্ট হয়ে গেলে কলব্যাক কল করা হয়। সেশন তৈরি করার সময় এটি কল করা হয় না। সেশনটি সফলভাবে তৈরি হয়েছে কিনা তা চেক করতে, LowLightBoostClient.createSession-এর মাধ্যমে ফেরত পাঠানো Task অবজেক্টটি পরীক্ষা করুন।

সেশন তৈরি করুন

কম আলোর সেশন তৈরি করতে, 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
  }
}

জাভা

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");
    });

এই কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট

  • সেশন কনফিগার করতে আপনি createSession()-এ LowLightBoostOptions অবজেক্ট পাস করেন। এই অবজেক্ট টার্গেট সারফেস, ব্যবহার করার জন্য ক্যামেরার আইডি এবং প্রিভিউয়ের ডাইমেনশনের মতো বিষয় নির্দিষ্ট করে।
  • এই কোড ধরে নেয় যে আপনি আগে থেকেই Camera2 ক্যামেরার সাথে কানেকশন খুলেছেন, এবং cameraId, previewWidth, previewHeight-এর ভ্যালু সেট করতে সেই তথ্য ব্যবহার করেছেন। আরও তথ্যের জন্য, Camera2 ডকুমেন্টেশন দেখুন।
  • enableLowLightBoost হল একটি বুলিয়ান ভ্যালু যা নির্দিষ্ট করে যে কম আলো বুস্ট চালু নাকি বন্ধ অবস্থায় শুরু হবে।
  • createLowLightBoostCallback হল একটি পদ্ধতি যা আপনি কলব্যাক অবজেক্ট তৈরি করার জন্য লেখেন। সেশন ডিসকানেক্ট বা নষ্ট হয়ে গেলে এই অবজেক্ট কল করা হয়।
  • LowLightBoostClient.createSession() পদ্ধতিটি একটি Task অবজেক্ট রিটার্ন করে। আপনি এই অবজেক্ট ব্যবহার করে সাফল্য ও ব্যর্থতা সংক্রান্ত লিসেনার সেট-আপ করেন। সাকসেস লিসেনারের মধ্যে ভিডিও ক্যাপচার করুন।
  • লিসনার চালানোর জন্য আপনি Executor উল্লেখ করতে পারবেন। আপনি যদি কোনও Executor নির্দিষ্ট না করেন, তাহলে লিসেনার মূল থ্রেডে রান করে। এই কোডে, আমরা ধরে নিচ্ছি যে lowLightBoostExecutor হল একটি উপযুক্ত Executor।

ক্যাপচার ফলাফলে পাস করে

Google Low Light Boost-এর জন্য নির্দিষ্ট কিছু ক্যামেরা মেটাডেটা প্রয়োজন যাতে কতটা উজ্জ্বলতা প্রয়োগ করতে হবে তা জানা যায়। আপনাকে অবশ্যই TotalCaptureResult-এ পাস করতে হবে processCaptureResult() পদ্ধতিতে। আপনি onCaptureCompleted() কলব্যাক পদ্ধতিতে TotalCaptureResult পেতে পারেন।

Kotlin

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

এই কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট

  • এই কোডটি শুধুমাত্র Google LLB-এর সাথে প্রাসঙ্গিক CaptureCallback কোড দেখাচ্ছে। এইসব কলব্যাকে আপনার কাছে অন্য কোড থাকার সম্ভাবনা আছে।
  • TotalCaptureResult-এ পাস করার মাধ্যমে Google LLB-কে অটো এক্সপোজার ডেটা এবং অন্যান্য মেটাডেটা বিশ্লেষণ করার অনুমতি দেয় যা দৃশ্য শনাক্তকরণ প্রসেস করতে এবং ফ্রেমে কতটা বুস্ট প্রয়োগ করতে হবে তা নির্ধারণ করতে লো লাইট বুস্টের জন্য প্রয়োজনীয়।
  • ক্যামেরা সেশন তৈরি করার সময় আপনাকে 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.
}

জাভা

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() পদ্ধতিকে কল করে। আপনার ইমপ্লিমেন্টেশন ক্যামেরার UI যথাযথভাবে অ্যাডজাস্ট করা উচিত।
  • কলব্যাক চালানোর জন্য আপনি Executor নির্দিষ্ট করতে পারবেন। আপনি Executor নির্দিষ্ট না করলে, কলব্যাক মূল থ্রেডে রান করে। এই কোডে, আমরা ধরে নিচ্ছি যে lowLightBoostExecutor হল একটি উপযুক্ত Executor।
  • lowLightBoostSession.getCameraSurface() ক্যাপচার করা ভিডিও সহ Surface ফিরিয়ে দেয়।

সেশন রিলিজ করুন

ক্যামেরা আর অ্যাক্টিভ না থাকলে, LowLightBoostSession.release() কল করে কম আলোয় বুস্ট সেশন রিলিজ করুন। বিশেষ করে, আপনার অ্যাক্টিভিটি শেষ হয়ে গেলে সেশন রিলিজ করতে ভুলবেন না। আপনার অ্যাক্টিভিটির onDestroy() পদ্ধতিতে এই পদ্ধতি কল করে আপনি এটি করতে পারবেন:

Kotlin

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

এই কোড সম্পর্কে গুরুত্বপূর্ণ পয়েন্ট

  • সেশন রিলিজ হওয়ার পরে, আপনার এর কোনও পদ্ধতি কল করা উচিত নয়। সেশন পয়েন্ট করছে এমন যেকোনও ভেরিয়েবল আপনার মুছে দেওয়া উচিত, যেমন এই কোডটি করে।