پخش زنده

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 فعلی را می توان با استفاده از Player.getCurrentMediaItemIndex و Timeline.getWindow از Timeline بازیابی کرد. درون 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 : این مقدار به منظور انجام با احتیاط بیشتر، هر زمان که یک rebuffer رخ می دهد به آفست زنده هدف اضافه می شود. این ویژگی را می توان با تنظیم مقدار 0 غیرفعال کرد.
  • minPossibleLiveOffsetSmoothingFactor : یک ضریب هموارسازی نمایی که برای ردیابی حداقل افست زنده ممکن بر اساس رسانه بافر فعلی استفاده می شود. مقدار بسیار نزدیک به 1 به این معنی است که تخمین محتاطانه تر است و ممکن است تنظیم آن با شرایط بهبودیافته شبکه بیشتر طول بکشد، در حالی که مقدار کمتر به این معنی است که تخمین با ریسک بالاتری که در بافرها وارد می شود، سریعتر تنظیم می شود.

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
  }
}