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 के डिफ़ॉल्ट यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, लाइव विंडो की अवधि और उसमें मौजूदा प्लेबैक की जगह दिखाते हैं. इसका मतलब है कि लाइव विंडो अपडेट होने पर, हर बार पोज़िशन पीछे की ओर जाती हुई दिखेगी. अगर आपको अलग-अलग तरह के व्यवहार की ज़रूरत है, जैसे कि Unix टाइम या मौजूदा लाइव ऑफ़सेट दिखाना, तो PlayerControlView को फ़ोर्क किया जा सकता है और अपनी ज़रूरतों के हिसाब से इसमें बदलाव किया जा सकता है.
लाइव स्ट्रीम के पैरामीटर कॉन्फ़िगर करना
ExoPlayer कुछ पैरामीटर का इस्तेमाल करता है. इनकी मदद से, लाइव स्ट्रीम के शुरू होने के समय से प्लेबैक की पोज़िशन के ऑफ़सेट को कंट्रोल किया जाता है. साथ ही, प्लेबैक की उन स्पीड की रेंज को कंट्रोल किया जाता है जिनका इस्तेमाल इस ऑफ़सेट को अडजस्ट करने के लिए किया जा सकता है.
ExoPlayer को इन पैरामीटर की वैल्यू तीन जगहों से मिलती हैं. ये वैल्यू, प्राथमिकता के घटते क्रम में होती हैं (सबसे पहले मिली वैल्यू का इस्तेमाल किया जाता है):
MediaItem.Builder.setLiveConfigurationको भेजी गई हरMediaItemवैल्यू के लिए.DefaultMediaSourceFactoryपर सेट की गई ग्लोबल डिफ़ॉल्ट वैल्यू.- मीडिया से सीधे तौर पर पढ़ी गई वैल्यू.
Kotlin
// 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)
Java
// 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 को अपनी पसंद के मुताबिक बनाया जा सकता है. दोनों ही मामलों में, प्लेयर बनाते समय इंस्टेंस सेट किया जा सकता है:
Kotlin
val player = ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build() ) .build()
Java
ExoPlayer player = new ExoPlayer.Builder(context) .setLivePlaybackSpeedControl( new DefaultLivePlaybackSpeedControl.Builder() .setFallbackMaxPlaybackSpeed(1.04f) .build()) .build();
DefaultLivePlaybackSpeedControl के काम के कस्टम पैरामीटर ये हैं:
fallbackMinPlaybackSpeedऔरfallbackMaxPlaybackSpeed: वीडियो चलाने की कम से कम और ज़्यादा से ज़्यादा स्पीड, जिसका इस्तेमाल तब किया जा सकता है, जब मीडिया या ऐप्लिकेशन से मिलेMediaItemमें सीमाएं तय न की गई हों.proportionalControlFactor: इससे यह कंट्रोल किया जा सकता है कि स्पीड में बदलाव कितनी आसानी से हो. ज़्यादा वैल्यू होने पर, बदलाव ज़्यादा अचानक और तेज़ी से होते हैं. हालांकि, इससे बदलाव सुनाई देने की संभावना भी बढ़ जाती है. कम वैल्यू से, स्पीड के बीच ट्रांज़िशन बेहतर होता है. हालांकि, इससे स्पीड कम हो जाती है.targetLiveOffsetIncrementOnRebufferMs: जब भी रीबफ़रिंग होती है, तब इस वैल्यू को टारगेट लाइव ऑफ़सेट में जोड़ा जाता है, ताकि ज़्यादा सावधानी से काम किया जा सके. इस सुविधा को बंद करने के लिए, वैल्यू को 0 पर सेट करें.minPossibleLiveOffsetSmoothingFactor: यह एक एक्सपोनेंशियल स्मूदिंग फ़ैक्टर है. इसका इस्तेमाल, मौजूदा समय में बफ़र किए गए मीडिया के आधार पर, लाइव स्ट्रीम के कम से कम ऑफ़सेट को ट्रैक करने के लिए किया जाता है. वैल्यू 1 के बहुत करीब होने का मतलब है कि अनुमान ज़्यादा सावधानी से लगाया गया है. साथ ही, नेटवर्क की बेहतर स्थिति के हिसाब से इसे अडजस्ट होने में ज़्यादा समय लग सकता है. वहीं, कम वैल्यू का मतलब है कि अनुमान को तेज़ी से अडजस्ट किया जाएगा. हालांकि, इससे रीबफ़रिंग की समस्या होने का खतरा बढ़ जाएगा.
BehindLiveWindowException और ERROR_CODE_BEHIND_LIVE_WINDOW
ऐसा हो सकता है कि लाइव विंडो के मुकाबले, वीडियो चलाने की पोज़िशन पीछे हो. उदाहरण के लिए, अगर प्लेयर को काफ़ी देर तक रोका जाता है या बफ़र किया जाता है. ऐसा होने पर, वीडियो नहीं चलेगा. साथ ही, गड़बड़ी कोड ERROR_CODE_BEHIND_LIVE_WINDOW के साथ अपवाद की सूचना Player.Listener.onPlayerError के ज़रिए दी जाएगी. ऐप्लिकेशन कोड, डिफ़ॉल्ट पोज़िशन पर वीडियो फिर से चलाकर, इस तरह की गड़बड़ियों को ठीक कर सकता है. डेमो ऐप्लिकेशन का PlayerActivity इस तरीके का उदाहरण है.
Kotlin
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 } }
Java
@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 } }