लाइव स्ट्रीमिंग

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.getCurrentWindowIndex और Timeline.getWindow का इस्तेमाल करके. इस Window:
    • Window.liveConfiguration में टारगेट लाइव ऑफ़सेट और लाइव ऑफ़सेट शामिल है अडजस्टमेंट पैरामीटर का इस्तेमाल किया जा सकता है. ये वैल्यू मीडिया में मौजूद जानकारी के हिसाब से होती हैं और ऐप्लिकेशन से मिले ओवरराइड, MediaItem.liveConfiguration में सेट किए गए हैं.
    • Window.windowStartTimeMs, Unix Epoch के बाद का वह समय है जब लाइव विंडो शुरू हो जाएगी.
    • Window.getCurrentUnixTimeMs वह समय है जब से Unix Epoch के लिए मौजूदा रीयल-टाइम में देखा जा सकता है. इस वैल्यू को सही समय के हिसाब से सेट किया जा सकता है सर्वर और क्लाइंट के बीच होता है.
    • लाइव विंडो में Window.getDefaultPositionMs वह पोज़िशन है जहां प्लेयर डिफ़ॉल्ट रूप से वीडियो चलाना शुरू कर देगा.

लाइव स्ट्रीम में वीडियो खोजना

Player.seekTo का इस्तेमाल करके, लाइव विंडो के अंदर कहीं भी जाया जा सकता है. सीक पास की गई जगह, लाइव विंडो की शुरुआत के हिसाब से होती है. उदाहरण के लिए, seekTo(0), लाइव विंडो को शुरू करने की कोशिश करेगा. खिलाड़ी लाइव ऑफ़सेट को उसी स्थिति में रखें जैसे कि सीक के बाद, 'आगे-पीछे करें' की स्थिति.

लाइव विंडो पर, वीडियो चलाने की डिफ़ॉल्ट जगह भी सेट होती है शुरू करें. यह स्थिति आम तौर पर लाइव किनारे के पास होती है. वीडियो में आगे/पीछे जाने की सुविधा Player.seekToDefaultPosition पर कॉल करके डिफ़ॉल्ट स्थिति पर लाएं.

लाइव प्लेबैक यूज़र इंटरफ़ेस (यूआई)

ExoPlayer के डिफ़ॉल्ट यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, लाइव विंडो की अवधि और वीडियो चलाने की मौजूदा स्थिति. इसका मतलब है कि स्थिति लाइव विंडो के हर बार अपडेट होने पर, पीछे की ओर जाएं. अगर आपको व्यवहार, उदाहरण के लिए यूनिक्स समय या वर्तमान लाइव ऑफ़सेट दिखा रहा है, तो आप 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 के बहुत करीब होने का मतलब है कि अनुमान ज़्यादा है इससे सावधान रहना पड़ता है और नेटवर्क की बेहतर स्थितियों के साथ अडजस्ट होने में ज़्यादा समय लग सकता है. कम मान का मतलब है कि अनुमान, ज़्यादा से ज़्यादा जोखिम पर तेज़ी से एडजस्ट होगा कभी-कभी ऐसा हो सकता है.

BehindLiveWindow अपवाद और ERROR_CODE_SELECTED_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
  }
}