कम रोशनी वाले मोड का इस्तेमाल करना

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

Groovy

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 इंटरफ़ेस को लागू करता हो. जब सेशन डिसकनेक्ट हो जाता है या खत्म हो जाता है, तब इस ऑब्जेक्ट के फ़ंक्शन कॉल किए जाते हैं. नीचे दिए गए कोड में, कॉलबैक बनाने का तरीका बताया गया है:

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

Java

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

Java

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() में पास करें. इस ऑब्जेक्ट में, target surface, इस्तेमाल किए जाने वाले कैमरे का आईडी, और प्रीव्यू के डाइमेंशन जैसी चीज़ों के बारे में बताया जाता है.
  • इस कोड में यह माना गया है कि आपने पहले ही Camera2 कैमरे से कनेक्शन खोल लिया है. साथ ही, आपने उस जानकारी का इस्तेमाल करके cameraId, previewWidth, previewHeight की वैल्यू सेट कर ली हैं. ज़्यादा जानकारी के लिए, Camera2 का दस्तावेज़ देखें.
  • enableLowLightBoost एक बूलियन वैल्यू है. इससे यह तय होता है कि कम रोशनी में चमक बढ़ाने की सुविधा चालू होनी चाहिए या बंद.
  • createLowLightBoostCallback एक ऐसा तरीका है जिसका इस्तेमाल कॉलबैक ऑब्जेक्ट बनाने के लिए किया जाता है. जब सेशन डिसकनेक्ट हो जाता है या बंद हो जाता है, तब इस ऑब्जेक्ट को कॉल किया जाता है.
  • LowLightBoostClient.createSession() वाला तरीका, Task ऑब्जेक्ट दिखाता है. इस ऑब्जेक्ट का इस्तेमाल, सफलता और गड़बड़ी के बारे में सूचना देने वाले लिसनर सेट अप करने के लिए किया जाता है. सफलता के बारे में बताने वाले लिसनर में वीडियो कैप्चर करें.
  • लिसनर को चलाने के लिए, Executor तय किया जा सकता है. अगर आपने Executor के बारे में नहीं बताया है, तो लिसनर मुख्य थ्रेड पर चलते हैं. इस कोड में, हम मान लेते हैं कि lowLightBoostExecutor एक सही Executor है.

कैप्चर किए गए नतीजे पास करना

Google Low Light Boost को कुछ कैमरे के मेटाडेटा की ज़रूरत होती है, ताकि वह यह जान सके कि फ़ोटो को कितना ज़्यादा चमकदार बनाना है. आपको processCaptureResult() तरीके में TotalCaptureResult पास करना होगा. आपको onCaptureCompleted() कॉलबैक फ़ंक्शन में TotalCaptureResult मिल सकता है.

Kotlin

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

Java

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

Java

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() तरीके में मौजूद इस तरीके को कॉल करें:

Kotlin

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

Java

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

इस कोड के बारे में खास जानकारी

  • सेशन बंद होने के बाद, आपको इसके किसी भी तरीके को कॉल नहीं करना चाहिए. आपको सेशन की ओर इशारा करने वाले सभी वैरिएबल हटाने चाहिए. जैसे, यह कोड करता है.