বিষয়বস্তু পরিচালনা এবং খেলা

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

এই পৃষ্ঠায় নিম্নলিখিত বিষয়গুলো আলোচনা করা হয়েছে:

প্রিলোড ম্যানেজারে মিডিয়া আইটেম যোগ করুন

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

শুধুমাত্র মিডিয়া আইটেম যোগ করলেই প্রিলোড ম্যানেজার কন্টেন্ট লোড করা শুরু করে না। প্রিলোডিং চালু করতে, আপনাকে প্রিলোড ম্যানেজারে প্রায়োরিটিগুলো বাতিল করতে হবে।

val initialMediaItems = pullMediaItemsFromService(count = 20)
for (index in 0 until initialMediaItems.size) {
  preloadManager.add(initialMediaItems[index], /* rankingData= */ index)
}
// items aren't actually loaded yet! need to call invalidate() after this

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

  • এই কোড স্নিপেটটি দেখায় কিভাবে প্রিলোড ম্যানেজার তৈরি করার পর প্রাথমিকভাবে তাতে ডেটা যোগ করতে হয়। আপনি আগে থেকে ডেটা দিয়ে পূর্ণ থাকা কোনো প্রিলোড ম্যানেজারে আইটেম যোগ করার জন্য add() কল করতে পারেন।
  • এই কোড অংশে, pullMediaItemsFromService() হলো অ্যাপটির সেই লজিক যা প্লে করার জন্য কন্টেন্টের তালিকা নিয়ে আসে। কোডটি সর্বোচ্চ ২০টি আইটেমের একটি তালিকা আনার জন্য এই মেথডটিকে কল করে।
  • preloadManager হলো ` Create a DefaultPreloadManager অংশে তৈরি করা DefaultPreloadManager । কোডটি ক্যারোসেলের প্রতিটি আইটেম যোগ করার জন্য সেই ম্যানেজারের ` add() ` মেথডকে কল করে।
  • rankingData হলো এমন একটি মান যা প্রিলোড ম্যানেজার প্রতিটি মিডিয়া আইটেমের অগ্রাধিকার নির্ধারণ করতে ব্যবহার করে। DefaultPreloadManager এর ক্ষেত্রে, rankingData হলো একটি পূর্ণসংখ্যা যা ক্যারোসেলে আইটেমটির অবস্থান নির্দেশ করে। বর্তমানে প্লে হওয়া আইটেমটি থেকে প্রতিটি আইটেমের দূরত্বের উপর ভিত্তি করে প্রিলোড ম্যানেজার তার অগ্রাধিকার নির্ধারণ করে।

প্রিলোড ম্যানেজারে অগ্রাধিকারগুলি বাতিল করুন

কন্টেন্ট প্রি-লোড করা শুরু করার জন্য প্রি-লোড ম্যানেজারকে সক্রিয় করতে, আপনাকে invalidate() কল করে জানাতে হবে যে আইটেমগুলোর প্রায়োরিটি পুরোনো হয়ে গেছে। নিম্নলিখিত পরিস্থিতিগুলোতে আপনার এটি করা উচিত:

  • যখন আপনি প্রিলোড ম্যানেজারে নতুন মিডিয়া আইটেম যোগ করেন বা মিডিয়া আইটেম অপসারণ করেন। যদি আপনি একাধিক আইটেম যোগ বা অপসারণ করেন, তবে প্রথমে সবগুলো যোগ করুন, তারপর invalidate() কল করুন।
  • যখন ব্যবহারকারী একটি মিডিয়া আইটেম থেকে অন্যটিতে যান। এই ক্ষেত্রে, 'Fetch and play content'- এ বর্ণিত পদ্ধতি অনুযায়ী, invalidate() কল করার আগে আপনাকে অবশ্যই বর্তমান প্লেয়িং ইনডেক্সটি আপডেট করে নিতে হবে।

যখন আপনি প্রিলোড ম্যানেজারকে বাতিল করেন, তখন এটি প্রতিটি আইটেম থেকে কী পরিমাণ কন্টেন্ট লোড করা উচিত তা জানার জন্য আপনার তৈরি করা TargetPreloadStatusControl কে কল করে। এরপর এটি প্রতিটি আইটেমের কন্টেন্টকে তাদের অগ্রাধিকারের ক্রমানুসারে, উচ্চ থেকে নিম্ন ক্রমে লোড করে।

preloadManager.invalidate()

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

  • invalidate() কল করলে প্রিলোড ম্যানেজার তার জানা প্রতিটি মিডিয়া আইটেমের অগ্রাধিকার পুনরায় মূল্যায়ন করে। এই কারণে, আপনি যদি প্রিলোড ম্যানেজারে অনেক পরিবর্তন করেন, invalidate() কল করার আগে আপনার পরিবর্তনগুলো সম্পন্ন করা উচিত।

মিডিয়া আনুন এবং চালান

যখন ব্যবহারকারী একটি নতুন মিডিয়া আইটেমে যান, তখন আপনাকে প্রিলোড ম্যানেজার থেকে মিডিয়া আইটেমটি নিতে হবে। যদি প্রিলোড ম্যানেজার কোনো কন্টেন্ট লোড করে থাকে, তাহলে কন্টেন্টটি তার চেয়ে দ্রুত প্লে হয়, যা প্রিলোড ম্যানেজার ব্যবহার না করলে হতো না। যদি প্রিলোড ম্যানেজার সেই আইটেম থেকে এখনো কোনো কন্টেন্ট লোড না করে থাকে, তাহলে কন্টেন্টটি স্বাভাবিকভাবে প্লে হয়।

// When a media item is about to display on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If mediaSource is null, that mediaItem hasn't been added to the preload manager
  // yet. So, send it directly to the player when it's about to play
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is displaying at the center of the screen
player.play()
preloadManager.setCurrentPlayingIndex(currentIndex)

// Need to call invalidate() to update the priorities
preloadManager.invalidate()

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

  • player হলো Media3 ExoPlayer যা অ্যাপটি কন্টেন্ট প্লে করার জন্য ব্যবহার করছে। প্রিলোড ম্যানেজার তৈরি করতে আপনি যে বিল্ডারটি ব্যবহার করেছিলেন, সেই একই বিল্ডারে DefaultPreloadManager.Builder.buildExoPlayer() কল করে আপনাকে অবশ্যই সেই প্লেয়ারটি তৈরি করতে হবে।
  • যখন ব্যবহারকারী একটি নতুন মিডিয়া আইটেমে যান, তখন অ্যাপটি প্রিলোড ম্যানেজার থেকে মিডিয়া সোর্সটি পাওয়ার জন্য getMediaSource() কল করে। এটি অবশ্যই এমন একটি mediaItem হতে হবে যা আপনি আগে থেকেই প্রিলোড ম্যানেজারে যোগ করেছেন । প্রিলোড ম্যানেজার যদি কন্টেন্ট লোড করা শুরু না করে থাকে, তাতেও কোনো সমস্যা নেই; সেক্ষেত্রে, এটি এমন একটি MediaSource রিটার্ন করে যাতে আগে থেকে লোড করা ডেটা নেই। উদাহরণস্বরূপ, এমনটা হতে পারে যদি ব্যবহারকারী হঠাৎ করে ক্যারোসেলের অনেকটা অংশ এগিয়ে যান।
  • ব্যবহারকারী নতুন মিডিয়া আইটেমটি প্লে করার পর, ক্যারোসেলের কোথায় নতুন আইটেমটি আছে তা প্রিলোড ম্যানেজারকে জানানোর জন্য setCurrentPlayingIndex কল করুন। পরবর্তী আইটেমটি লোড করার ক্ষেত্রে অগ্রাধিকার নির্ধারণের জন্য প্রিলোড ম্যানেজারের এই তথ্যটি প্রয়োজন হয়। বর্তমান ইনডেক্স আপডেট করার পর, প্রতিটি আইটেমের জন্য প্রিলোড ম্যানেজারকে অগ্রাধিকার পুনঃনির্ধারণ করতে বাধ্য করার জন্য invalidate() কল করুন

প্রিলোড ম্যানেজার থেকে আইটেমগুলি সরান

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

preloadManager.remove(mediaItem)

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

আপনার কাজ শেষ হলে প্রিলোড ম্যানেজারটি রিলিজ করে দিন।

যখন আপনার প্রিলোড ম্যানেজারের আর প্রয়োজন হবে না, তখন এর রিসোর্সগুলো খালি করার জন্য আপনাকে অবশ্যই এটি রিলিজ করতে হবে। বিশেষ করে, আপনার অ্যাক্টিভিটি ডেস্ট্রয় হওয়ার সময় এটি রিলিজ করা নিশ্চিত করুন।

preloadManager.release()

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

  • অবজেক্টটি রিলিজ করার পর এর কোনো মেথড কল করা যাবে না
  • যদি আপনার আরেকটি প্রিলোড ম্যানেজার তৈরি করার প্রয়োজন হয়, তাহলে একটি নতুন DefaultPreloadManager.Builder তৈরি করুন এবং সেটি ব্যবহার করে DefaultPreloadManager তৈরি করুন। পুরোনো বিল্ডারটি পুনরায় ব্যবহার করার চেষ্টা করবেন না।