वेब रिसीवर प्लेयर स्ट्रीमिंग प्रोटोकॉल

वेब रिसीवर SDK टूल, मौजूदा समय में तीन तरह के स्ट्रीमिंग प्रोटोकॉल पर काम करता है:

DASH, एचटीटीपी लाइव स्ट्रीमिंग, और स्मूद स्ट्रीमिंग.

इस दस्तावेज़ में, हमने बताया है कि हम हर स्ट्रीमिंग प्रोटोकॉल पर दी जाने वाली सहायता उपलब्ध कराते हैं. देखें

डाइनैमिक अडैप्टिव स्ट्रीमिंग ओवर एचटीटीपी (डीएसएच)

ISO की DASH की पूरी जानकारी.

DASH एक अडैप्टिव बिटरेट स्ट्रीमिंग प्रोटोकॉल है. इसकी मदद से, एचटीटीपी या सर्वर के ज़रिए अच्छी क्वालिटी में वीडियो स्ट्रीमिंग की जा सकती है. एक्सएमएल में बने मेनिफ़ेस्ट में, वीडियो कॉन्टेंट को शुरू करने और डाउनलोड करने के तरीके के बारे में ज़्यादातर मेटाडेटा जानकारी होती है. वेब रिसीवर प्लेयर के साथ काम करने वाली मुख्य बातों में, <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl>, और <ContentProtection> शामिल हैं.

DASH मेनिफ़ेस्ट, रूट <MPD> टैग से शुरू होता है और इसमें एक या ज़्यादा <Period> टैग होते हैं, जो एक स्ट्रीमिंग कॉन्टेंट को दिखाते हैं. <Period> टैग, स्ट्रीमिंग कॉन्टेंट के अलग-अलग हिस्सों के क्रम की सुविधा देते हैं. साथ ही, इनका इस्तेमाल अक्सर मुख्य कॉन्टेंट और विज्ञापन या एक से ज़्यादा वीडियो कॉन्टेंट को अलग-अलग करने के लिए किया जाता है.

<MPD> से कम की <AdaptationSet>, एक तरह की मीडिया स्ट्रीम को दिखाने का एक सेट है. ज़्यादातर मामलों में वीडियो, ऑडियो या कैप्शन शामिल होते हैं. आम तौर पर, "video/mp4", "audio/mp4", और "text/vtt" सबसे ज़्यादा इस्तेमाल किए जाने वाले MIME टाइप हैं. <AdaptationSet> के तहत एक वैकल्पिक <ContentComponent contentType="$TYPE$"> शामिल किया जा सकता है.

हर <AdaptationSet> के अंदर <Representation> टैग की एक सूची मौजूद होनी चाहिए. साथ ही, वेब रिसीवर प्लेयर MSE सोर्स बफ़र को शुरू करने के लिए codecs जानकारी और bandwidth जानकारी का इस्तेमाल करता है, ताकि चलाने के लिए सही वर्शन/बिटरेट अपने-आप चुना जा सके.

हर <Representation> के लिए, मीडिया सेगमेंट के बारे में जानकारी देने के लिए, या तो एक सेगमेंट दिखाने के लिए <BaseURL> का इस्तेमाल किया जाता है, सेगमेंट की सूची के लिए <SegmentList> का इस्तेमाल किया जाता है (एचएलएस की तरह) या <SegmentTemplate> का इस्तेमाल करके.

<SegmentTemplate> के लिए, यह बताता है कि टेंप्लेट की मदद से, इनिशलाइज़ेशन सेगमेंट और मीडिया सेगमेंट को कैसे दिखाया जा सकता है. नीचे दिए गए उदाहरण में, $Number$ सीडीएन से उपलब्ध सेगमेंट नंबर को दिखाता है. इसलिए, जैसे-जैसे वीडियो चलता रहता है, यह seg1.m4s, seg2.m4s वगैरह में अनुवाद होता है.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
  profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
  publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
  <Period id="P0">
    <AdaptationSet lang="en" segmentAlignment="true">
      <ContentComponent id="1" contentType="audio"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="150123" audioSamplingRate="44100"
        mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
        <BaseURL>http://www.google.com/testVideo</BaseURL>
      </Representation>
    </AdaptationSet>
    <AdaptationSet segmentAlignment="true">
      <ContentComponent id="1" contentType="video"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

<SegmentTemplate> के लिए, <SegmentTimeline> टैग का इस्तेमाल आम तौर पर किया जाता है. इससे यह पता चलता है कि हर सेगमेंट कितना लंबा है और किस सेगमेंट को दोहराया जाता है. timescale (एक सेकंड को दर्शाने वाली इकाइयां) को अक्सर <SegmentTemplate> के एट्रिब्यूट के हिस्से के रूप में शामिल किया जाता है, ताकि हम इस यूनिट के आधार पर सेगमेंट के समय का हिसाब लगा सकें. यहां दिए गए उदाहरण में, <S> टैग, सेगमेंट टैग के बारे में बताता है. d एट्रिब्यूट से पता चलता है कि सेगमेंट कितना लंबा है और r एट्रिब्यूट से पता चलता है कि एक ही अवधि के कितने सेगमेंट को दोहराया जा सकता है, ताकि media एट्रिब्यूट में बताए गए मीडिया सेगमेंट को डाउनलोड करने के लिए, $Time$ को सही तरीके से कैलकुलेट किया जा सके.

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

<SegmentList> का इस्तेमाल करके प्रतिनिधित्व के लिए, यहां एक उदाहरण दिया गया है:

<Representation id="FirstRep" bandwidth="2000000" width="1280"
  height="720">
  <BaseURL>FirstRep/</BaseURL>
  <SegmentList timescale="90000" duration="270000">
     <RepresentationIndex sourceURL="representation-index.sidx"/>
     <SegmentURL media="seg-1.ts"/>
     <SegmentURL media="seg-2.ts"/>
     <SegmentURL media="seg-3.ts"/>
  </SegmentList>
</Representation>

किसी सेगमेंट वाली फ़ाइल के लिए, आम तौर पर बाइट रेंज वाले अनुरोधों के साथ <SegmentBase> का इस्तेमाल किया जाता है. इससे यह पता चलता है कि <BaseURL> फ़ाइल के किस हिस्से में इंडेक्स शामिल है. साथ ही, वीडियो चलाने या आगे-पीछे होने पर, बाकी हिस्सों को मांग पर फ़ेच किया जा सकता है. यहां Initialization रेंज, init मेटाडेटा की रेंज और indexRange मीडिया सेगमेंट के इंडेक्स के बारे में बताती है. ध्यान दें कि फ़िलहाल, हम सिर्फ़ लगातार बाइट रेंज का इस्तेमाल करते हैं.

<Representation bandwidth="4190760" codecs="avc1.640028"
  height="1080" id="1" mimeType="video/mp4" width="1920">
  <BaseURL>video.mp4<BaseURL>
  <SegmentBase indexRange="674-1149">
    <Initialization range="0-673" />
  </SegmentBase>
</Representation>

अगर स्ट्रीम सुरक्षित हैं, तो इस बात से कोई फ़र्क़ नहीं पड़ता कि स्ट्रीम को सुरक्षित रखा गया है, <ContentProtection> सेक्शन <AdaptationSet> में दिख सकता है. इसमें schemeIdUri खास तौर पर, इस्तेमाल किए जाने वाले डीआरएम सिस्टम की पहचान करता है. एन्क्रिप्ट (सुरक्षित) करने के सामान्य तरीके के लिए, एक वैकल्पिक कुंजी आईडी शामिल किया जा सकता है.

<!-- Common Encryption -->
<ContentProtection
  schemeIdUri="urn:mpeg:dash:mp4protection:2011"
  value="cenc"
  cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>

<!-- Widevine -->
<ContentProtection
  schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>

ज़्यादा उदाहरणों और जानकारी के लिए, कृपया MPEG-DASH की जानकारी देखें. नीचे टैग से जुड़े दूसरे डैश एट्रिब्यूट की सूची दी गई है, जिनके बारे में ऊपर नहीं बताया गया है. फ़िलहाल, इन एट्रिब्यूट का इस्तेमाल किया जा सकता है:

विशेषता का नाम एट्रिब्यूट फ़ंक्शन
mediaPresentationDuration वीडियो की अवधि कितनी है.
minimumUpdatePeriod <MPD> टैग का एट्रिब्यूट; इससे यह तय होता है कि हमें मेनिफ़ेस्ट को कितनी बार फिर से लोड करना होगा.
टाइप करें <MPD> टैग का एट्रिब्यूट; "डाइनैमिक", जिससे पता चलता है कि यह एक लाइव स्ट्रीम है.
presentationTimeOffset <SegmentBase> टैग का एट्रिब्यूट; यह पीरियड की शुरुआत से प्रज़ेंटेशन टाइम ऑफ़सेट के बारे में बताता है.
startNumber इससे किसी प्रज़ेंटेशन में, किसी समयावधि में पहले मीडिया सेगमेंट की संख्या बताई जाती है. इसका इस्तेमाल अक्सर लाइव स्ट्रीम में किया जाता है.

हम डैश के लिए MP4 फ़्रैगमेंट के अंदर EMSG बॉक्स की पहचान करने और डेवलपर को एक EmsgEvent उपलब्ध कराने की भी सुविधा देते हैं.

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

  • availabilityStartTime
  • segmentAlignment

एचटीटीपी लाइव स्ट्रीमिंग (HLS)

एचटीटीपी लाइव स्ट्रीमिंग की खास जानकारी और पूरी जानकारी यहां पाई जा सकती है.

'वेब रिसीवर प्लेयर' की एक खास बात यह है कि यह MSE में HLS का वीडियो चलाने की सुविधा देता है. DASH से अलग, जहां मेनिफ़ेस्ट एक ही फ़ाइल में आता है, HLS एक मास्टर प्लेलिस्ट भेजता है, जिसमें सभी वैरिएंट स्ट्रीम की सूची उनके यूआरएल के साथ होती है. वैरिएंट वाली प्लेलिस्ट, मीडिया प्लेलिस्ट होती है. फ़िलहाल, 'वेब रिसीवर प्लेयर' के साथ मास्टर प्लेलिस्ट में ये दो मुख्य HLS टैग काम करते हैं:

टैग का नाम फ़ंक्शन
#EXT-X-STREAM-INF इससे बिटरेट/वैरिएंट स्ट्रीम तय करने में मदद मिलती है. BANDWIDTH एट्रिब्यूट की ज़रूरत होती है, जो ज़रूरत के हिसाब से बिटरेट स्ट्रीम करने की सुविधा के साथ काम करता है. MSE को शुरू करने के लिए, CODECS एट्रिब्यूट का इस्तेमाल करने का सुझाव दिया जाता है, जैसे कि "avc1.42c01e,mp4a.40.2". अगर इसके बारे में नहीं बताया गया है, तो डिफ़ॉल्ट केस, H264 मुख्य प्रोफ़ाइल 3.0 वीडियो और "mp4a.40.2" ऑडियो कोड में बदले गए कॉन्टेंट पर सेट होता है.
#EXT-X-MEDIA कॉन्टेंट को दिखाने वाली दूसरी मीडिया प्लेलिस्ट (URI एट्रिब्यूट में) तय करता है. आम तौर पर, ये अन्य फ़ॉर्मैट (5.1 सराउंड साउंड) या भाषा में वैकल्पिक ऑडियो स्ट्रीम होती हैं. TYPE का ऐसा एट्रिब्यूट इस्तेमाल करने की अनुमति है जिसमें VIDEO, AUDIO, SUBTITLES या CLOSED-CAPTIONS शामिल हों. DEFAULT एट्रिब्यूट को YES पर सेट करने का मतलब है कि डिफ़ॉल्ट रूप से इस वैकल्पिक स्ट्रीम को चुना जाएगा.

फ़िलहाल, 'वेब रिसीवर प्लेयर' के साथ मीडिया प्लेलिस्ट में HLS टैग का इस्तेमाल किया जा सकता है:

टैग का नाम फ़ंक्शन
#EXTINF स्ट्रीम की जानकारी, आम तौर पर सेगमेंट की अवधि के बाद सेकंड में और अगली पंक्ति में सेगमेंट का यूआरएल दिखता है.
#EXT-X-TARGETDURATION हर सेगमेंट कितने सेकंड का है. इससे यह भी तय होता है कि हम किसी लाइव स्ट्रीम के लिए, प्लेलिस्ट मेनिफ़ेस्ट को कितनी बार डाउनलोड/रीफ़्रेश करते हैं. वेब रिसीवर प्लेयर, 0.1 सेकंड से कम अवधि के साथ काम नहीं करता.
#EXT-X-MEDIA-SEQUENCE वह क्रम नंबर (अक्सर लाइव स्ट्रीम का) जो इस प्लेलिस्ट के पहले सेगमेंट के बारे में बताता है.
#EXT-X-KEY डीआरएम से जुड़ी कुंजी की जानकारी. METHOD एट्रिब्यूट से हमें पता चलता है कि किस सिस्टम का इस्तेमाल करना चाहिए. आज हम AES-128 और SAMPLE-AES का समर्थन करते हैं.
#EXT-X-BYTERANGE किसी सेगमेंट यूआरएल के लिए फ़ेच की जाने वाली बाइट रेंज.
#EXT-X-DISCONTINUITY क्रमागत सेगमेंट के बीच का अंतर दिखाता है. ऐसा अक्सर सर्वर साइड ऐड इंसर्शन के साथ देखा जाता है, जहां विज्ञापन सेगमेंट मुख्य स्ट्रीम के बीच में दिखता है.
#EXT-X-PROGRAM-DATE-TIME अगले सेगमेंट के पहले सैंपल का कुल समय, जैसे कि "2016-09-21T23:23:52.066Z".
#EXT-X-ENDLIST यह वीओडी (वीडियो ऑन डिमांड) हो या लाइव स्ट्रीम.

लाइव स्ट्रीम के लिए, हम #EXT-X-PROGRAM-DATE-TIME और #EXT-X-MEDIA-SEQUENCE को मुख्य चीज़ों के तौर पर इस्तेमाल करते हैं, ताकि यह तय किया जा सके कि रीफ़्रेश किए गए नए मेनिफ़ेस्ट को कैसे मर्ज किया जाए. अगर मौजूद है, तो #EXT-X-PROGRAM-DATE-TIME का इस्तेमाल, रीफ़्रेश किए गए सेगमेंट से मैच करने के लिए किया जाता है. ऐसा न करने पर, #EXT-X-MEDIA-SEQUENCE नंबर का इस्तेमाल किया जाएगा. ध्यान दें कि HLS की शर्तों के मुताबिक, हम मैच करने के लिए फ़ाइल के नाम की तुलना का इस्तेमाल नहीं करते.

हमने HLS को मुख्य ऑडियो प्लेबैक के तौर पर, 5.1 सराउंड साउंड जैसी किसी दूसरी ऑडियो स्ट्रीम को चुनने में मदद की है. वैकल्पिक कोडेक के साथ #EXT-X-MEDIA टैग जोड़कर ऐसा किया जा सकता है. साथ ही, स्ट्रीम कॉन्फ़िगरेशन में सेगमेंट फ़ॉर्मैट जोड़कर भी ऐसा किया जा सकता है.

वेब रिसीवर प्लेयर कुछ खास विशेषताओं वाले व्यवहार की उम्मीद करता है. उदाहरण के लिए, #EXT-INF टैग के बाद, हम एक यूआरआई की उम्मीद करते हैं. अगर यह यूआरआई नहीं है, तो उदाहरण के लिए, #EXT-X-DISCOUNTINUITY की वजह से, प्लेलिस्ट के लिए पार्सिंग नहीं हो पाएगी.

हर #EXT-X-TARGETDURATION सेकंड में, हम नई सेगमेंट सूची पाने के लिए प्लेलिस्ट/मेनिफ़ेस्ट को फिर से लोड करते हैं. साथ ही, हम सभी सेगमेंट की नई अंदरूनी सूची को नए सेगमेंट में अपडेट कर देते हैं. जब भी वीडियो में आगे/पीछे जाने का अनुरोध किया जाता है, तो हम सिर्फ़ उसी सीमा में वीडियो खोजते हैं जिस सीमा में वीडियो को आगे/पीछे किया जा सकता है. लाइव स्ट्रीम के लिए, हम सिर्फ़ नई सूची के शुरुआत से लेकर आखिर तक तीन टारगेट किए गए समय तक खोज करने की अनुमति देते हैं. उदाहरण के लिए, अगर आपके पास 10 सेगमेंट की सूची है और आप सेगमेंट 6 पर हैं, तो आप सिर्फ़ 7 तक खोज सकते हैं, लेकिन 8 नहीं.

सेगमेंट फ़ॉर्मैट के लिए सहायता

CAF SDK टूल पर, ऑडियो के लिए HlsSegmentFormat और वीडियो HlsVideoSegmentFormat में बताए गए अलग-अलग फ़ॉर्मैट में कॉन्टेंट चलाया जा सकता है. इसमें एन्क्रिप्ट (सुरक्षित) और एन्क्रिप्ट (सुरक्षित) नहीं किए गए, दोनों तरह के पैक किए गए ऑडियो जैसे कि AAC और AC3 प्लेबैक की सुविधा शामिल है. प्लेयर को अपने कॉन्टेंट के बारे में सही जानकारी देने के लिए, LoadRequestData के MediaInformation में यह जानकारी देना ज़रूरी है. अगर इसके बारे में नहीं बताया गया है, तो डिफ़ॉल्ट प्लेयर कॉन्फ़िगरेशन, कॉन्टेंट को ट्रांसपोर्ट स्ट्रीम पैकेज वाली सामग्री के तौर पर चलाने की कोशिश करेगा. इस प्रॉपर्टी को, लोड के अनुरोध के डेटा (Android, iOS, और वेब) में मौजूद, भेजने वाले किसी भी व्यक्ति के ज़रिए या मैसेज इंटरसेप्टर की मदद से रिसीवर में सेट किया जा सकता है.

वेब रिसीवर पर कॉन्टेंट तैयार करने के तरीके के बारे में ज़्यादा जानकारी के लिए, नीचे दिया गया सैंपल कोड स्निपेट या contentId, contentUrl, और इकाई का इस्तेमाल करके मीडिया लोड करना गाइड देखें.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...
      // Specify segment format for an HLS stream playing CMAF packaged content.
      loadRequestData.media.contentType = 'application/x-mpegurl';
      loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
      loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
      ...
      return loadRequestData;
    });

कॉन्टेंट की सुरक्षा

जैसा कि ऊपर #EXT-X-KEY टैग सेक्शन में बताया गया है, Cast SDK टूल SAMPLE-AES या SAMPLE-AES-CTR के साथ काम करता है, जहां कुंजी को शुरू करने वाले वेक्टर का यूआरआई दिया जा सकता है:

EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"

अब हम जिस KEYFORMAT का इस्तेमाल करते हैं वह Widevine है. यूआरआई में BASE64 की कोड में बदली गई DRM जानकारी XXXXXXX होती है, जिसे डिकोड करने पर, कुंजी आईडी शामिल होता है:

{
   "content_id": "MTQ1NjkzNzM1NDgxNA==",
   "key_ids": [
      "xxxxxxxxxxxxxxxx"
   ]
}

वर्शन 1 में इन एट्रिब्यूट के बारे में बताया गया है:

एट्रिब्यूट उदाहरण ब्यौरा
KEYFORMATVERSIONS "1" यह प्रस्ताव, कुंजी फ़ॉर्मैट के वर्शन 1 के बारे में बताता है
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" यूयूआईडी, DASH IF IOP से मिलने वाला Widevine UUID है. Widevine सुरक्षित की गई स्ट्रीम के साथ एमपीडी में ठीक इसी स्ट्रिंग का इस्तेमाल किया जाता है.
URI "data:text/plain;base64, <base64 encoded PSSH box>" उस स्ट्रीम का यूआरआई जिसमें डेटा टाइप और PSSH बॉक्स शामिल है.
METHOD SAMPLE-AES-CTR इससे पता चलता है कि कॉन्टेंट को एन्क्रिप्ट (सुरक्षित) करने के लिए, किस साइफ़र का इस्तेमाल किया गया था. सैंपल-AES से पता चलता है कि कॉन्टेंट को ‘cbcs’ का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किया गया है. sample-AES-सीटीआर से पता चलता है कि कॉन्टेंट को ‘ce आप’ नाम की किसी एक AES-सीटीआर सुरक्षा स्कीम का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किया गया है.

DASH MPD में मैप किए गए एट्रिब्यूट:

एट्रिब्यूट ब्यौरा
KEYFORMAT ContentProtection एलिमेंट की स्कीमIdUri एट्रिब्यूट.
URI cenc:pssh एलिमेंट का कॉन्टेंट.
KEYID कुंजी आईडी को कोड में बदलने वाली 16-बाइट हेक्साडेसिमल स्ट्रिंग, जिसकी भूमिका MPEG DASH में default_kid की ही होती है. अगर हैरारकी वाली की स्कीम का इस्तेमाल किया जा रहा है, तो यह "रूट" कुंजी होगी.

वर्शन 2 सिग्नलिंग वाली HLS प्लेलिस्ट का उदाहरण:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST

नीचे HLS की उन सुविधाओं और टैग की सूची दी गई है जिनका फ़िलहाल हम इस्तेमाल या इस्तेमाल नहीं करते. इनके न होने या न होने से, स्ट्रीमिंग के तरीके पर कोई असर नहीं पड़ता.

  • #EXT-X-STREAM-INF में मौजूद RESOLUTION= एट्रिब्यूट को अनदेखा किया जाता है.
  • #EXT-X-MEDIA में AUTOSELECT= एट्रिब्यूट का इस्तेमाल नहीं किया गया है. इसके बजाय, हम DEFAULT= पर भरोसा करते हैं
  • मास्टर प्लेलिस्ट में #EXT-X-I-FRAME-STREAM-INF को अनदेखा कर दिया गया है.
  • #EXT-X-DISCONTINUITY-SEQUENCE को अनदेखा किया गया
  • #EXT-X-PLAYLIST-TYPE:EVENT को लाइव स्ट्रीम में शामिल किया जा सकता है और #EXT-X-PLAYLIST-TYPE:VOD को वीओडी (वीडियो ऑन डिमांड) स्ट्रीम में शामिल किया जा सकता है. हालांकि, फ़िलहाल, हमारा वेब रिसीवर प्लेयर, लाइव बनाम वीओडी (वीडियो ऑन डिमांड) तय करने के लिए सिर्फ़ #EXT-X-ENDLIST की मौजूदगी पर निर्भर करता है.

स्मूद स्ट्रीमिंग

Microsoft का आधिकारिक स्मूद स्ट्रीमिंग स्पेसिफ़िकेशन.

स्मूद स्ट्रीमिंग, एचटीटीपी (डीएएसएच की तरह) पर अडैप्टिव स्ट्रीमिंग प्रोटोकॉल और एक्सएमएल स्पेसिफ़िकेशन. DASH से अलग, स्मूद स्ट्रीमिंग, मीडिया सेगमेंट के लिए सिर्फ़ MPEG-4 पैकेजिंग का सुझाव देती है.

यहां स्मूद स्ट्रीमिंग के सबसे सामान्य टैग और एट्रिब्यूट की टेबल दी गई है. अब वेब रिसीवर प्लेयर पर इसका इस्तेमाल किया जा सकता है. कई कॉन्सेप्ट के बारे में ऊपर दिए गए डैश सेक्शन में पहले ही बताया जा चुका है.

टैग/एट्रिब्यूट इस्तेमाल का तरीका
<SmoothStreamingMedia> मेनिफ़ेस्ट के मुख्य टैग में ये एट्रिब्यूट शामिल हैं:
  • टाइमस्केल: एक सेकंड दिखाने के लिए यूनिट की संख्या. आम तौर पर, यह 1,00,00,000 की बढ़ोतरी होती है.
  • अवधि: समयावधि में कॉन्टेंट की अवधि. 'वेब रिसीवर प्लेयर' पर, 0.1 सेकंड से कम अवधि का इस्तेमाल नहीं किया जा सकता.
  • IsLive: मेनिफ़ेस्ट कोई लाइव मीडिया है या नहीं.
<StreamIndex> स्ट्रीम का एक सेट, DASH के AdaptationSet से मिलता-जुलता. आम तौर पर, "टेक्स्ट", "वीडियो" या "ऑडियो" टाइप होता है. आम तौर पर, यूआरएल एट्रिब्यूट में बिटरेट या शुरुआत के समय जैसी जानकारी का इस्तेमाल करके, टेंप्लेट वाला फ़्रैगमेंट यूआरएल होता है.
<QualityLevel> हर Qualitylevel टैग अपने बिटरेट और चार सीसी कोडेक के बारे में बताता है. फ़ोरसीसी कोड अक्सर ‘H264’, ‘AVC1’, ‘AACL’ वगैरह होते हैं. वीडियो के लिए, यह अपने रिज़ॉल्यूशन को Maxwidth और Max मिले का इस्तेमाल करके तय करता है. ऑडियो के लिए, यह सैंपलिंग रेट और चैनलों की संख्या के ज़रिए अपनी फ़्रीक्वेंसी (जैसे कि 44100) तय करता है.
<c> स्ट्रीम फ़्रैगमेंट एलिमेंट. इसमें ये शामिल हैं:
  • d: फ़्रैगमेंट की अवधि.
  • t: फ़्रैगमेंट का मीडिया समय.
<सुरक्षा> वैकल्पिक SystemID एट्रिब्यूट वाला टैग, जिसमें सिस्टम डीआरएम के आईडी को <SentStreamingMedia> टैग में इस्तेमाल किया जाता है.
<ProtectionHeader> <Protection> में, SystemID और कस्टम डेटा का एक एट्रिब्यूट शामिल हो सकता है. आम तौर पर, इसे Base64 कोड में बदला जाता है. वाइडवाइन के लिए इसमें कुंजी आईडी, कुंजी की लंबाई, एल्गोरिदम आईडी जैसे कि AESसीटीआर, LA_URL (लाइसेंस हासिल करने वाला यूआरएल), LUI_URL (लाइसेंस यूज़र इंटरफ़ेस यूआरएल), और DS_ID (डोमेन सेवा आईडी) शामिल होंगे.

कॉन्टेंट की सुरक्षा

सुरक्षा सिस्टम आईडी को ठीक से कोड में बदलने के लिए, कृपया नीचे दी गई मैपिंग का इस्तेमाल करें:

  • विडेविन: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
  • पारदर्शी: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'

<ProtectionHeader> के लिए, नीचे Base64 से कोड में बदले गए डेटा का एक उदाहरण दिया गया है. डिकोड किए जाने पर, डेटा, डिकोड किए गए उसी फ़ॉर्मैट में होता है जैसा ऊपर दिए गए डैश कॉन्टेंट सुरक्षा सहायता में बताया गया है.

<Protection>
  <ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
    $BASE64ENCODED_DATA
  </ProtectionHeader>
</Protection>

नीचे 3,000 सेकंड की अवधि वाले लाइव स्मूद स्ट्रीमिंग मेनिफ़ेस्ट का उदाहरण दिया गया है:

<?xml version="1.0"?>
  <SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
    TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
    <StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
      <QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
        <c d="40000000" t="80649382288125"/>
        <c d="39980000"/>
        <c d="40020000"/>
    </StreamIndex>
    <Protection>
      <ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
    </Protection>
    <StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
      <QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
        Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
      <c d="40000000" t="80649401327500"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
    <StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
      Url="QualityLevels({bitrate})/Fragments(video={start time})">
      <QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
        FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
      <QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
        FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
      <QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
        FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
      <QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
        FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
      <c d="40000000" t="80649401378125"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
  </SmoothStreamingMedia>

ऊपर दिए गए उदाहरण में वीडियो स्ट्रीम के लिए, यूआरएल टेंप्लेट इस तरह है:

QualityLevels({bitrate})/Fragments(video={start time})

इसलिए, पहले दो सेगमेंट (यह मानकर चलें कि हम इंडेक्स 2 क्वालिटी लेवल पर हैं) वीडियो StreamIndex से जुड़े शुरुआती समय t="80649401378125" से और हर सेगमेंट में 4 सेकंड * 10,00,000 की बढ़ोतरी के साथ:

QualityLevels(2)/Fragments(video=80649401378125)
QualityLevels(2)/Fragments(video=80649441378125)
...

यहां स्मूद स्ट्रीमिंग एट्रिब्यूट की एक सूची दी गई है. हम फ़िलहाल इन एट्रिब्यूट को नज़रअंदाज़ करते हैं और इनका स्ट्रीमिंग अनुभवों पर कोई असर नहीं पड़ता है. इस बात से कोई फ़र्क़ नहीं पड़ता कि ये एट्रिब्यूट उपलब्ध कराए गए हैं या नहीं:

  • <SmoothStreamingMedia> टैग में CanSeek, CanPause.
  • चंक, <StreamIndex> टैग में क्वालिटी लेवल. इसके बजाय, हम <StreamIndex> में दी गई जानकारी के आधार पर सेगमेंट की संख्या और क्वालिटी लेवल की संख्या का हिसाब लगाते हैं. जैसे, असल QualityLevel टैग और <c> टैग.
  • BitsPerSample, <QualityLevel> में BitsPerSample का इस्तेमाल नहीं किया जाता है.

डिसप्ले टाइप देखें

canDisplayType तरीका, वेब रिसीवर डिवाइस के वीडियो और ऑडियो की क्षमताओं की जांच करता है. साथ ही, पास किए गए मीडिया पैरामीटर की पुष्टि करके बूलियन दिखाता है. पहले सभी पैरामीटर ज़रूरी नहीं हैं. जितने ज़्यादा पैरामीटर शामिल किए जाएंगे, जांच उतनी ही सटीक होगी.

इसका सिग्नेचर canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>) है

उदाहरण:

यह जांच करता है कि वेब रिसीवर डिवाइस और डिसप्ले, इस खास कोडेक, डाइमेंशन, और फ़्रेमरेट के साथ वीडियो/mp4 MIME टाइप के साथ काम करता है या नहीं:

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

3840 की चौड़ाई और 2160 की ऊंचाई तय करके यह जांच करता है कि वेब रिसीवर डिवाइस और डिसप्ले पर इस कोडेक के लिए 4K वीडियो फ़ॉर्मैट काम करता है या नहीं:

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

यह जांच करती है कि इस कोडेक, डाइमेंशन, और फ़्रेमरेट के लिए, वेब रिसीवर डिवाइस और डिसप्ले, HDR10 पर काम करते हैं या नहीं:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

यह जांच करता है कि इस कोडेक, डाइमेंशन, और फ़्रेमरेट के लिए, वेब रिसीवर डिवाइस और डिसप्ले पर Dolby Vision (DV) काम करता है या नहीं:

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

डीआरएम

कुछ मीडिया कॉन्टेंट के लिए डिजिटल राइट मैनेजमेंट (डीआरएम) होना ज़रूरी है. जिस मीडिया कॉन्टेंट का डीआरएम लाइसेंस (और मुख्य यूआरएल) उसके मेनिफ़ेस्ट (डीएसएच या HLS) में सेव होता है उसके लिए, कास्ट SDK टूल इस केस को मैनेज करता है. उस कॉन्टेंट के किसी सबसेट को licenseUrl की ज़रूरत होती है, ताकि डिक्रिप्शन कुंजी हासिल की जा सके. वेब रिसीवर में, licenseUrl को ज़रूरत के मुताबिक सेट करने के लिए PlaybackConfig का इस्तेमाल किया जा सकता है.

इस कोड स्निपेट में बताया गया है कि लाइसेंस के अनुरोधों, जैसे कि withCredentials के लिए, अनुरोध की जानकारी कैसे सेट की जा सकती है:

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});

अगर आपके पास Google Assistant इंटिग्रेशन है, तो डीआरएम की कुछ जानकारी, जैसे कि कॉन्टेंट के लिए ज़रूरी क्रेडेंशियल, OAuth/SSO जैसे तरीकों की मदद से सीधे आपके Google खाते से लिंक की जा सकती है. ऐसे मामलों में, अगर मीडिया कॉन्टेंट को आवाज़ से लोड किया जाता है या क्लाउड से आता है, तो क्रेडेंशियल उपलब्ध कराने के लिए क्लाउड से setCredentials को कास्ट डिवाइस पर शुरू किया जाता है. इसके बाद, वेब रिसीवर ऐप्लिकेशन लिखने वाले ऐप्लिकेशन, DRM को चलाने के लिए setCredentials जानकारी का इस्तेमाल कर सकते हैं. यहां मीडिया बनाने के लिए क्रेडेंशियल का इस्तेमाल करने का उदाहरण दिया गया है.

सलाह: contentId, contentUrl, और इकाई का इस्तेमाल करके मीडिया लोड करना भी देखें.

ऑडियो चैनल को हैंडल करना

जब कास्ट प्लेयर, मीडिया लोड करता है, तब यह एक ऑडियो सोर्स बफ़र सेट करता है. साथ ही साथ, यह प्राथमिक ट्रैक के MIME प्रकार के आधार पर, बफ़र के इस्तेमाल के लिए एक सही कोडेक भी चुनता है. एक नया बफ़र और कोडेक सेट अप किया गया है:

  • वीडियो शुरू होते समय,
  • हर विज्ञापन के लिए ब्रेक के समय, और
  • हर बार मुख्य कॉन्टेंट दोबारा शुरू होने पर.

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

इन स्थितियों में बताया गया है कि प्राइमरी और सेकंडरी ट्रैक में समान संख्या में चैनल होने पर प्रोग्रामिंग उपलब्ध कराना क्यों ज़रूरी है:

पहली स्थिति - ऐसी मीडिया स्ट्रीम जिसमें प्राइमरी और सेकंडरी ट्रैक में एक जैसे चैनल नहीं हैं:

  • अंग्रेज़ी - AC-3 5.1 चैनल (प्राइमरी)
  • स्वीडिश - AAC 2-चैनल
  • फ़्रेंच - AAC 2-चैनल
  • जर्मन - AAC 2-चैनल

इस स्थिति में, अगर प्लेयर की भाषा अंग्रेज़ी के अलावा किसी दूसरी भाषा पर सेट है, तो उपयोगकर्ता को वह ट्रैक नहीं सुनाई देता जिसे वह सुनना चाहता है. इसकी वजह यह है कि वीडियो चलाने के दौरान, दोनों चैनलों वाले सभी ट्रैक फ़िल्टर कर दिए जाते हैं. सिर्फ़ प्राइमरी AC-3 5.1 चैनल वाला ट्रैक चलाया जा सकता था. इसके बाद, भाषा को अंग्रेज़ी पर सेट करना होगा.

दूसरी स्थिति - प्राइमरी और सेकंडरी ट्रैक में एक जैसी मीडिया स्ट्रीम है:

  • अंग्रेज़ी - AC-3 5.1 चैनल (प्राइमरी)
  • स्वीडिश - AC-3 5.1 चैनल
  • फ़्रेंच - AC-3 5.1 चैनल
  • जर्मन - AC-3 5.1 चैनल

इस स्ट्रीम के सभी ट्रैक के चैनल समान हैं. इसलिए, ऑडियंस को गाना सुनाई देगा, भले ही चुनी गई भाषा कोई भी हो.

शाका के ऑडियो चैनल को हैंडल करना

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

अगर मुख्य ट्रैक, सराउंड साउंड नहीं है, जैसे कि दो चैनल वाला स्टीरियो ट्रैक, तो शाका प्लेयर डिफ़ॉल्ट रूप से दो चैनल पर काम करेगा. साथ ही, दो से ज़्यादा चैनल वाले दूसरे मीडिया ट्रैक को अपने-आप फ़िल्टर कर देगा.

शाका के पसंदीदा ऑडियो चैनलों को भी कॉन्फ़िगर किया जा सकता है. ऐसा करने के लिए, आपको cast.framework.PlaybackConfig पर shakaConfig प्रॉपर्टी में preferredAudioChannelCount को सेट करना होगा.

उदाहरण के लिए:

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount को 6 पर सेट करने पर, Shaka Player यह जांच करता है कि यह सराउंड साउंड कोडेक (AC-3 या EC-3) के साथ काम कर सकता है या नहीं. साथ ही, वह उन मीडिया ट्रैक को अपने-आप फ़िल्टर कर देता है जो चैनलों की पसंद के मुताबिक नहीं हैं.