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

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

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

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

  • একটি TargetPreloadStatusControl নির্ধারণ করুন, যার মাধ্যমে প্রিলোড ম্যানেজার জানতে পারবে যে মিডিয়া আইটেমটি লোড হওয়ার জন্য প্রস্তুত কিনা এবং কী পরিমাণে লোড করতে হবে।
  • সেই বিল্ডারটি তৈরি করুন যা আপনি প্রিলোড ম্যানেজার এবং আপনার অ্যাপের ExoPlayer অবজেক্টগুলো তৈরি করতে ব্যবহার করবেন।
  • বিল্ডারের build() মেথড কল করে প্রিলোড ম্যানেজার তৈরি করুন।

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

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

  • STAGE_SPECIFIED_RANGE_LOADED : প্রিলোড ম্যানেজার নির্দিষ্ট প্রারম্ভিক অবস্থান থেকে এবং নির্দিষ্ট সময়কালের (মিলিসেকেন্ডে প্রদত্ত) জন্য প্লেয়ারের ইন-মেমরি বাফারে কন্টেন্ট লোড করবে।
  • STAGE_SPECIFIED_RANGE_CACHED : প্রিলোড ম্যানেজার নির্দিষ্ট শুরুর অবস্থান থেকে এবং নির্দিষ্ট সময়কালের (মিলিসেকেন্ডে প্রদত্ত) জন্য কন্টেন্টটি ডিস্ক ক্যাশে ক্যাশে করবে।
  • 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 প্রয়োজন। এই বিল্ডারটি বর্তমান কনটেক্সট এবং অ্যাপের টার্গেট প্রিলোড স্ট্যাটাস কন্ট্রোল দিয়ে কনফিগার করা থাকে। আপনি সমস্ত ডিফল্ট কনফিগারেশন সহ একটি প্রিলোড ম্যানেজার তৈরি করতে পারেন।

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

বিল্ডারটি সেটার মেথডও প্রদান করে, যা ব্যবহার করে আপনি প্রিলোড ম্যানেজারের কাস্টম কম্পোনেন্টগুলো সেট করতে পারেন।

উদাহরণস্বরূপ, আপনি DefaultPreloadManager এ সমস্ত প্রি-লোডিং মিডিয়া সোর্সের জন্য টার্গেট মোট বাফার বাইট কাস্টমাইজ করতে পারেন, যাতে প্রি-লোড করা ডেটা সেই সীমা অতিক্রম না করে। আপনি "preload" প্লেয়ারের নাম সহ একটি কাস্টম DefaultLoadControl.BuildersetPlayerTargetBufferBytes(String, int) ব্যবহার করে সেই সীমাটি কনফিগার করতে পারেন এবং সেই ইনস্ট্যান্সটি প্রি-লোড ম্যানেজার বিল্ডারে পাস করতে পারেন:

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

preloadManagerBuilder.setLoadControl(
  DefaultLoadControl.Builder()
    .setPlayerTargetBufferBytes("preload", 128 * 1024 * 1024) // 128 MiB
    .build()
)
val preloadManager = preloadManagerBuilder.build()

বিল্ডারের সেটার মেথডগুলো কাস্টমাইজেশনের জন্য মূলত ঐচ্ছিক হলেও, যদি আপনি ডিস্কে কোনো মিডিয়া আইটেম ক্যাশ করতে চান, তবে আপনাকে অবশ্যই setCache() কল করে বিল্ডারটিকে একটি Cache দিয়ে কনফিগার করতে হবে। যদি কোনো ক্যাশ কনফিগার করা না থাকে, তবে মিডিয়া আইটেমগুলো ক্যাশ করার চেষ্টা করলে একটি IllegalStateException দেখা দেবে।

আগে থেকে লোড করা মিডিয়া আইটেমটি চালানোর জন্য ExoPlayer তৈরি করুন।

প্রিলোড ম্যানেজার তৈরি করার জন্য বিল্ডার ব্যবহার করার পাশাপাশি, আপনার অ্যাপের কন্টেন্ট প্লে করার জন্য ব্যবহৃত ExoPlayer অবজেক্টগুলো তৈরি করতেও আপনি এটি ব্যবহার করবেন, যাতে ExoPlayer সঠিকভাবে প্রিলোড ম্যানেজারের সাথে কম্পোনেন্ট শেয়ার করতে পারে। এরপরও, সেই কনফিগারেশনগুলো সেট করা একটি ExoPlayer.Builder ইনস্ট্যান্স পাস করার মাধ্যমে আপনি ExoPlayer এর জন্য প্লেব্যাক-নির্দিষ্ট কনফিগারেশনগুলো সেট করতে পারবেন।

// Direct creation
val exoPlayer = preloadManagerBuilder.buildExoPlayer()

// Creation with custom playback specific configurations
val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true)
val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)