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

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

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

DefaultPreloadManager এর একটি উদাহরণ তৈরি করার জন্য তিনটি ধাপ রয়েছে:

  • একটি TargetPreloadStatusControl সংজ্ঞায়িত করুন যা প্রিলোড ম্যানেজার মিডিয়া আইটেমটি লোড করার জন্য প্রস্তুত কিনা এবং কতটা লোড করতে হবে তা জানতে অনুসন্ধান করতে পারে৷
  • বিল্ডার তৈরি করুন যা আপনি প্রিলোড ম্যানেজার তৈরি করতে এবং আপনার অ্যাপের ExoPlayer অবজেক্ট তৈরি করতে ব্যবহার করবেন।
  • বিল্ডারের build() পদ্ধতিতে কল করে প্রিলোড ম্যানেজার তৈরি করতে বিল্ডার ব্যবহার করুন।

একটি লক্ষ্য প্রিলোড স্থিতি নিয়ন্ত্রণ তৈরি করুন

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

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

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

  • ইনডেক্স n+1 (পরবর্তী মিডিয়া আইটেম): ডিফল্ট শুরু অবস্থান থেকে 3000 ms (3 সেকেন্ড) লোড করুন
  • সূচক n-1 (আগের মিডিয়া আইটেম): ডিফল্ট শুরু অবস্থান থেকে 1000 ms (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()

কোড সম্পর্কে মূল পয়েন্ট