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

Cast SDK में, लाइव कॉन्टेंट के साथ काम करने के लिए पहले से मौजूद एपीआई शामिल हैं. इसमें, ज़रूरत के हिसाब से ऐसा लचीला यूज़र इंटरफ़ेस (यूआई) शामिल है जो बेहद लोकप्रिय नहीं है. साथ ही, इसमें एपीआई की मदद से डेवलपर को कोड की कुछ लाइन में ही बेहतरीन अनुभव देने की सुविधा मिलती है. लाइव एपीआई में, वीडियो के शुरू और खत्म होने का समय, प्रोग्राम मेटाडेटा, डीवीआर कंट्रोल, और खोजी जा सकने वाली विंडो दिखती हैं.

इस गाइड में बताया गया है कि किसी स्ट्रीम को लाइव एपीआई में कैसे कॉन्फ़िगर किया जाए. साथ ही, इसमें स्ट्रीम और उसके बाद के हालातों के हिसाब से कॉन्फ़िगर करने के लिए, कोड और मेटाडेटा के सैंपल की जानकारी भी दी गई है. साथ ही, इसमें स्क्रीनशॉट से यह भी दिखाया गया है कि हर स्थिति कैसी दिखती है.

ज़रूरी शर्तें

इस गाइड को पढ़ने से पहले, आपको वेब रिसीवर लागू करने की बुनियादी बातों की जानकारी होनी ज़रूरी है. साथ ही, कोड के नमूने चलाने के लिए आपको लाइव स्ट्रीम को ऐक्सेस करना होगा. यह लाइव स्ट्रीम उन कलाकारों में से किसी एक के मुताबिक होनी चाहिए जो Cast के लिए सही तरह के मीडिया का इस्तेमाल करते हैं. आम तौर पर, लाइव सुविधा काम करने वाले मीडिया के लिए सामान्य लाइव स्ट्रीम कॉन्फ़िगरेशन के साथ काम करती है.

पूरी गाइड में इन शब्दों का इस्तेमाल किया गया है:

  • खोजने लायक विंडो - ऐसी लाइव स्ट्रीम की सीमा जिसमें उपयोगकर्ता खोज सकते हैं.
  • लाइव एज - प्लेयर में लाइव स्ट्रीम का सबसे नया हिस्सा.
  • Play हेड - वीडियो चलाने की मौजूदा स्थिति के लिए यूज़र इंटरफ़ेस (यूआई) टाइमस्टैंप.

लाइव स्ट्रीम कास्ट करना

कॉन्टेंट के लिए लाइव एपीआई का इस्तेमाल करने के लिए, वेब रिसीवर SDK टूल को कॉन्फ़िगर करने के दो तरीके हैं:

  1. वेब रिसीवर ऐप्लिकेशन में LOAD मैसेज इंटरसेप्टर का इस्तेमाल करके. (सुझाए गए)
  2. भेजने वाले की ओर से या रिसीवर की ओर से जनरेट किए गए लोड अनुरोध का इस्तेमाल करके.

इंटरसेप्टर एक LoadRequestData ऑब्जेक्ट देता है, जिसमें लोड अनुरोध के बारे में सभी ज़रूरी मेटाडेटा होता है. लोड होने का अनुरोध दिखाने के लिए, लाइव स्ट्रीम का अनुरोध करें. इसके लिए, mediaInformation पर ऑब्जेक्ट StreamType.LIVE को streamType सेट करें. MediaInformation.duration -1 होना चाहिए, क्योंकि प्लेयर के इंस्टेंस, LIVE होने पर इसकी गणना करने के लिए ज़िम्मेदार होते हैं.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

कार्यक्रम मार्गदर्शिका का डेटा जोड़ना

लाइव स्ट्रीम, खास तौर पर लंबे समय तक चलने वाली स्ट्रीम, जैसे कि टीवी चैनल, लाइव स्ट्रीम में वीडियो की मौजूदा स्थिति के आधार पर, स्क्रीन पर गाइड/प्रोग्रामिंग मेटाडेटा दिखाती हैं. कॉन्टेंट देने वालों को सलाह दी जाती है कि वे बेहतर वेब उपयोगकर्ता अनुभव के लिए अपने वेब रिसीवर ऐप्लिकेशन में प्रोग्रामिंग मेटाडेटा शामिल करें.

स्ट्रीम के लिए शुरुआती दिशा-निर्देश डेटा को एलओएडी मैसेज इंटरसेप्टर में कॉन्फ़िगर किया जा सकता है, जैसे हमने पिछले उदाहरण में बताया था कि स्ट्रीम लाइव स्ट्रीम थी. लाइव स्ट्रीम में अलग-अलग सेक्शन या प्रोग्राम को MediaMetadata ऑब्जेक्ट के तौर पर दिखाया जाता है. इसके बाद, उन्हें सूची में सेव किया जाता है. अलग-अलग तरह के प्रोग्राम के लिए, MediaMetadata की अलग क्लास होती है—उदाहरण के लिए, TvShowMediaMetadata,MovieMediaMetadata,MusicTrackMediaMetadata वगैरह

नीचे दिए गए कोड स्निपेट में, हम हर ऑब्जेक्ट के शुरू होने का समय बताने के लिए, MediaMetadata ऑब्जेक्ट का इस्तेमाल करते हैं. इसमें, sectionStartAbsoluteTime प्रॉपर्टी के साथ एक UNIX टाइमस्टैंप दिया जाता है. किसी प्रोग्राम की अवधि को सेकंड में दिखाया जाता है.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

लाइव खोजी जा सकने वाली रेंज

कास्ट SDK में ऐसे यूज़र इंटरफ़ेस (यूआई) एलिमेंट और कंट्रोल शामिल हैं जिनकी मदद से, उपयोगकर्ता स्ट्रीम में ही प्लेड कंट्रोलर या टच कंट्रोल वाले डिवाइसों पर टच कंट्रोल की मदद से, प्लेहेड की जगह बदल सकता है.

LiveSeekableRange इससे पता चलता है कि किसी उपयोगकर्ता स्ट्रीम में कितनी देर तक वीडियो देख सकता है. वेब रिसीवर की मदद से, PlayerManager.getLiveSeekableRange() के ज़रिए, खोजी जाने वाली रेंज की जानकारी ऐक्सेस की जा सकती है. इस रेंज से LiveSeekableRange ऑब्जेक्ट मिलता है. ऑब्जेक्ट की मुख्य प्रॉपर्टी इन बातों से जुड़ी हैं:

  • शुरू करें — सेकंड की लाइव स्ट्रीम की शुरुआत के हिसाब से, रेंज का शुरू होने का समय (सेकंड में).
  • end — स्ट्रीम की शुरुआत के हिसाब से, उपलब्ध सेगमेंट के आधार पर प्लेयर ज़्यादा से ज़्यादा समय (सेकंड में) ढूंढ सकता है.
  • isMoveविंडो — यह एक बूलियन वैल्यू है, जिससे यह पता चलता है कि स्ट्रीम के साथ, खोजी जा सकने वाली रेंज दिख रही है (यानी, पुराने सेगमेंट को मेनिफ़ेस्ट से हटाया गया है). यह सभी लाइव स्ट्रीम के लिए सही होनी चाहिए.
  • isLiveDone — यह एक बूलियन वैल्यू है, जिससे यह पता चलता है कि लाइव स्ट्रीम फ़िनिश हो गई है या नहीं. इसका मतलब है कि कोई भी नया सेगमेंट जनरेट नहीं हो रहा है.

ढूंढने लायक रेंज का साइज़, जिसे start और end के बीच के समय के तौर पर दिखाया जाता है, स्ट्रीम में उपलब्ध सेगमेंट की संख्या से तय होता है और यह स्ट्रीम के साथ बढ़ जाएगा. उदाहरण के लिए, अगर स्ट्रीम की शुरुआत में, खोजने लायक सीमा {start:0, end: 600, isMovingWindow: false, isLiveDone: false} है, तो स्ट्रीम शुरू होने के दस सेकंड के बाद यह {start: 10, end: 610, isMovingWindow: true, isLiveDone: false} में बदल सकती है. ध्यान दें कि नए सेगमेंट को जनरेट करने में लगने वाले समय के आधार पर, ढूंढने लायक रेंज में शुरू और खत्म होने के समय को अपडेट किया जाता है. इसलिए, अगर आपकी स्ट्रीम के लिए सेगमेंट की सामान्य लंबाई 10 सेकंड है, तो शुरू और खत्म होने का समय भी करीब हर 10 सेकंड में अपडेट किया जाएगा.

ढूंढना बंद करें

किसी स्ट्रीम में से तलाश करने की सुविधा को बंद करने के लिए, आपको वेब रिसीवर पर काम करने वाले मीडिया निर्देशों से खोज फ़ंक्शन को हटाना होगा:

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

भेजने वाले ऐप्लिकेशन के लिए SEEK सिग्नल के लिए काम करने वाले मीडिया कमांड को हटाना और इन्हें खोजने की सुविधा बंद करने के लिए डिसप्ले को टच करना, लेकिन 'Ok Google, 30 सेकंड पीछे जाने' जैसे बोलकर दिए जाने वाले निर्देशों को बंद नहीं करता. बोलकर निर्देश देने की सुविधा को बंद करने के बारे में ज़्यादा जानने के लिए, बोलकर मीडिया निर्देश देखें.

लाइव फ़्रेमवर्क इवेंट

दो एपीआई, LIVE_ENDED और LIVE_IS_MOVING_WINDOW_CHANGED, लाइव एपीआई में शामिल हैं. दोनों इवेंट को LiveStatusEvent ऑब्जेक्ट पास किया गया हो, जिसमें मौजूदा लाइव ढूंढने लायक रेंज शामिल हो.

इवेंट जानकारी
LIVE_ENDED लाइव स्ट्रीम खत्म होने पर ट्रिगर होता है. ऐसा करने पर, LiveSeekableRange में मौजूद end वैल्यू को अपडेट करना बंद कर दिया जाएगा. हालांकि, उपयोगकर्ता अब भी, कॉन्टेंट को लाइव ढूंढी जा सकने वाली सीमा में देख पाएंगे.
LIVE_IS_MOVING_WINDOW_CHANGED तब ट्रिगर होता है, जब लाइव स्ट्रीम को आगे-पीछे करने के लिए एक तय विंडो से लेकर मूविंग विंडो के बीच में बदलाव होता है या फिर इसका ठीक-ठाक हिस्सा होता है. लाइव स्ट्रीम के लिए ऐसा तब होता है, जब प्लेयर को पता चलता है कि मेनिफ़ेस्ट में पुराने सेगमेंट हटाए जा रहे हैं.

लाइव स्ट्रीम से जुड़ी स्थितियां

लाइव स्ट्रीमिंग के लिए आठ तरह की स्थितियां हो सकती हैं, जिनमें से हर एक को तीन मुख्य सेटिंग के हिसाब से कॉन्फ़िगर किया जाता है:

  • स्ट्रीम शुरू होने का समय है
  • स्ट्रीम के खत्म होने का समय है
  • उपयोगकर्ताओं को लाइव स्ट्रीम को ढूंढी जा सकने वाली विंडो में ही ढूंढा जा सकता है

उन वैल्यू को कॉन्फ़िगर करने का तरीका जानने के लिए, प्रोग्राम गाइड डेटा जोड़ना देखें.

यहां उन स्थितियों के स्क्रीनशॉट और ब्यौरे दिए गए हैं जिन पर Live API काम करता है. T1 और T2 वैरिएबल का इस्तेमाल, यूज़र इंटरफ़ेस (यूआई) के बाएं और दाएं हिस्से पर मौजूद टाइमस्टैंप को दिखाने के लिए किया जाता है.

शुरू होने का समय खत्म होने का समय खोजने लायक टी1 T2
पहली स्थिति नहीं नहीं नहीं प्ले हेड नहीं दिखाया गया
दूसरी स्थिति नहीं नहीं हां Play हेड नहीं दिखाया गया
तीसरी स्थिति नहीं हां नहीं Play हेड नहीं दिखाया गया
स्थिति 4 नहीं हां हां Play हेड नहीं दिखाया गया
स्थिति 5 हां नहीं नहीं शुरू होने का समय दिखाओ Play हेड
छठी समस्या हां नहीं हां शुरू होने का समय दिखाओ Play हेड
सातवीं स्थिति हां हां नहीं शुरुआत का समय दिखाएं खत्म होने का समय दिखाएं
आठवीं स्थिति हां हां हां शुरुआत का समय दिखाएं खत्म होने का समय दिखाएं

पहली स्थिति

शुरू होने का समय खत्म होने का समय खोजने लायक टी1 T2
नहीं नहीं नहीं हेड चलाएं नहीं दिखाया गया

पहली स्थिति में, न तो शुरू और न ही खत्म होने का समय होता है. साथ ही, उपयोगकर्ता भी स्ट्रीम में ये जानकारी नहीं खोज पाते. जब कोई उपयोगकर्ता स्ट्रीम को रोकता है, तो स्ट्रीम को लाइव स्ट्रीम से शुरू करने के बजाय, लाइव किनारे से फिर से शुरू हो जाएगा.

सातवीं स्थिति

एक टीवी, जिसमें घड़ी के समय के हिसाब से, सातवीं स्क्रीन पर Chromecast का लाइव यूज़र इंटरफ़ेस (यूआई) दिख रहा है एक मोबाइल फ़ोन, जिसमें घड़ी के समय की लाइव स्ट्रीम के सातवें हिस्से का लाइव यूज़र इंटरफ़ेस (यूआई) दिख रहा है

शुरू होने का समय खत्म होने का समय खोजने लायक टी1 T2
हां हां नहीं प्ले हेड कार्यक्रम की अवधि

सातवीं स्थिति में, इवेंट के शुरू और खत्म होने का समय है, लेकिन उसे खोजा नहीं जा सकता. यूज़र इंटरफ़ेस (यूआई) में दो टाइमस्टैंप, T1 और T2, मौजूदा प्लेहेड में लगने वाले समय और प्रोग्राम की कुल अवधि को दिखाते हैं. अगर कोई उपयोगकर्ता स्ट्रीम को रोकता है/फिर से शुरू करता है, तो वह स्ट्रीम के लाइव किनारे पर फिर से शुरू हो जाएगी. ऊपर दिए गए उदाहरण में, सीक बार का लाल सेक्शन, उपयोगकर्ता के देखने के बाद से स्ट्रीम का हिस्सा दिखाता है.

आठवीं स्थिति

एक टीवी, जिसमें घड़ी के समय के हिसाब से, आठवें सीन के लिए Chromecast का लाइव यूज़र इंटरफ़ेस (यूआई) दिखाया गया है एक मोबाइल फ़ोन, जिस पर घड़ी के समय के हिसाब से इवेंट 8 के लिए लाइव यूज़र इंटरफ़ेस (यूआई) दिख रहा है

शुरू होने का समय खत्म होने का समय खोजने लायक टी1 T2
हां हां हां प्ले हेड कार्यक्रम की अवधि

सातवीं स्थिति में, वीडियो शुरू होने का समय, खत्म होने का समय, और उसे ढूंढा जा सकता है. यूज़र इंटरफ़ेस (यूआई) में दो टाइमस्टैंप, T1 और T2, मौजूदा प्लेहेड में बिताए गए समय और प्रोग्राम की कुल अवधि को दिखाते हैं. अगर कोई उपयोगकर्ता स्ट्रीम को रोकने/फिर से शुरू करता है, तो वह उस समय फिर से शुरू होगा जब वह रुकी हुई विंडो में होगा—अगर सीक बार पर लाल रंग का हिस्सा है यह बताता है कि उपयोगकर्ता कहां वापस जा सकता है और सफ़ेद रंग का हिस्सा वह बताता है जहां वह आगे जाना चाहता है.

कोई स्थिति कॉन्फ़िगर करना

स्ट्रीम को किसी खास लाइव सीन के तौर पर कॉन्फ़िगर करने के तीन चरण होते हैं:

  1. स्ट्रीम का टाइप सेट करें - स्ट्रीम को लाइव स्ट्रीम के तौर पर मार्क करें.
  2. प्रोग्राम गाइड डेटा जोड़ें - MediaMetadata ऑब्जेक्ट में, शुरू होने का समय और अवधि सेट करें.
  3. नौकरी ढूंढने की सुविधा कॉन्फ़िगर करें - वीडियो खोजने की सुविधा चालू या बंद करें.

वीडियो चलाने की गतिविधि

इसके बाद भी, यूज़र इंटरफ़ेस (यूआई) में वीडियो चलाने का मेटाडेटा अपडेट होता रहेगा. इसमें वीडियो चलाने का हेड और वीडियो का लाइव एज समय शामिल है. स्ट्रीम को फिर से शुरू करने पर, कुछ ऐसे व्यवहार के बारे में पता होना चाहिए जो स्ट्रीम कॉन्फ़िगरेशन के हिसाब से अलग-अलग होते हैं.

ढूंढने लायक स्ट्रीम

किसी खोजी जा सकने वाली स्ट्रीम को फिर से शुरू करने पर:

  • लाइव किनारा लाइव स्थान पर अपडेट किया जाएगा और सामंजस्यपूर्ण सीमा को उसी के अनुसार समायोजित कर दिया जाएगा.
  • अगर प्लेहेड मौजूदा शो से आगे निकल जाता है, तो स्क्रब बार को नए शो के मेटाडेटा (अगर उपलब्ध हो, तो शुरुआत का समय और खत्म होने के समय के साथ) के साथ अपडेट कर दिया जाएगा.
  • अगर ढूंढने लायक विंडो की लंबाई 'X' हो, तो खोजने लायक रेंज ज़्यादा से ज़्यादा 'X' या शो की शुरुआत तक, इनमें से जो भी कम हो, उसे वापस बढ़ा दी जाती है.
  • अगर इस्तेमाल करने वाले को इतनी देर तक रोका गया था जिससे कि मौजूदा समय, खोजी जाने वाली विंडो में न रहे, तो स्ट्रीम, खोजने लायक विंडो के सबसे शुरू में (सबसे बाईं ओर) फिर से शुरू हो जाए.

लाइव स्ट्रीम को फिर से चलाने के बाद, उसेLiveSeekableRange.end लाइव किनारे पर चलाएं.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

खोजी नहीं जा सकने वाली स्ट्रीम

ऐसी स्ट्रीम जिसे फिर से शुरू नहीं किया जा सकता:

  • ऐसे में वीडियो फिर से लाइव किनारे पर शुरू हो जाएगा.
  • अगर लाइव शो, मौजूदा शो से पहले चलता है, तो स्क्रब बार को नए शो के मेटाडेटा (अगर उपलब्ध हो, तो शुरुआत और खत्म होने के समय के साथ) से अपडेट किया जाना चाहिए.

एपीआई प्लैटफ़ॉर्म में होने वाले बदलाव और लाइव यूज़र इंटरफ़ेस (यूआई) को पसंद के मुताबिक बनाना

कास्ट SDK टूल में, ज़रूरत के हिसाब से यूज़र इंटरफ़ेस बनाने की सुविधा मौजूद है. इसमें, आउट-ऑफ़-द-बॉक्स यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करने की सुविधा शामिल नहीं है. हालांकि, इंटरफ़ेस को पसंद के मुताबिक बनाते समय कास्ट UX डिज़ाइन चेकलिस्ट का पालन करना ज़रूरी है.

वेब रिसीवर

वेब रिसीवर पर, PlayerData में ये फ़ील्ड शामिल हैं, ताकि डेवलपर लाइव स्ट्रीम के लिए अपने कस्टम इंटरफ़ेस बढ़ा सकें:

  • isLive - एक फ़्लैग, जो बताता है कि वीओडी के बजाय, मौजूदा स्ट्रीम लाइव स्ट्रीम है या नहीं.
  • liveSeekableRange - डीवीआर की सीमा को बाहर निकालने वाली स्क्रीन पर दिखाने लायक लोकेशन.
  • mediaStartTotalTime - सेक्शन के सटीक समय में शुरू होने पर (UNIX Epoch).
  • sectionStartTimeInMedia - सेक्शन शुरू होने का समय, मीडिया शुरू होने के समय के मुकाबले सेकंड में.
  • sectionPeriod - सेक्शन की अवधि (सेकंड में).

साथ ही, यूज़र इंटरफ़ेस (यूआई) को पसंद के मुताबिक बनाते समय, दो लाइव इवेंट को ध्यान में रखें.

Android SDK

लाइव फ़ंक्शन के तहत, UIMediaController में Android सीकबार विजेट के इस्तेमाल पर रोक लगा दी गई है. इसके बजाय, CastSeekBar का इस्तेमाल करें.