یک 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 : مقدار 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 را به سازنده‌ی preload manager ارسال خواهید کرد.
  • 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()

اگرچه متدهای setter سازنده اساساً برای سفارشی‌سازی اختیاری هستند، اما اگر می‌خواهید هر آیتم رسانه‌ای را روی دیسک ذخیره کنید ، باید سازنده را با فراخوانی setCache() با یک Cache پیکربندی کنید. اگر هیچ حافظه پنهانی پیکربندی نشده باشد، تلاش برای ذخیره آیتم‌های رسانه‌ای منجر به خطای IllegalStateException خواهد شد.

ExoPlayer را برای پخش آیتم رسانه‌ای از پیش بارگذاری شده ایجاد کنید

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

// Direct creation
val exoPlayer = preloadManagerBuilder.buildExoPlayer()

// Creation with custom playback specific configurations
val skipSilenceExoPlayerBuilder = ExoPlayer.Builder(context).setSkipSilenceEnabled(true)
val skipSilenceExoPlayer = preloadManagerBuilder.buildExoPlayer(skipSilenceExoPlayerBuilder)