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

این صفحه نحوه ایجاد 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: Return PreloadStatus.TRACKS_SELECTED
  • سایر فایل‌های رسانه‌ای در محدوده n-4 تا n+4: Return 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()

درحالی‌که روش‌های تنظیم‌کننده سازنده اساساً برای سفارشی‌سازی اختیاری هستند، اگر می‌خواهید هر فایل رسانه‌ای را در دیسک پنهان‌سازی کنید، باید سازنده را با 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)