یک DefaultPreloadManager ایجاد و پیکربندی کنید

این صفحه نحوه ایجاد یک DefaultPreloadManager را توضیح می دهد که محتوای رسانه ای را برای برنامه شما بر اساس استراتژی انتخابی شما از قبل بارگیری می کند.

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

سه مرحله برای ایجاد یک نمونه از DefaultPreloadManager وجود دارد:

  • یک TargetPreloadStatusControl را تعریف کنید که مدیر پیش بارگذاری می تواند از آن پرس و جو کند تا بفهمد آیا آیتم رسانه آماده بارگیری است و چقدر باید بارگذاری شود.
  • سازنده ای را ایجاد کنید که از آن برای ایجاد مدیر پیش بارگذاری و ایجاد اشیاء ExoPlayer برنامه خود استفاده می کنید.
  • با فراخوانی متد build() از سازنده برای ایجاد مدیر پیش بارگذاری استفاده کنید.

یک کنترل وضعیت پیش بارگذاری هدف ایجاد کنید

هنگامی که DefaultPreloadManager.Builder را ایجاد می‌کنید، یک شیء کنترل وضعیت پیش‌بارگذاری هدف که تعریف می‌کنید به آن ارسال می‌کنید. این شیء رابط TargetPreloadStatusControl را پیاده سازی می کند. هنگامی که مدیر پیش بارگذاری آماده می شود تا رسانه را از قبل بارگذاری کند، متد getTargetPreloadStatus() کنترل وضعیت شما را فراخوانی می کند تا بفهمد چه مقدار محتوا باید بارگیری شود. کنترل وضعیت می تواند با یکی از این کدهای وضعیت پاسخ دهد:

  • STAGE_SPECIFIED_RANGE_LOADED : مدیر پیش بارگیری باید محتوا را از موقعیت شروع مشخص شده و برای مدت زمان مشخص (بر حسب میلی ثانیه) بارگیری کند.
  • STAGE_TRACKS_SELECTED : مدیر پیش بارگیری باید اطلاعات آهنگ محتوا را بارگیری و پردازش کند و آهنگ ها را انتخاب کند. مدیر پیش بارگذاری هنوز نباید بارگیری محتوا را شروع کند.
  • STAGE_SOURCE_PREPARED : مدیر پیش بارگذاری باید منبع محتوا را آماده کند. به عنوان مثال، اگر فراداده محتوا در یک فایل مانیفست جداگانه باشد، مدیر پیش بارگذاری ممکن است آن مانیفست را واکشی و تجزیه کند.
  • null : مدیر پیش بارگیری نباید هیچ محتوا یا ابرداده ای را برای آن آیتم رسانه بارگیری کند.

شما باید یک استراتژی برای تصمیم گیری در مورد میزان بارگذاری محتوا برای هر آیتم رسانه داشته باشید. در این مثال، محتوای بیشتری برای موارد نزدیک به موردی که در حال پخش است بارگیری می شود. اگر کاربر در حال پخش محتوا با شاخص n باشد، کنترلر کدهای زیر را برمی گرداند:

  • فهرست n+1 (مورد رسانه بعدی): بارگیری 3000 میلی ثانیه (3 ثانیه) از موقعیت شروع پیش فرض
  • فهرست n-1 (مورد رسانه قبلی): بارگیری 1000 میلی ثانیه (1 ثانیه) از موقعیت شروع پیش فرض
  • سایر موارد رسانه در محدوده n-2 تا n+2 : Return PreloadStatus.TRACKS_SELECTED
  • سایر موارد رسانه در محدوده n-4 تا n+4 : Return PreloadStatus.SOURCE_PREPARED
  • برای همه موارد رسانه دیگر، null را برگردانید
class MyTargetPreloadStatusControl(
  currentPlayingIndex: Int = C.INDEX_UNSET
): 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.TRACKS_SELECTED
    } else if (abs(index - currentPlayingIndex) <= 4) {
      // return a PreloadStatus that is labelled by STAGE_SOURCE_PREPARED
      return DefaultPreloadManager.PreloadStatus.SOURCE_PREPARED
    }
    return null
  }
}

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

  • هنگام ایجاد یک نمونه از MyTargetPreloadStatusControl به سازنده مدیریت پیش بارگذاری ارسال می کنید.
  • currentPlayingIndex نمایه هر آیتم رسانه‌ای را که در حال حاضر پخش می‌شود را نگه می‌دارد. این وظیفه برنامه است که این مقدار را به روز نگه دارد.
  • هنگامی که مدیر پیش بارگذاری آماده بارگیری محتوا است، getTargetPreloadStatus فراخوانی می کند و اطلاعات رتبه بندی را که برای آن آیتم رسانه مربوطه مشخص کرده اید ارسال می کند. در مورد DefaultPreloadManager ، این اطلاعات رتبه بندی یک عدد صحیح است که موقعیت مورد را در چرخ فلک مشخص می کند. این روش با مقایسه آن شاخص با شاخص موردی که در حال حاضر انتخاب شده است، کدی را که باید برگرداند، انتخاب می کند.

مدیر پیش بارگذاری را ایجاد کنید

برای ایجاد مدیر پیش بارگذاری خود، به یک DefaultPreloadManager.Builder نیاز دارید. این سازنده با زمینه فعلی و کنترل وضعیت پیش بارگذاری هدف برنامه پیکربندی شده است. سازنده همچنین متدهای تنظیم کننده را ارائه می دهد که می توانید از آنها برای تنظیم اجزای سفارشی مدیر پیش بارگذاری استفاده کنید.

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

val targetPreloadStatusControl = MyTargetPreloadStatusControl()
val preloadManagerBuilder = DefaultPreloadManager.Builder(context, targetPreloadStatusControl)
val preloadManager = preloadManagerBuilder.build()

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

  • MyTargetPreloadStatusControl کلاسی است که در ایجاد کنترل وضعیت پیش بارگذاری هدف تعریف کرده اید.
  • شما از همان DefaultPreloadManager.Builder برای ایجاد اشیاء ExoPlayer استفاده می کنید که محتوای مدیریت شده توسط آن مدیر پیش بارگذاری را پخش می کند.