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