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

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

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

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

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

اضافه کردن موارد رسانه‌ای به خودی خود باعث نمی‌شود که مدیر پیش‌بارگذاری شروع به بارگذاری محتوا کند. برای شروع پیش‌بارگذاری، باید اولویت‌ها را در مدیر پیش‌بارگذاری نامعتبر کنید .

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

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

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

اولویت‌ها را در مدیریت پیش‌بارگذاری نامعتبر کنید

برای اینکه مدیر پیش‌بارگذاری (preload manager) شروع به پیش‌بارگذاری محتوا کند، باید تابع invalidate() را فراخوانی کنید تا به مدیر پیش‌بارگذاری اطلاع دهید که اولویت‌های آیتم‌ها به‌روز نیستند. این کار را باید در شرایط زیر انجام دهید:

  • وقتی آیتم‌های رسانه‌ای جدیدی را به مدیریت پیش‌بارگذاری اضافه می‌کنید، یا آیتم‌های رسانه‌ای را حذف می‌کنید. اگر چندین آیتم را اضافه یا حذف می‌کنید، باید همه آنها را اضافه کنید، سپس تابع invalidate() فراخوانی کنید.
  • وقتی کاربر از یک آیتم رسانه‌ای به آیتم دیگری سوئیچ می‌کند، در این حالت، باید مطمئن شوید که قبل از فراخوانی invalidate() ، اندیس پخش فعلی را به‌روزرسانی می‌کنید، همانطور که در بخش Fetch and play content توضیح داده شده است.

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

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

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

preloadManager.remove(mediaItem)

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

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

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

preloadManager.release()

preloadManager.release()

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

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