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 } }
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 } }
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 } }
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
: این مقدار هر زمان که یک داعش رخ دهد ، به Target Live جبران می شود تا با احتیاط بیشتری ادامه یابد. این ویژگی را می توان با تنظیم مقدار روی 0 غیرفعال کرد. -
minPossibleLiveOffsetSmoothingFactor
: یک فاکتور صاف کننده نمایی که برای ردیابی حداقل جبران زنده ممکن بر اساس رسانه بافر در حال حاضر استفاده می شود. یک مقدار بسیار نزدیک به 1 به این معنی است که تخمین محتاط تر است و ممکن است برای تنظیم شرایط بهتر شبکه بیشتر طول بکشد ، در حالی که یک مقدار پایین تر به این معنی است که تخمین سریعتر با خطر بیشتری از دویدن به درون رجوع می کند.
BearnliveWindowException و 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 } }