একটি DefaultPreloadManager তৈরি এবং কনফিগার করুন

এই পৃষ্ঠাটি বর্ণনা করে কিভাবে একটি DefaultPreloadManager তৈরি করবেন, যা আপনার পছন্দের কৌশলের উপর ভিত্তি করে আপনার অ্যাপের জন্য মিডিয়া কন্টেন্ট প্রিলোড করে।

BasePreloadManager অ্যাবস্ট্রাক্ট ক্লাসের উপর ভিত্তি করে প্রিলোড ম্যানেজার আপনাকে আপনার পছন্দের মানদণ্ড অনুসারে কন্টেন্ট র‍্যাঙ্ক করতে দেয়। এই ডকুমেন্টটি ব্যাখ্যা করে যে কীভাবে ডেরিভেটিভ ক্লাস DefaultPreloadManager ব্যবহার করতে হয়, যেখানে প্রতিটি মিডিয়া আইটেমকে একটি পূর্ণসংখ্যা দিয়ে র‍্যাঙ্ক করা হয় যা একটি তালিকায় তার অবস্থান উপস্থাপন করে (উদাহরণস্বরূপ, একটি ভিডিও ক্যারোজেলে এর অবস্থান)। প্রিলোড ম্যানেজার ব্যবহারকারী বর্তমানে যে আইটেমটি চালাচ্ছেন তার কতটা কাছাকাছি তার উপর ভিত্তি করে আইটেমগুলি লোড করাকে অগ্রাধিকার দেয়। এইভাবে, যদি কোনও ব্যবহারকারী অন্য আইটেমে চলে যায়, তাহলে নতুন আইটেমটি তাৎক্ষণিকভাবে প্লে করা শুরু করতে পারে।

DefaultPreloadManager এর একটি ইনস্ট্যান্স তৈরি করার জন্য তিনটি ধাপ রয়েছে:

একটি টার্গেট প্রিলোড স্ট্যাটাস কন্ট্রোল তৈরি করুন

যখন আপনি DefaultPreloadManager.Builder তৈরি করবেন, তখন আপনি এটিকে আপনার সংজ্ঞায়িত একটি টার্গেট প্রিলোড স্ট্যাটাস কন্ট্রোল অবজেক্ট পাস করবেন। এই অবজেক্টটি TargetPreloadStatusControl ইন্টারফেস প্রয়োগ করে। যখন প্রিলোড ম্যানেজার মিডিয়া প্রিলোড করার জন্য প্রস্তুত হয়, তখন এটি আপনার স্ট্যাটাস কন্ট্রোলের getTargetPreloadStatus() পদ্ধতিতে কল করে কত কন্টেন্ট লোড করতে হবে তা জানতে পারে। স্ট্যাটাস কন্ট্রোল এই স্ট্যাটাস কোডগুলির একটি দিয়ে উত্তর দিতে পারে:

  • STAGE_SPECIFIED_RANGE_LOADED : প্রিলোড ম্যানেজারকে নির্দিষ্ট শুরুর অবস্থান থেকে এবং নির্দিষ্ট সময়কালের জন্য (মিলিসেকেন্ডে দেওয়া) কন্টেন্ট লোড করতে হবে।
  • STAGE_TRACKS_SELECTED : প্রিলোড ম্যানেজারের কন্টেন্ট ট্র্যাকের তথ্য লোড এবং প্রক্রিয়া করা উচিত এবং ট্র্যাকগুলি নির্বাচন করা উচিত। প্রিলোড ম্যানেজারের এখনও কন্টেন্ট লোড করা শুরু করা উচিত নয়।
  • STAGE_SOURCE_PREPARED : প্রিলোড ম্যানেজারের উচিত কন্টেন্ট সোর্স প্রস্তুত করা। উদাহরণস্বরূপ, যদি কন্টেন্টের মেটাডেটা একটি পৃথক ম্যানিফেস্ট ফাইলে থাকে, তাহলে প্রিলোড ম্যানেজার সেই ম্যানিফেস্টটি আনতে এবং পার্স করতে পারে।
  • null : প্রিলোড ম্যানেজারের সেই মিডিয়া আইটেমের জন্য কোনও সামগ্রী বা মেটাডেটা লোড করা উচিত নয়।

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

  • সূচক n+1 (পরবর্তী মিডিয়া আইটেম): ডিফল্ট শুরুর অবস্থান থেকে 3000 মিলিসেকেন্ড (3 সেকেন্ড) লোড করুন
  • সূচক n-1 (পূর্ববর্তী মিডিয়া আইটেম): ডিফল্ট শুরুর অবস্থান থেকে 1000 মিলিসেকেন্ড (1 সেকেন্ড) লোড করুন
  • n-2 থেকে n+2 পরিসরের অন্যান্য মিডিয়া আইটেম: PreloadStatus.TRACKS_SELECTED রিটার্ন করুন
  • n-4 থেকে n+4 রেঞ্জের অন্যান্য মিডিয়া আইটেম: PreloadStatus.SOURCE_PREPARED রিটার্ন করুন
  • অন্যান্য সকল মিডিয়া আইটেমের জন্য, null রিটার্ন করুন

class MyTargetPreloadStatusControl(
    currentPlayingIndex: Int = C.INDEX_UNSET
) : TargetPreloadStatusControl<Int, DefaultPreloadManager.PreloadStatus> {

    override fun getTargetPreloadStatus(index: Int): DefaultPreloadManager.PreloadStatus? {
        if (index - currentPlayingIndex == 1) { // next track
            // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
            // suggest loading 3000ms from the default start position
            return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
        } else if (index - currentPlayingIndex == -1) { // previous track
            // return a PreloadStatus that is labelled by STAGE_SPECIFIED_RANGE_LOADED and
            // suggest loading 3000ms from the default start position
            return DefaultPreloadManager.PreloadStatus.specifiedRangeLoaded(3000L)
        } else if (abs(index - currentPlayingIndex) == 2) {
            // return a PreloadStatus that is labelled by STAGE_TRACKS_SELECTED
            return DefaultPreloadManager.PreloadStatus.TRACKS_SELECTED
        } else if (abs(index - currentPlayingIndex) <= 4) {
            // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
            return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
        }
        return null
    }
}

কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ

  • আপনি যখন MyTargetPreloadStatusControl তৈরি করবেন তখন প্রিলোড ম্যানেজার বিল্ডারকে এর একটি উদাহরণ দেবেন।
  • currentPlayingIndex বর্তমানে যে মিডিয়া আইটেমটি চলছে তার সূচী ধারণ করে। অ্যাপটির কাজ হল সেই মানটি আপডেট রাখা।
  • যখন প্রিলোড ম্যানেজার কন্টেন্ট লোড করার জন্য প্রস্তুত থাকে, তখন এটি getTargetPreloadStatus কল করে এবং সংশ্লিষ্ট মিডিয়া আইটেমের জন্য আপনার নির্দিষ্ট করা র‍্যাঙ্কিং তথ্য পাস করে। DefaultPreloadManager এর ক্ষেত্রে, সেই র‍্যাঙ্কিং তথ্যটি একটি পূর্ণসংখ্যা, যা একটি ক্যারোসেলে আইটেমের অবস্থান নির্দিষ্ট করে। পদ্ধতিটি বর্তমানে নির্বাচিত আইটেমের ইনডেক্সের সাথে সেই ইনডেক্সের তুলনা করে কোন কোডটি ফেরত পাঠাবে তা নির্বাচন করে।

প্রিলোড ম্যানেজার তৈরি করুন

আপনার প্রিলোড ম্যানেজার তৈরি করতে, আপনার একটি DefaultPreloadManager.Builder প্রয়োজন। এই বিল্ডারটি বর্তমান প্রেক্ষাপট এবং অ্যাপের টার্গেট প্রিলোড স্ট্যাটাস কন্ট্রোলের সাথে কনফিগার করা হয়েছে। বিল্ডারটি সেটার পদ্ধতিও প্রদান করে যা আপনি প্রিলোড ম্যানেজারের কাস্টম উপাদান সেট করতে ব্যবহার করতে পারেন।

প্রিলোড ম্যানেজার তৈরি করার জন্য বিল্ডার ব্যবহার করার পাশাপাশি, আপনি এটি আপনার অ্যাপের কন্টেন্ট চালানোর জন্য ব্যবহৃত ExoPlayer অবজেক্ট তৈরি করতেও ব্যবহার করবেন।

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder =
    DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

কোড সম্পর্কে গুরুত্বপূর্ণ বিষয়সমূহ

  • MyTargetPreloadStatusControl হল সেই ক্লাস যা আপনি Create a target preload status control এ সংজ্ঞায়িত করেছেন।
  • আপনি ExoPlayer অবজেক্ট তৈরি করতে একই DefaultPreloadManager.Builder ব্যবহার করবেন যা সেই প্রিলোড ম্যানেজার দ্বারা পরিচালিত কন্টেন্ট চালাবে।