এই পৃষ্ঠায় বর্ণনা করা হয়েছে যে কীভাবে DefaultPreloadManager তৈরি করতে হয়, যা আপনার বেছে নেওয়া স্ট্র্যাটেজির উপর ভিত্তি করে আপনার অ্যাপের জন্য মিডিয়া কন্টেন্ট প্রিলোড করে।
BasePreloadManager অ্যাবস্ট্রাক্ট ক্লাসের উপর ভিত্তি করে প্রিলোড ম্যানেজার আপনাকে
আপনার বেছে নেওয়া মাপকাঠি অনুযায়ী কন্টেন্ট র্যাঙ্ক করতে দেয়। এই ডকুমেন্ট থেকে জানা যাবে কীভাবে
derived class 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 (আগের মিডিয়া আইটেম): ডিফল্ট শুরুর পজিশন থেকে ১০০০ মিলি সেকেন্ড (১ সেকেন্ড) লোড করুন
- n-২ থেকে n+২ রেঞ্জের মধ্যে থাকা অন্যান্য মিডিয়া আইটেম: রিটার্ন
PreloadStatus.TRACKS_SELECTED - n-৪ থেকে n+৪ রেঞ্জের মধ্যে থাকা অন্যান্য মিডিয়া আইটেম: রিটার্ন
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-এ সব প্রিলোডিং মিডিয়া সোর্সের জন্য টার্গেট মোট বাফার বাইট কাস্টমাইজ করতে পারবেন, যাতে প্রিলোড করা ডেটা সেই সীমা অতিক্রম না করে। আপনি
setPlayerTargetBufferBytes(String, int)
ব্যবহার করে কাস্টম DefaultLoadControl.Builder-এ "preload" প্লেয়ারের নাম দিয়ে সেই সীমা কনফিগার করতে পারেন এবং
প্রিলোড ম্যানেজার বিল্ডারে সেই ইনস্ট্যান্স পাস করতে পারেন:
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-এর জন্য প্লেব্যাক নির্দিষ্ট কনফিগারেশন সেট করতে পারেন, এর জন্য আপনাকে
ExoPlayer.Builder ইনস্ট্যান্স পাস করতে হবে যেখানে এইসব কনফিগারেশন সেট করা আছে।
// Direct creation val exoPlayer = preloadManagerBuilder.buildExoPlayer() // Creation with custom playback specific configurations val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true) val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)