একটি 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 (পরবর্তী মিডিয়া আইটেম): ডিফল্ট শুরুর অবস্থান থেকে ৩০০০ মিলিসেকেন্ড (৩ সেকেন্ড) পর লোড হবে।
  • সূচক n-1 (পূর্ববর্তী মিডিয়া আইটেম): ডিফল্ট শুরুর অবস্থান থেকে 1000 মিলিসেকেন্ড (1 সেকেন্ড) পরে লোড হবে।
  • n-2 থেকে n+2 পরিসরের অন্যান্য মিডিয়া আইটেম: PreloadStatus.TRACKS_SELECTED ফেরত দিন।
  • n-4 থেকে n+4 পরিসরের অন্যান্য মিডিয়া আইটেম: PreloadStatus.SOURCE_PREPARED ফেরত দিন।
  • অন্যান্য সকল মিডিয়া আইটেমের জন্য null রিটার্ন করুন।

class MyTargetPreloadStatusControl(var currentPlayingIndex: Int = 0) :
  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.PRELOAD_STATUS_TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_SOURCE_PREPARED
    }
    return DefaultPreloadManager.PreloadStatus.PRELOAD_STATUS_NOT_PRELOADED
  }
}

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

  • প্রিলোড ম্যানেজার বিল্ডার তৈরি করার সময় আপনি 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 ব্যবহার করবেন।