مدیریت و پخش محتوا

این صفحه نحوه استفاده از مدیر پیش‌بارگذاری برای مدیریت محتوای ویدیو را شرح می‌دهد. با استفاده از مدیر پیش‌بارگذاری، می‌توانید تجربه بهتری به کاربر ارائه دهید؛ وقتی کاربر از یک مورد رسانه‌ای به مورد دیگر تغییر می‌کند، پخش سریع‌تر شروع می‌شود زیرا مدیر از قبل مقداری از محتوا را بارگذاری کرده است.

این صفحه موضوعات زیر را پوشش می‌دهد:

موارد رسانه‌ای را به مدیر پیش‌بارگذاری اضافه کنید

شما باید به مدیر پیش‌بارگذاری در مورد هر آیتم رسانه‌ای که ردیابی خواهد کرد، اطلاع دهید. برای مثال، اگر برنامه شما دارای یک چرخ فلک از ویدیوها است، می‌توانید آنها را به مدیر پیش‌بارگذاری اضافه کنید. بسته به مورد استفاده شما، ممکن است تمام ویدیوها یا فقط تمام ویدیوهای نزدیک به ویدیویی که در حال پخش است را اضافه کنید. همچنین می‌توانید بعداً موارد جدیدی را به مدیر پیش‌بارگذاری اضافه کنید.

برای انجام این کار، از یک متد جمع دسته‌ای مانند addMediaItems استفاده کنید. به طور جایگزین، می‌توانید add (یا addMediaSource ) را برای اضافه کردن تک تک آیتم‌های رسانه‌ای فراخوانی کنید. با این حال، اضافه کردن تک تک آیتم‌های رسانه‌ای به طور خودکار پیش‌بارگذاری را فعال نمی‌کند. هنگام استفاده از متدهای تکی، باید پس از اتمام اضافه کردن آیتم‌ها، صریحاً invalidate را فراخوانی کنید تا به مدیر پیش‌بارگذاری بگویید اولویت‌ها را به‌روزرسانی کرده و پیش‌بارگذاری را شروع کند.

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

نکات کلیدی در مورد کد

  • این قطعه کد نشان می‌دهد که چگونه می‌توان پس از ایجاد مدیر پیش‌بارگذاری، آن را در حالت دسته‌ای پر کرد. می‌توانید برای افزودن موارد به یک مدیر پیش‌بارگذاری موجود و پرشده، تابع addMediaItems فراخوانی کنید.
  • در این قطعه کد، pullMediaItemsFromService() منطق برنامه برای دریافت لیست محتوا برای پخش است. کد، این متد را برای دریافت لیستی تا حداکثر ۲۰ آیتم فراخوانی می‌کند.
  • preloadManager همان DefaultPreloadManager است که در بخش Create a DefaultPreloadManager ایجاد شده است.
  • rankingData مقداری است که مدیر پیش‌بارگذاری از آن برای تعیین اولویت هر آیتم رسانه‌ای استفاده می‌کند. برای DefaultPreloadManager ، rankingData یک عدد صحیح است که موقعیت آیتم را در چرخ فلک نشان می‌دهد. مدیر پیش‌بارگذاری اولویت را بر اساس فاصله هر آیتم از آیتمی که در حال پخش است تعیین می‌کند.

دریافت و پخش رسانه

وقتی کاربر به یک آیتم رسانه‌ای جدید می‌رود، باید آیتم رسانه‌ای را از مدیر پیش‌بارگذاری دریافت کنید. اگر مدیر پیش‌بارگذاری هر یک از محتوا را بارگذاری کرده باشد، محتوا سریع‌تر از زمانی که از مدیر پیش‌بارگذاری استفاده نکرده‌اید پخش می‌شود. اگر مدیر پیش‌بارگذاری هنوز محتوایی از آن آیتم بارگذاری نکرده باشد، محتوا به طور عادی پخش می‌شود.

همچنین باید با فراخوانی setCurrentPlayingIndex ، شاخص پخش فعلی را در مدیر پیش‌بارگذاری به‌روزرسانی کنید، که به مدیر پیش‌بارگذاری امکان می‌دهد اولویت‌های عملیات پیش‌بارگذاری آینده را تعیین کند.

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

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

نکات کلیدی در مورد کد

  • player همان Media3 ExoPlayer است که برنامه برای پخش محتوا از آن استفاده می‌کند. شما باید آن player را با فراخوانی DefaultPreloadManager.Builder.buildExoPlayer() در همان سازنده‌ای که برای ایجاد مدیر preload استفاده کردید، ایجاد کنید.
  • وقتی کاربر به یک آیتم رسانه‌ای جدید سوئیچ می‌کند، برنامه تابع getMediaSource() را فراخوانی می‌کند تا منبع رسانه را از مدیر پیش‌بارگذاری دریافت کند. این باید یک mediaItem باشد که قبلاً به مدیر پیش‌بارگذاری اضافه کرده‌اید . اگر مدیر پیش‌بارگذاری هنوز بارگذاری محتوا را شروع نکرده باشد، اشکالی ندارد؛ در این صورت، MediaSource ای را برمی‌گرداند که داده‌های از پیش بارگذاری شده ندارد. برای مثال، این اتفاق ممکن است زمانی رخ دهد که کاربر ناگهان در چرخ فلک خیلی جلوتر برود.
  • بعد از اینکه کاربر آیتم رسانه‌ای جدید را پخش کرد، تابع setCurrentPlayingIndex را فراخوانی کنید تا به مدیر پیش‌بارگذاری بگویید آیتم جدید در کجای چرخ فلک قرار دارد. مدیر پیش‌بارگذاری برای اولویت‌بندی بارگذاری آیتم بعدی به این اطلاعات نیاز دارد.

موارد را از مدیر پیش‌بارگذاری حذف کنید

برای حفظ کارایی مدیر پیش‌بارگذاری، باید مواردی را که مدیر پیش‌بارگذاری دیگر نیازی به ردیابی آنها ندارد، حذف کنید. همچنین می‌توانید مواردی را که هنوز در چرخ فلک هستند اما از موقعیت فعلی کاربر فاصله زیادی دارند، حذف کنید. به عنوان مثال، ممکن است تصمیم بگیرید که اگر یک مورد بیش از ۱۵ مورد از آنچه کاربر تماشا می‌کند فاصله دارد، نیازی به پیش‌بارگذاری آن نباشد. در این صورت، وقتی موارد به این فاصله رسیدند، آنها را حذف می‌کنید. اگر کاربر به سمت آن موارد حذف شده برگردد، همیشه می‌توانید آنها را دوباره اضافه کنید .

اگر فهرستی از آیتم‌های رسانه‌ای برای حذف دارید، می‌توانید removeMediaItems استفاده کنید. همچنین، می‌توانید remove (یا removeMediaSource ) را برای حذف تک تک آیتم‌های رسانه‌ای فراخوانی کنید.

preloadManager.removeMediaItems(mediaItemsToRemove)

نکات کلیدی در مورد کد

  • اگر می‌خواهید همه موارد را از مدیر پیش‌بارگذاری حذف کنید، می‌توانید به جای remove() تابع reset() ) را فراخوانی کنید. این رویکرد در صورتی مفید است که نیاز به تغییر همه موارد موجود در carousel خود داشته باشید. در این صورت، پس از حذف موارد، باید موارد جدیدی را به مدیر پیش‌بارگذاری اضافه کنید .

وقتی کارتان با مدیر پیش‌بارگذاری تمام شد، آن را رها کنید

وقتی دیگر به مدیر پیش‌بارگذاری نیازی ندارید، باید آن را آزاد کنید تا منابعش آزاد شوند. به طور خاص، مطمئن شوید که وقتی فعالیت شما از بین می‌رود، آن را آزاد می‌کنید.

preloadManager.release()

نکات کلیدی در مورد کد

  • شما نباید هیچ یک از متدهای شیء را پس از رها کردن آن فراخوانی کنید.
  • اگر نیاز به ایجاد یک مدیر پیش‌بارگذاری دیگر دارید، یک DefaultPreloadManager.Builder جدید ایجاد کنید و از آن برای ایجاد DefaultPreloadManager استفاده کنید. سعی نکنید از سازنده قدیمی دوباره استفاده کنید.