پخش جریانی مستقیم

ExoPlayer اکثر جاری‌سازی‌های زنده تطبیقی را بدون هیچ پیکربندی خاصی به‌صورت آماده پخش می‌کند. برای جزئیات بیشتر، به صفحه قالب‌های پشتیبانی‌شده مراجعه کنید.

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

شناسایی و پایش بازپخش‌های زنده

هربار که پنجره زنده به‌روز می‌شود، نمونه‌های Player.Listener ثبت‌شده رویداد onTimelineChanged را دریافت خواهند کرد. می‌توانید جزئیات مربوط به بازپخش زنده فعلی را با پرسمان کردن روش‌های مختلف Player و Timeline.Window بازیابی کنید، همان‌طور که در ادامه فهرست شده و در شکل زیر نشان داده شده است.

میانای برنامه‌سازی کاربردی پرسمان پنجره زنده
شکل ۱. پنجره زنده.
  • Player.isCurrentWindowLive نشان می‌دهد که آیا فایل رسانه‌ای درحال پخش جاری‌سازی زنده است یا نه. این مقدار حتی اگر جاری‌سازی زنده تمام شده باشد، همچنان درست است.
  • Player.isCurrentWindowDynamic نشان می‌دهد که آیا فایل رسانه‌ای درحال پخش هنوز درحال به‌روزرسانی است یا نه. این معمولاً برای جاری‌سازی‌های زنده‌ای که هنوز به‌پایان نرسیده‌اند صادق است. توجه داشته باشید که این پرچم در برخی موارد برای جاری‌سازی‌های غیرزنده نیز صادق است.
  • Player.getCurrentLiveOffset انحراف بین زمان واقعی کنونی و موقعیت بازپخش (درصورت دردسترس بودن) را برمی‌گرداند.
  • ‫Player.getDuration طول پنجره زنده فعلی را برمی‌گرداند.
  • Player.getCurrentPosition موقعیت بازپخش را نسبت به شروع پنجره زنده برمی‌گرداند.
  • Player.getCurrentMediaItem فایل رسانه‌ای فعلی را برمی‌گرداند، که در آن MediaItem.liveConfiguration حاوی جایگزینی‌های ارائه‌شده توسط برنامه برای پارامترهای انحراف زنده هدف و تنظیم انحراف زنده است.
  • Player.getCurrentTimeline ساختار رسانه فعلی را در Timeline برمی‌گرداند. Timeline.Window فعلی را می‌توان از Timeline بااستفاده از Player.getCurrentMediaItemIndex و Timeline.getWindow بازیابی کرد. در Window:
    • Window.liveConfiguration حاوی پارامترهای تنظیم انحراف زنده و انحراف زنده هدف است. این مقادیر براساس اطلاعات موجود در رسانه و هرگونه لغو ارائه‌شده توسط برنامه که در MediaItem.liveConfiguration تنظیم شده است تعیین می‌شود.
    • Window.windowStartTimeMs زمان شروع پنجره زنده از مبدأ یونیکس است.
    • Window.getCurrentUnixTimeMs زمان سپری‌شده از تاریخ یونیکس زمان واقعی فعلی است. این مقدار ممکن است با اختلاف ساعت شناخته‌شده بین سرور و کارخواه اصلاح شود.
    • Window.getDefaultPositionMs موقعیتی در پنجره زنده است که پخش‌کننده به‌طور پیش‌فرض بازپخش را از آنجا شروع می‌کند.

جستجو در جاری‌سازی‌های زنده

بااستفاده از Player.seekTo می‌توانید به هرجایی در پنجره زنده بروید. موقعیت جستجوی ردشده نسبت به شروع پنجره زنده است. برای مثال، seekTo(0) به ابتدای پنجره زنده می‌رود. پخش‌کننده تلاش می‌کند پس‌از کاوش، همان انحراف زنده را مانند موقعیت کاوش‌شده حفظ کند.

پنجره زنده همچنین دارای یک موقعیت پیش‌فرض است که قرار است بازپخش از آنجا شروع شود. این موقعیت معمولاً جایی نزدیک به لبه پخش زنده است. با فراخوانی Player.seekToDefaultPosition می‌توانید به موقعیت پیش‌فرض بروید.

رابط کاربری بازپخش زنده

مؤلفه‌های میانای کاربری پیش‌فرض ExoPlayer مدت پنجره زنده و موقعیت بازپخش فعلی را در آن نشان می‌دهد. این یعنی به‌نظر می‌رسد که موقعیت هربار که پنجره زنده به‌روز می‌شود، به عقب می‌پرد. اگر به رفتار متفاوتی نیاز دارید، برای مثال نمایش زمان مبدأ یونیکس یا انحراف زنده فعلی، می‌توانید PlayerControlView را منشعب کنید و آن را مطابق با نیازهایتان اصلاح کنید.

درحال پیکربندی پارامترهای بازپخش زنده

ExoPlayer از برخی پارامترها برای کنترل افست موقعیت بازپخش از لبه زنده و محدوده سرعت‌های بازپخش که می‌توانند برای تنظیم این افست استفاده شوند، استفاده می‌کند.

ExoPlayer مقادیر این پارامترها را از سه مکان دریافت می‌کند، به ترتیب نزولی اولویت (اولین مقدار یافت‌شده استفاده می‌شود):

  • مقادیر Per MediaItem به MediaItem.Builder.setLiveConfiguration منتقل شد.
  • مقادیر پیش‌فرض سراسری در DefaultMediaSourceFactory تنظیم شده است.
  • مقادیر مستقیماً از رسانه خوانده می‌شود.

کاتلین

// Global settings.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
    .build()

// Per MediaItem settings.
val mediaItem =
  MediaItem.Builder()
    .setUri(mediaUri)
    .setLiveConfiguration(
      MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()
    )
    .build()
player.setMediaItem(mediaItem)

جاوا

// Global settings.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000))
        .build();

// Per MediaItem settings.
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(mediaUri)
        .setLiveConfiguration(
            new MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build())
        .build();
player.setMediaItem(mediaItem);

مقادیر پیکربندی دردسترس عبارت‌اند از:

  • ‫targetOffsetMs: افست زنده هدف. پخش‌کننده تلاش می‌کند درصورت امکان درطول بازپخش به این انحراف زنده نزدیک شود.
  • ‫minOffsetMs: حداقل انحراف مجاز زنده. حتی هنگام تنظیم کردن انحراف نسبت به شرایط فعلی شبکه، پخش‌کننده تلاش نمی‌کند درطول بازپخش به کمتر از این انحراف برسد.
  • ‫maxOffsetMs: حداکثر مقدار کاهش مجاز برای پخش زنده. حتی هنگام تنظیم کردن انحراف نسبت به شرایط فعلی شبکه، پخش‌کننده تلاش نمی‌کند درطول بازپخش از این انحراف فراتر برود.
  • minPlaybackSpeed: حداقل سرعت بازپخش که پخش‌کننده می‌تواند برای بازگشت به آن استفاده کند وقتی که می‌خواهد به انحراف زنده هدف برسد.
  • maxPlaybackSpeed: حداکثر سرعت بازپخش که پخش‌کننده می‌تواند برای رسیدن به هدف هنگام تلاش برای رسیدن به افست زنده هدف استفاده کند.

تنظیم سرعت بازپخش

هنگام پخش جاری‌سازی زنده با تأخیر کم، ExoPlayer با تغییر جزئی سرعت بازپخش، انحراف زنده را تنظیم می‌کند. پخش‌کننده سعی می‌کند با افست زنده هدف ارائه‌شده توسط رسانه یا برنامه مطابقت داشته باشد، اما همچنین سعی می‌کند به تغییر شرایط شبکه واکنش نشان دهد. برای مثال، اگر میان‌گیری مجدد درطول بازپخش رخ دهد، پخش‌کننده سرعت بازپخش را کمی کاهش می‌دهد تا از لبه زنده دورتر شود. اگر شبکه سپس به‌اندازه کافی پایدار شود تا از پخش نزدیک‌تر به لبه زنده دوباره پشتیبانی کند، پخش‌کننده سرعت بازپخش را افزایش می‌دهد تا به سمت افست زنده هدف بازگردد.

اگر تنظیم خودکار سرعت بازپخش لازم نیست، می‌توان آن را با تنظیم کردن ویژگی‌های minPlaybackSpeed و maxPlaybackSpeed روی 1.0f غیرفعال کرد. به‌طور مشابه، می‌توان آن را برای جاری‌سازی‌های زنده بدون تأخیر کم با تنظیم صریح این موارد روی مقادیری غیر از 1.0f فعال کرد. برای جزئیات بیشتر درباره نحوه تنظیم این ویژگی‌ها، بخش پیکربندی را ببینید.

سفارشی‌سازی الگوریتم تنظیم سرعت بازپخش

اگر تنظیم سرعت فعال باشد، LivePlaybackSpeedControl مشخص می‌کند چه تنظیماتی انجام شده است. می‌توانید LivePlaybackSpeedControl سفارشی را پیاده‌سازی کنید یا پیاده‌سازی پیش‌فرض را که DefaultLivePlaybackSpeedControl است سفارشی‌سازی کنید. در هر دو مورد، می‌توان نمونه‌ای را هنگام ساختن پخش‌کننده تنظیم کرد:

کاتلین

val player =
  ExoPlayer.Builder(context)
    .setLivePlaybackSpeedControl(
      DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()
    )
    .build()

جاوا

ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setLivePlaybackSpeedControl(
            new DefaultLivePlaybackSpeedControl.Builder()
                .setFallbackMaxPlaybackSpeed(1.04f)
                .build())
        .build();

پارامترهای سفارشی‌سازی مرتبط DefaultLivePlaybackSpeedControl عبارت‌اند از:

  • fallbackMinPlaybackSpeed و fallbackMaxPlaybackSpeed: حداقل و حداکثر سرعت بازپخش که می‌تواند برای تنظیم استفاده شود، اگر نه رسانه و نه MediaItem ارائه‌شده توسط برنامه محدودیت‌ها را تعریف نکنند.
  • proportionalControlFactor: کنترل می‌کند که تنظیم سرعت چقدر روان باشد. مقدار بالا باعث می‌شود تنظیمات ناگهانی‌تر و واکنشی‌تر باشند، اما احتمال شنیده شدن آن‌ها نیز بیشتر است. مقدار کوچک‌تر منجر به انتقال روان‌تر بین سرعت‌ها می‌شود، اما سرعت را کاهش می‌دهد.
  • targetLiveOffsetIncrementOnRebufferMs: این مقدار به افست زنده هدف اضافه می‌شود هرگاه میان‌گیری مجدد رخ دهد، تا با احتیاط بیشتری ادامه دهد. این ویژگی را می‌توان با تنظیم مقدار روی ۰ غیرفعال کرد.
  • minPossibleLiveOffsetSmoothingFactor: یک عامل هموارسازی نمایی که برای ردیابی حداقل انحراف زنده ممکن براساس رسانه بافرشده فعلی استفاده می‌شود. مقدار بسیار نزدیک به ۱ یعنی تخمین محتاطانه‌تر است و ممکن است زمان بیشتری طول بکشد تا با شرایط بهبودیافته شبکه سازگار شود، درحالی‌که مقدار کمتر یعنی تخمین سریع‌تر سازگار می‌شود اما خطر مواجه شدن با میان‌گیری مجدد بیشتر است.

BehindLiveWindowException و ERROR_CODE_BEHIND_LIVE_WINDOW

موقعیت بازپخش ممکن است از پنجره زنده عقب بیفتد، مثلاً اگر پخش‌کننده برای مدت طولانی متوقف شود یا درحال میان‌گیری باشد. اگر این اتفاق بیفتد، بازپخش ناموفق خواهد بود و استثنایی با کد خطای ERROR_CODE_BEHIND_LIVE_WINDOW بااستفاده از Player.Listener.onPlayerError گزارش خواهد شد. ممکن است بخواهید چنین خطاهایی را با ازسرگیری بازپخش در موقعیت پیش‌فرض مدیریت کنید. PlayerActivity برنامه نمایشی نمونه‌ای از این رویکرد است.

کاتلین

override fun onPlayerError(error: PlaybackException) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition()
    player.prepare()
  } else {
    // Handle other errors
  }
}

جاوا

@Override
public void onPlayerError(PlaybackException error) {
  if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {
    // Re-initialize player at the live edge.
    player.seekToDefaultPosition();
    player.prepare();
  } else {
    // Handle other errors
  }
}