প্রোডাক্ট সংক্রান্ত খবর

সিঙ্গেল ফিচারের বাইরে: CameraX 1.5-এর সাথে ফিচার কম্বিনেশনের গ্যারান্টি দেওয়া

৬ মিনিট লাগবে
তাহসিন মাসরুরের প্রোফাইল দেখুন
Tahsin Masrur সফ্টওয়্যার ইঞ্জিনিয়ার

আধুনিক ক্যামেরা অ্যাপে শক্তিশালী, ওভারল্যাপ করা ফিচার থাকে। ব্যবহারকারীরা আশা করেন যে তারা অত্যাশ্চর্য HDR সহ ভিডিও রেকর্ড করতে পারবেন, ৬০ FPS-এ ফ্লুইড মোশন ক্যাপচার করতে পারবেন এবং প্রিভিউ স্টেবিলাইজেশন সহ মাখনের মতো মসৃণ ফুটেজ পাবেন—প্রায়শই সব একই সাথে।

ডেভেলপার হিসেবে আমরা জানি যে বাস্তব পরিস্থিতি আরও জটিল। আপনি কীভাবে গ্যারান্টি দিতে পারেন যে কোনও নির্দিষ্ট ডিভাইস আসলে প্রদত্ত কম্বিনেশনকে সাপোর্ট করে? এখনও পর্যন্ত, একাধিক ফিচার চালু করা প্রায়শই একটি জুয়া ছিল। আপনি স্বতন্ত্র ফিচার কাজ করছে কিনা তা চেক করতে পারেন, তবে সেগুলি একত্রিত করলে তা অনির্ধারিত আচরণ বা আরও খারাপ, ক্যামেরা সেশন ব্যর্থ হতে পারে।এই অনিশ্চয়তার কারণে ডেভেলপাররা রক্ষণশীল হতে বাধ্য হন, যার ফলে উপযুক্ত ডিভাইসের ব্যবহারকারীরাও সেরা অভিজ্ঞতা থেকে বঞ্চিত হন।

যেমন, খুব কম প্রিমিয়াম ডিভাইসে HDR ও ৬০ FPS ভিডিও একসাথে ভালভাবে চলে। ফলস্বরূপ, বেশিরভাগ অ্যাপই একসাথে দুটি চালু করা এড়িয়ে যায় যাতে বেশিরভাগ ফোনে ব্যবহারকারীর অভিজ্ঞতা খারাপ না হয়।

এই সমস্যার সমাধান করতে, আমরা CameraX-এ ফিচার গ্রুপ নিয়ে আসছি - এটি একটি নতুন API যা এই অনুমান করার প্রয়োজনীয়তা দূর করার জন্য ডিজাইন করা হয়েছে। আপনি এখন ক্যামেরা কনফিগার করার আগে ফিচারগুলির একটি নির্দিষ্ট কম্বিনেশন কাজ করে কিনা তা জিজ্ঞাসা করতে পারেন, অথবা CameraX-কে আপনার পছন্দগুলি জানাতে পারেন এবং এটি আপনার জন্য সেরা-সমর্থিত কম্বিনেশন চালু করতে পারে।

যারা CameraX-এ নতুন তাদের জন্য

নতুন ফিচার গ্রুপ API সম্পর্কে বিস্তারিত জানার আগে, CameraX কী তা সংক্ষেপে জেনে নেওয়া যাক। CameraX হল একটি Jetpack সাপোর্ট লাইব্রেরি, যা ক্যামেরা অ্যাপ ডেভেলপমেন্টের কাজ সহজ করার জন্য তৈরি করা হয়েছে। এটি একটি সামঞ্জস্যপূর্ণ এবং সহজে ব্যবহারযোগ্য API সারফেস প্রদান করে যা বেশিরভাগ Android ডিভাইস জুড়ে কাজ করে, Android 6.0 (API লেভেল 23) এর সাথে ব্যাকওয়ার্ড-কম্প্যাটিবিলিটি সহ। আপনি CameraX-এ নতুন হলে, শুরু করার জন্য অফিসিয়াল ডকুমেন্টেশন চেক করে কোডল্যাব ব্যবহার করে দেখার সাজেশন দেওয়া হচ্ছে।

Feature Group API-এর সাহায্যে আপনি কী তৈরি করতে পারবেন

আপনাকে আর ফিচার কম্বিনেশন নিয়ে জুয়া খেলতে হবে না এবং আপনি আত্মবিশ্বাসের সাথে সেরা সম্ভাব্য ক্যামেরা অভিজ্ঞতা প্রদান করতে পারবেন – যেমন উপযুক্ত হার্ডওয়্যারে (যেমন, Pixel 10 Pro) একই সাথে HDR এবং ৬০ FPS ভিডিও – এবং যেসব ডিভাইস এই কম্বিনেশন সাপোর্ট করে না সেগুলিতে ত্রুটি এড়াতে পারবেন।

unnamed.png
Pixel 10 Pro-তে HDR ও ৬০ FPS একসাথে চালু করা
unnamed (1).png
পুরনো ডিভাইসে যেখানে HDR এবং ৬০ FPS একসাথে চালানো যায় না, সেখানে ৬০ FPS বিকল্প বন্ধ করে শুধু HDR চালু করা হয়।

ফিচার গ্রুপ API-এর সাহায্যে আপনি এগুলি করতে পারবেন:

  • আরও স্মার্ট, ডায়নামিক UI তৈরি করুন: রিয়েল-টাইম হার্ডওয়্যার সাপোর্টের ভিত্তিতে আপনার UI-তে বুদ্ধিমত্তার সাথে সেটিংস চালু বা বন্ধ করুন। যেমন, কোনও ব্যবহারকারী HDR চালু করলে, আপনি সাথে সাথে ৬০ FPS বিকল্পটি ধূসর করে দিতে এবং বন্ধ করতে পারেন, যদি সেই ডিভাইসে এই কম্বিনেশন কাজ না করে। 
hdr.gif
  • একটি নির্ভরযোগ্য "হাই-কোয়ালিটি" মোড প্রদান করা: পছন্দসই ফিচারের একটি অগ্রাধিকারপ্রাপ্ত তালিকার সাথে ক্যামেরা কনফিগার করুন। CameraX অটোমেটিক যেকোনও ডিভাইসের জন্য সবচেয়ে ভাল কাজ করে এমন কম্বিনেশন খুঁজে নিয়ে চালু করে দেয়, যার ফলে জটিল, ডিভাইস-নির্দিষ্ট লজিক ছাড়াই দারুণ ফলাফল পাওয়া যায়।
  • ক্যামেরা সেশন ব্যর্থ হওয়া আটকানো: আগে থেকে সাপোর্ট যাচাই করে, আপনি ক্যামেরাকে একটি অসমর্থিত কম্বিনেশন কনফিগার করার চেষ্টা করা থেকে বিরত করেন, ক্র্যাশ হওয়ার একটি সাধারণ কারণ দূর করেন এবং একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতা প্রদান করেন।

এটি কীভাবে কাজ করে: মূল কম্পোনেন্ট

নতুন API-তে SessionConfig এবং CameraInfo-তে মূল সংযোজনের উপর জোর দেওয়া হয়েছে।

  1. GroupableFeature: এই API, আগে থেকে সংজ্ঞায়িত গ্রুপে ভাগ করা যায় এমন ফিচারের সেট নিয়ে আসে, যেমন HDR_HLG10, FPS_60, PREVIEW_STABILIZATION এবং IMAGE_ULTRA_HDR। কম্পিউটেশনাল সীমাবদ্ধতার কারণে, এই API-এর প্রদান করা উচ্চ মাত্রার নির্ভরযোগ্যতার সাথে শুধুমাত্র নির্দিষ্ট কিছু ফিচার গ্রুপ করা যেতে পারে। আমরা এই তালিকা আরও বড় করার জন্য সক্রিয়ভাবে কাজ করছি এবং ভবিষ্যতে রিলিজের সময় আরও ফিচারের জন্য সহায়তা প্রদান করব।
     
  2. নতুন SessionConfig প্যারামিটার: ক্যামেরা সেশন শুরু করার জন্য ব্যবহৃত এই ক্লাসটি এখন দুটি নতুন প্যারামিটার গ্রহণ করে:
    • requiredFeatureGroup: কনফিগারেশন সফল করার জন্য অবশ্যই কাজ করতে হবে এমন ফিচারের জন্য এটি ব্যবহার করুন - ব্যবহারকারী স্পষ্টভাবে চালু করেন এমন ফিচারের জন্য আদর্শ, যেমন 'HDR' সুইচ টগল করা। নির্ধারক ও সামঞ্জস্যপূর্ণ অভিজ্ঞতা নিশ্চিত করতে, অনুরোধ করা কম্বিনেশন কাজ না করলে, bindToLifecycle কল IllegalArgumentException থ্রো করবে, ফিচার অনুরোধকে নীরবে উপেক্ষা করবে না। এই ফলাফল আগে থেকে কোয়েরি করার জন্য CameraInfo#isFeatureGroupSupported API (নিচে বিবরণ দেওয়া আছে) ব্যবহার করা উচিত।
    • preferredFeatureGroup: এটি এমন ফিচারের জন্য ব্যবহার করুন যা বাঞ্ছনীয় হলেও ঐচ্ছিক, যেমন আপনি যখন ডিফল্ট "হাই-কোয়ালিটি" মোড প্রয়োগ করতে চান। আপনি নিজের পছন্দের ফিচারের তালিকা আপনার অগ্রাধিকার অনুযায়ী সাজিয়ে প্রদান করেন এবং CameraX অটোমেটিক সবচেয়ে বেশি অগ্রাধিকারের কম্বিনেশন চালু করে যা ডিভাইস সাপোর্ট করে।
  3. CameraInfo#isFeatureGroupSupported(): এটি হল ফিচার গ্রুপ কাজ করে কিনা তা স্পষ্টভাবে চেক করার জন্য মূল কোয়েরি পদ্ধতি, যা আপনার অ্যাপ UI-তে ব্যবহারকারীদের শুধুমাত্র কাজ করে এমন ফিচার বিকল্প প্রদান করার জন্য উপযুক্ত। আপনি এটিতে একটি SessionConfig পাস করেন এবং এটি একটি বুলিয়ান রিটার্ন করে যা নির্দেশ করে যে কম্বিনেশনটি কাজ করে কিনা। আপনি যদি প্রয়োজনীয় ফিচার সহ SessionConfig বাইন্ড করতে চান, তাহলে এটি কাজ করে কিনা তা নিশ্চিত করতে প্রথমে এই API ব্যবহার করা উচিত। 

প্রয়োগের পদ্ধতি

আরও ভালো ক্যামেরা অভিজ্ঞতা তৈরি করতে কীভাবে এইসব কম্পোনেন্ট ব্যবহার করতে হয় তা দেখা যাক।

পরিস্থিতি ১: "সেরা প্রচেষ্টা" খুব ভাল কোয়ালিটি মোড

আপনি যদি ডিফল্ট হিসেবে সম্ভাব্য সেরা ফিচার চালু করতে চান, তাহলে preferredFeatureGroup-কে অগ্রাধিকারের ভিত্তিতে একটি তালিকা দিতে পারেন। এই উদাহরণে, আমরা CameraX-কে প্রথমে HDR, তারপর ৬০ FPS এবং শেষে প্রিভিউ স্টেবিলাইজেশনকে অগ্রাধিকার দিতে বলি। CameraX সমস্ত সম্ভাব্য কম্বিনেশন চেক করার জটিলতা এবং ডিভাইসে কাজ করে এমন সেরাটি বেছে নেওয়ার কাজটি করে।

যেমন, কোনও ডিভাইস যদি HDR ও ৬০ FPS একসাথে ম্যানেজ করতে পারে, কিন্তু প্রিভিউ স্টেবিলাইজেশন সহ নয়, তাহলে 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 + ৬০ FPS + প্রিভিউ স্টেবিলাইজেশন
  2. HDR + ৬০ FPS
  3. HDR + প্রিভিউ স্টেবিলাইজেশন
  4. HDR
  5. ৬০ FPS + প্রিভিউ স্টেবিলাইজেশন
  6. ৬০ FPS
  7. প্রিভিউ স্টেবিলাইজেশন
  8. উপরের কোনও ফিচারই নয়

পরিস্থিতি ২: রিঅ্যাক্টিভ UI তৈরি করা

ব্যবহারকারীর বেছে নেওয়া বিকল্পের ভিত্তিতে কাজ করে এবং কাজ করে না এমন ফিচার কম্বিনেশন বেছে নেওয়া থেকে ব্যবহারকারীকে আটকায়, এমন UI তৈরি করতে, আপনি সরাসরি সহায়তা সংক্রান্ত কোয়েরি করতে পারেন। নিচের ফাংশনটি চেক করে যে কোন ফিচারগুলি ব্যবহারকারীর বর্তমান পছন্দের সাথে বেমানান, যা আপনাকে সংশ্লিষ্ট UI এলিমেন্টগুলি বন্ধ করার অনুমতি দেয়।

/**

 * 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 বা UI কন্ট্রোলারে ওয়্যার করতে পারবেন।

// 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,

        )

    )

}

কোনও অ্যাপে এইসব ধারণা কীভাবে কাজ করে তা দেখতে, আমাদের ইন্টার্নাল টেস্ট অ্যাপ এক্সপ্লোর করতে পারেন। উপরে আলোচনা করা "সর্বোচ্চ চেষ্টা" ও "প্রতিক্রিয়াশীল UI" উভয় পরিস্থিতির সম্পূর্ণ প্রয়োগ এটি প্রদান করে।

মনে রাখবেন: এটি একটি টেস্ট অ্যাপ্লিকেশন এবং অফিসিয়ালি সমর্থিত স্যাম্পেল নয়। ফিচার গ্রুপ API-এর জন্য এটি একটি দুর্দান্ত রেফারেন্স হলেও, প্রোডাকশন ব্যবহারের জন্য এটি এখনও সম্পূর্ণভাবে প্রস্তুত নয়।

আজই শুরু করুন

ফিচার গ্রুপ API উন্নত ক্যামেরা ক্ষমতার সাথে কাজ করার অস্পষ্টতা দূর করে। ফিচার সংক্রান্ত সহায়তা পাওয়ার জন্য কোয়েরি করার একটি নির্ধারক উপায় প্রদান করে, আপনি আত্মবিশ্বাসের সাথে আরও শক্তিশালী এবং নির্ভরযোগ্য ক্যামেরা অ্যাপ তৈরি করতে পারবেন।

API-টি CameraX 1.5-এ পরীক্ষামূলকভাবে উপলভ্য এবং 1.6 রিলিজে সম্পূর্ণভাবে স্টেবল হওয়ার জন্য শিডিউল করা হয়েছে, সাথে আরও সহায়তা এবং উন্নতি করা হচ্ছে।

আরও জানতে, অফিসিয়াল ডকুমেন্টেশন দেখুন। আপনি কী তৈরি করেন তা দেখার জন্য আমরা উৎসুক এবং আপনার মতামতের অপেক্ষায় রইলাম। নিম্নলিখিত চ্যানেলের মাধ্যমে আপনার ভাবনা শেয়ার করুন এবং কোনও সমস্যা হলে তা জানান:

লিখেছেন:
পড়া চালিয়ে যান