प्रॉडक्ट से जुड़ी खबरें

एक से ज़्यादा सुविधाओं का इस्तेमाल करना: CameraX 1.5 की मदद से, कई सुविधाओं को एक साथ इस्तेमाल करने की गारंटी

छह मिनट में पढ़ें
Tahsin Masrur
सॉफ़्टवेयर इंजीनियर

आजकल के कैमरा ऐप्लिकेशन में, कई ऐसी सुविधाएं होती हैं जो एक-दूसरे से मिलती-जुलती हैं. उपयोगकर्ता चाहते हैं कि वे शानदार एचडीआर में वीडियो रिकॉर्ड कर पाएं, 60 एफ़पीएस पर फ़्लूड मोशन कैप्चर कर पाएं, और प्रीव्यू स्टेबलाइज़ेशन की मदद से बेहतरीन फ़ुटेज पा सकें. अक्सर, वे ये सभी काम एक साथ करना चाहते हैं.

डेवलपर के तौर पर, हम जानते हैं कि असलियत में यह प्रोसेस काफ़ी मुश्किल है. इस बात की पुष्टि कैसे की जा सकती है कि कोई डिवाइस, दिए गए कॉम्बिनेशन के साथ काम करता है? अब तक, एक साथ कई सुविधाओं को चालू करना अक्सर जोखिम भरा होता था. अलग-अलग सुविधाओं के लिए, यह देखा जा सकता है कि वे काम करती हैं या नहीं. हालांकि, उन्हें एक साथ इस्तेमाल करने पर, हो सकता है कि वे ठीक से काम न करें या कैमरा सेशन बंद हो जाए.  इस वजह से, डेवलपर को अपने ऐप्लिकेशन को कम से कम सिस्टम कॉन्फ़िगरेशन के साथ काम करने के लिए डिज़ाइन करना पड़ता है. इससे, बेहतर सिस्टम कॉन्फ़िगरेशन वाले डिवाइसों पर ऐप्लिकेशन इस्तेमाल करने वाले लोगों को बेहतरीन अनुभव नहीं मिल पाता.

उदाहरण के लिए, बहुत कम प्रीमियम डिवाइसों पर एचडीआर और 60 एफ़पीएस वीडियो एक साथ काम करते हैं. इसलिए, ज़्यादातर ऐप्लिकेशन एक साथ दोनों को चालू करने से बचते हैं, ताकि ज़्यादातर फ़ोन पर उपयोगकर्ताओं को खराब अनुभव न मिले.

इस समस्या को हल करने के लिए, हम CameraX में फ़ीचर ग्रुप लॉन्च कर रहे हैं. यह एक नया एपीआई है, जिसे इस समस्या को हल करने के लिए डिज़ाइन किया गया है. अब कैमरा कॉन्फ़िगर करने से पहले, यह क्वेरी की जा सकती है कि सुविधाओं का कोई खास कॉम्बिनेशन काम करता है या नहीं. इसके अलावा, CameraX को अपनी प्राथमिकताएं बताई जा सकती हैं. इससे CameraX, आपके लिए सबसे सही कॉम्बिनेशन को चालू कर देगा.

CameraX का इस्तेमाल पहली बार करने वाले लोगों के लिए

इससे पहले कि हम नई Feature Group API के बारे में जानें, आइए एक बार फिर से जान लें कि CameraX क्या है. CameraX, Jetpack की एक सपोर्ट लाइब्रेरी है. इसे कैमरा ऐप्लिकेशन को आसानी से डेवलप करने में आपकी मदद करने के लिए बनाया गया है. यह एक ऐसा एपीआई उपलब्ध कराता है जिसे इस्तेमाल करना आसान है और जो ज़्यादातर Android डिवाइसों पर काम करता है. साथ ही, यह Android 6.0 (एपीआई लेवल 23) के साथ भी काम करता है. अगर आपने CameraX का इस्तेमाल पहले कभी नहीं किया है, तो हम आपको आधिकारिक दस्तावेज़ पढ़ने और कोडलैब आज़माने का सुझाव देते हैं.

Feature Group API का इस्तेमाल करके क्या-क्या बनाया जा सकता है

अब आपको सुविधाओं के कॉम्बिनेशन के साथ एक्सपेरिमेंट करने की ज़रूरत नहीं है. साथ ही, आपको कैमरे से जुड़े बेहतरीन अनुभव देने में मदद मिलेगी. जैसे, एक साथ एचडीआर और 60 एफ़पीएस वीडियो की सुविधा, Pixel 10 Pro जैसे हार्डवेयर पर उपलब्ध है. साथ ही, यह सुविधा उन डिवाइसों पर काम नहीं करती जिन पर यह कॉम्बिनेशन काम नहीं करता.

unnamed.png

Pixel 10 Pro पर एचडीआर और 60 एफ़पीएस, दोनों सुविधाएं एक साथ चालू हैं

unnamed (1).png

किसी पुराने डिवाइस पर, एचडीआर और 60 एफ़पीएस (फ़्रेम प्रति सेकंड) की सुविधा एक साथ काम नहीं करती. इसलिए, एचडीआर की सुविधा चालू रहती है, जबकि 60 एफ़पीएस की सुविधा बंद हो जाती है.

Feature Group API की मदद से, ये काम किए जा सकते हैं:

  • ज़्यादा स्मार्ट और डाइनैमिक यूज़र इंटरफ़ेस (यूआई) बनाएं: हार्डवेयर की रीयल-टाइम सहायता के आधार पर, अपने यूज़र इंटरफ़ेस (यूआई) में सेटिंग को स्मार्ट तरीके से चालू या बंद करें. उदाहरण के लिए, अगर कोई उपयोगकर्ता एचडीआर की सुविधा चालू करता है, तो आपके पास 60 एफ़पीएस के विकल्प को तुरंत धूसर करने और बंद करने का विकल्प होता है. ऐसा तब किया जा सकता है, जब उस डिवाइस पर एचडीआर और 60 एफ़पीएस की सुविधा एक साथ काम न करती हो. 
unsupported-features-disabled.gif
  • "हाई क्वालिटी" मोड में भरोसेमंद तरीके से वीडियो डिलीवर करें: कैमरे को, प्राथमिकता के आधार पर चुनी गई सुविधाओं की सूची के साथ कॉन्फ़िगर करें. CameraX, किसी भी डिवाइस के लिए सबसे सही कॉम्बिनेशन को अपने-आप ढूंढता है और उसे चालू करता है. इससे यह पक्का होता है कि डिवाइस के हिसाब से जटिल लॉजिक के बिना भी बेहतरीन नतीजे मिलें.
  • कैमरा सेशन फ़ेल होने से रोकना: पहले से ही यह पुष्टि करके कि कैमरा सेशन के लिए ज़रूरी कॉन्फ़िगरेशन उपलब्ध है, कैमरे को ऐसे कॉन्फ़िगरेशन को कॉन्फ़िगर करने से रोका जा सकता है जो काम नहीं करता. इससे क्रैश होने की समस्या को कम किया जा सकता है और उपयोगकर्ताओं को बेहतर अनुभव दिया जा सकता है.

यह कैसे काम करता है: मुख्य कॉम्पोनेंट

नया एपीआई, SessionConfig और CameraInfo में किए गए मुख्य बदलावों पर आधारित है.

  1. GroupableFeature: इस एपीआई में, पहले से तय की गई ग्रुप की जा सकने वाली सुविधाओं का एक सेट शामिल है. जैसे, HDR_HLG10, FPS_60, PREVIEW_STABILIZATION, और IMAGE_ULTRA_HDR. कंप्यूटेशनल सीमाओं की वजह से, सिर्फ़ कुछ सुविधाओं को इस एपीआई की मदद से, ज़्यादा भरोसेमंद तरीके से ग्रुप किया जा सकता है. हम इस सूची को बड़ा करने के लिए लगातार काम कर रहे हैं. साथ ही, आने वाले समय में होने वाली रिलीज़ में, ज़्यादा सुविधाओं के लिए सहायता उपलब्ध कराएंगे.
     
  2. नए SessionConfig पैरामीटर: कैमरा सेशन शुरू करने के लिए इस्तेमाल की जाने वाली इस क्लास में, अब दो नए पैरामीटर इस्तेमाल किए जा सकते हैं:
    • requiredFeatureGroup: इसका इस्तेमाल उन सुविधाओं के लिए करें जिनके लिए कॉन्फ़िगरेशन को पूरा करने के लिए, ज़रूरी तौर पर सहायता मिलनी चाहिए. यह उन सुविधाओं के लिए सबसे सही है जिन्हें उपयोगकर्ता साफ़ तौर पर चालू करता है. जैसे, 'एचडीआर' स्विच को टॉगल करना. यह पक्का करने के लिए कि आपको एक जैसा अनुभव मिले, अगर अनुरोध किया गया कॉम्बिनेशन काम नहीं करता है, तो bindToLifecycle कॉल, IllegalArgumentException दिखाएगा. ऐसा इसलिए किया जाएगा, ताकि सुविधा के अनुरोध को अनदेखा न किया जाए. इस नतीजे के बारे में पहले से क्वेरी करने के लिए, CameraInfo#isFeatureGroupSupported एपीआई (नीचे दी गई जानकारी) का इस्तेमाल किया जाना चाहिए.
    • preferredFeatureGroup: इसका इस्तेमाल उन सुविधाओं के लिए करें जो ज़रूरी नहीं हैं, लेकिन काम की हैं. उदाहरण के लिए, जब आपको डिफ़ॉल्ट रूप से "हाई क्वालिटी" मोड लागू करना हो. आपको अपनी पसंद की सुविधाओं की एक सूची देनी होती है. यह सूची, आपकी प्राथमिकताओं के हिसाब से क्रम में होनी चाहिए. इसके बाद, CameraX अपने-आप सबसे ज़्यादा प्राथमिकता वाला ऐसा कॉम्बिनेशन चालू कर देता है जो डिवाइस के साथ काम करता है.
  3. CameraInfo#isFeatureGroupSupported(): यह मुख्य क्वेरी वाला तरीका है. इससे साफ़ तौर पर यह पता चलता है कि कोई सुविधा ग्रुप काम करता है या नहीं. यह तरीका, आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में, लोगों को सिर्फ़ काम करने वाली सुविधाओं के विकल्प दिखाने के लिए सबसे सही है. इसमें SessionConfig पास किया जाता है. इसके बाद, यह बूलियन वैल्यू दिखाता है कि कॉम्बिनेशन काम करता है या नहीं. अगर आपको किसी SessionConfig को ज़रूरी सुविधाओं के साथ बाइंड करना है, तो पहले इस एपीआई का इस्तेमाल करें. इससे यह पक्का किया जा सकेगा कि SessionConfig के साथ सुविधाएं काम करती हैं. 

असल में लागू करने का तरीका

आइए, इन कॉम्पोनेंट का इस्तेमाल करके, कैमरा इस्तेमाल करने का बेहतर अनुभव पाने का तरीका जानें.

पहला उदाहरण: "बेस्ट एफर्ट" हाई-क्वालिटी मोड

अगर आपको डिफ़ॉल्ट रूप से सबसे अच्छी सुविधाएं चालू करनी हैं, तो preferredFeatureGroup को प्राथमिकता के हिसाब से सूची दी जा सकती है. इस उदाहरण में, CameraX को HDR को प्राथमिकता देने के लिए कहा गया है. इसके बाद, 60 FPS और आखिर में, झलक को स्थिर करने की सुविधा को प्राथमिकता देने के लिए कहा गया है. CameraX, सभी संभावित कॉम्बिनेशन की जांच करने और डिवाइस के साथ काम करने वाले सबसे अच्छे कॉम्बिनेशन को चुनने की जटिलता को मैनेज करता है.

उदाहरण के लिए, अगर कोई डिवाइस एचडीआर और 60 एफ़पीएस को एक साथ हैंडल कर सकता है, लेकिन प्रीव्यू स्टेबलाइज़ेशन के साथ नहीं, तो CameraX पहले दो विकल्पों को चालू करेगा और तीसरे विकल्प को बंद कर देगा. इस तरह, आपको डिवाइस के हिसाब से मुश्किल जांच लिखे बिना, सबसे अच्छा अनुभव मिलता है.

cameraProvider.bindToLifecycle(

    lifecycleOwner,

    cameraSelector,

    SessionConfig(

        useCases = listOf(preview, videoCapture),

        // The order of features in this list determines their priority. 

        // CameraX will enable the best-supported combination based on these

        // priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.  

        preferredFeatureGroup =

           listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),

    ).apply {

        // (Optional) Get a callback with the enabled features

        // to update your UI. 

        setFeatureSelectionListener { selectedFeatures ->

            updateUiIndicators(selectedFeatures)

        }

    }

)

इस कोड स्निपेट के लिए, CameraX इन सुविधाओं के कॉम्बिनेशन को इस क्रम में चालू करने की कोशिश करेगा. साथ ही, वह उस कॉम्बिनेशन को चुनेगा जिसे डिवाइस पूरी तरह से सपोर्ट करता है:

  1. HDR + 60 FPS + प्रीव्यू स्टेबिलाइज़ेशन
  2. एचडीआर + 60 FPS
  3. एचडीआर + प्रीव्यू स्टेबलाइज़ेशन
  4. एचडीआर
  5. 60 FPS + प्रीव्यू स्टेबलाइज़ेशन
  6. 60 FPS (फ़्रेम प्रति सेकंड)
  7. स्टेबलाइज़ेशन की झलक देखें
  8. ऊपर दी गई कोई भी सुविधा नहीं

दूसरी स्थिति: रीऐक्टिव यूज़र इंटरफ़ेस (यूआई) बनाना

ऐसा यूज़र इंटरफ़ेस (यूआई) बनाने के लिए जो उपयोगकर्ता के चुने गए विकल्पों के हिसाब से काम करता हो और उपयोगकर्ताओं को ऐसी सुविधाओं के कॉम्बिनेशन को चुनने से रोकता हो जो काम नहीं करते हैं, सीधे तौर पर सहायता के लिए क्वेरी की जा सकती है. नीचे दिया गया फ़ंक्शन यह जांच करता है कि उपयोगकर्ता के मौजूदा विकल्पों के साथ कौनसी सुविधाएं काम नहीं करती हैं. इससे आपको यूज़र इंटरफ़ेस (यूआई) के उन एलिमेंट को बंद करने में मदद मिलती है.

/**

 * Returns a list of features that are NOT supported in combination

 * with the currently selected features.

 */

fun getUnsupportedFeatures(

    currentFeatures: Set<GroupableFeature>

): Set<GroupableFeature> {

    val unsupportedFeatures = mutableSetOf<GroupableFeature>()

    val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)


    // Iterate over every available feature option in your app. 

    appFeatureOptions.forEach { featureOption ->

        // Skip features the user has already selected. 

        if (currentFeatures.contains(featureOption)) return@forEach


        // Check if adding this new feature is supported. 

        val isSupported = cameraInfo.isFeatureGroupSupported(

            SessionConfig(

                useCases = useCases,

                // Check the new feature on top of existing ones.

                requiredFeatureGroup = currentFeatures + featureOption

            )

        )


        if (!isSupported) {

            unsupportedFeatures.add(featureOption)

        }

    }


    return unsupportedFeatures

}

इसके बाद, इस लॉजिक को अपने ViewModel या यूज़र इंटरफ़ेस (यूआई) कंट्रोलर में शामिल किया जा सकता है. इससे उपयोगकर्ता के इनपुट पर प्रतिक्रिया दी जा सकेगी और कैमरे को ऐसे कॉन्फ़िगरेशन के साथ फिर से बाइंड किया जा सकेगा जो काम करता है.

// Invoked when user turns some feature on/off.

fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {

    // Identify features that are unsupported with the current selection.

    val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)



    // Update app UI so that users can't enable them.

    updateDisabledFeatures(unsupportedFeatures)



    // Since the UI now only allows selecting supported feature combinations, 

    // `currentFeatures` is always valid. This allows setting

    // `requiredFeatureGroup` directly, without needing to re-check for

    // support or set a feature selection listener.  

    cameraProvider.bindToLifecycle(

        lifecycleOwner,

        cameraSelector,

        SessionConfig(

            useCases = listOf(preview, videoCapture),

            requiredFeatureGroup = currentFeatures,

        )

    )

}

इन कॉन्सेप्ट को काम करने वाले ऐप्लिकेशन में देखने के लिए, हमारे इंटरनल टेस्ट ऐप्लिकेशन को एक्सप्लोर करें. इसमें ऊपर बताए गए "बेस्ट एफर्ट" और "रिएक्टिव यूआई" दोनों ही स्थितियों को पूरी तरह से लागू किया गया है.

कृपया ध्यान दें: यह एक टेस्ट ऐप्लिकेशन है. यह आधिकारिक तौर पर उपलब्ध सैंपल नहीं है. यह Feature Group API के लिए एक बेहतरीन रेफ़रंस है. हालांकि, इसे प्रोडक्शन के लिए इस्तेमाल करने के हिसाब से बेहतर नहीं बनाया गया है.

आज ही शुरू करें

Feature Group API की मदद से, कैमरे की ऐडवांस सुविधाओं का इस्तेमाल आसानी से किया जा सकता है. सुविधा के साथ काम करने वाले डिवाइसों के बारे में क्वेरी करने का एक तय तरीका उपलब्ध कराने से, ज़्यादा बेहतर और भरोसेमंद कैमरा ऐप्लिकेशन बनाए जा सकते हैं.

यह एपीआई, CameraX 1.5 में एक्सपेरिमेंट के तौर पर उपलब्ध है. इसे 1.6 वर्शन में पूरी तरह से स्टेबल कर दिया जाएगा. साथ ही, इसमें और भी सुधार किए जाएंगे और इसे ज़्यादा डिवाइसों पर इस्तेमाल किया जा सकेगा.

ज़्यादा जानने के लिए, आधिकारिक दस्तावेज़ देखें. हमें आपका कॉन्टेंट देखने का बेसब्री से इंतज़ार रहेगा. साथ ही, हमें आपके सुझाव/राय का इंतज़ार रहेगा. अगर आपकी कोई शिकायत है, तो भी हमें ज़रूर बताएं! अगर आपके पास कोई सुझाव या राय है या आपको किसी समस्या की शिकायत करनी है, तो कृपया हमें बताएं. इसके लिए, यहां दिए गए तरीकों का इस्तेमाल करें:

इसे लिखा है:

पढ़ना जारी रखें