এই পৃষ্ঠায় 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 (আগের মিডিয়া আইটেম): ডিফল্ট স্টার্ট পজিশন থেকে ১০০০ মিলিসেকেন্ড (১ সেকেন্ড) লোড করুন
- 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-এ সব প্রি-লোডিং মিডিয়া সোর্সের
জন্য টার্গেট করা মোট বাফার বাইট কাস্টমাইজ করতে
পারেন, যাতে প্রি-লোড করা ডেটা সেই সীমা অতিক্রম
না করে। আপনি কাস্টম DefaultLoadControl.Builder-এ প্লেয়ারের নাম "preload" ব্যবহার করে
setPlayerTargetBufferBytes(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()
কাস্টমাইজেশনের জন্য বিল্ডারের সেটার পদ্ধতিগুলি মূলত ঐচ্ছিক হলেও, আপনি যদি কোনও মিডিয়া
আইটেম ডিস্কে ক্যাশে করতে চান, তাহলে আপনাকে Cache দিয়ে বিল্ডার কনফিগার করতে হবে
setCache() কল করে। কোনও ক্যাশে কনফিগার করা না থাকলে, মিডিয়া
আইটেম ক্যাশে করার চেষ্টা করলে 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)