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

‫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 مقادیر این پارامترها را از سه مکان دریافت می‌کند، به ترتیب نزولی اولویت (از اولین مقدار یافت‌شده استفاده می‌شود):

  • به‌ازای هر 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
  }
}