یک 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 (آیتم رسانه بعدی): بارگیری ۳۰۰۰ میلی‌ثانیه (۳ ثانیه) از موقعیت شروع پیش‌فرض
  • فهرست n-1 (آیتم رسانه قبلی): بارگیری ۱۰۰۰ میلی‌ثانیه (۱ ثانیه) از موقعیت شروع پیش‌فرض
  • سایر موارد رسانه‌ای در محدوده n-2 تا n+2 : PreloadStatus.TRACKS_SELECTED را برمی‌گرداند.
  • سایر موارد رسانه‌ای در محدوده n-4 تا n+4 : 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 را به سازنده‌ی preload manager ارسال خواهید کرد.
  • currentPlayingIndex فهرست هر آیتم رسانه‌ای که در حال پخش است را نگه می‌دارد. این وظیفه برنامه است که این مقدار را به‌روز نگه دارد.
  • وقتی مدیر پیش‌بارگذاری آماده بارگذاری محتوا شد، getTargetPreloadStatus را فراخوانی می‌کند و اطلاعات رتبه‌بندی که برای آن آیتم رسانه‌ای مربوطه مشخص کرده‌اید را ارسال می‌کند. در مورد DefaultPreloadManager ، این اطلاعات رتبه‌بندی یک عدد صحیح است که موقعیت آیتم را در یک چرخ فلک مشخص می‌کند. این متد با مقایسه آن شاخص با شاخص آیتمی که در حال حاضر انتخاب شده است، کدی را که باید برگرداند، انتخاب می‌کند.

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

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

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

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

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

  • MyTargetPreloadStatusControl کلاسی است که شما در Create a target preload status control تعریف کرده‌اید.
  • شما از همان DefaultPreloadManager.Builder برای ایجاد اشیاء ExoPlayer که محتوای مدیریت شده توسط آن مدیر پیش بارگذاری را پخش می‌کنند، استفاده خواهید کرد.