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

গুগল লো লাইট বুস্ট চালু ও বন্ধ করতে একটি লো লাইট বুস্ট সেশন ব্যবহার করুন।

কোটলিন

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 services-এর com.google.android.gms.cameralowlight প্যাকেজের মাধ্যমে সরবরাহ করা হয়। Google Play services API-গুলো অ্যাক্সেস করার তথ্যের জন্য Google Play services-এর ডকুমেন্টেশন দেখুন।

একটি কলব্যাক অবজেক্ট তৈরি করুন

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

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

স্বল্প আলোর সেশন তৈরি করতে, 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");
    });

এই কোড সম্পর্কে মূল বিষয়গুলো

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

ক্যাপচারের ফলাফল পাস করুন।

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

কোটলিন

  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() কলব্যাকের ভিতরে আপনার এটি করা উচিত। নিম্নলিখিত কোডটি দেখায় কিভাবে ভিডিও ক্যাপচার করতে হয়:

কোটলিন

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

সেশনটি ছেড়ে দিন

ক্যামেরা যখন আর সক্রিয় থাকবে না, তখন LowLightBoostSession.release() কল করে লো লাইট বুস্ট সেশনটি রিলিজ করুন। বিশেষ করে, আপনার অ্যাক্টিভিটি ডেস্ট্রয় (dedestroy) হওয়ার সময় সেশনটি রিলিজ করা নিশ্চিত করতে হবে। আপনার অ্যাক্টিভিটির 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;
  }
}

এই কোড সম্পর্কে মূল বিষয়গুলো

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