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

एक से ज़्यादा सुविधाओं का इस्तेमाल करना: CameraX 1.5 के साथ सुविधाओं के कॉम्बिनेशन का इस्तेमाल करना

पढ़ने में 6 मिनट लगेंगे
तस्नीम मसरूर की प्रोफ़ाइल देखें
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 एफ़पीएस की सुविधा काम न करती हो. 
hdr.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 को ज़रूरी सुविधाओं के साथ बाइंड करना है, तो आपको पहले इस एपीआई का इस्तेमाल करना चाहिए. इससे यह पक्का किया जा सकेगा कि के साथ उन सुविधाओं का इस्तेमाल किया जा सकता है. 

लागू करने का तरीका

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

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

अगर आपको डिफ़ॉल्ट रूप से सबसे अच्छी सुविधाएं चालू करनी हैं, तो 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. एचडीआर + 60 एफ़पीएस + प्रीव्यू स्टेबलाइज़ेशन
  2. एचडीआर + 60 फ़्रेम प्रति सेकंड
  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 वर्शन में पूरी तरह से स्टेबल कर दिया जाएगा. साथ ही, इसमें और भी सुधार किए जाएंगे और इसे बेहतर तरीके से इस्तेमाल किया जा सकेगा.

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

लेखक:
पढ़ना जारी रखें