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

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

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

इसे लिखा है:

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