वेब रिसीवर SDK टूल तीन तरह के कोड के साथ काम करता है आज स्ट्रीमिंग प्रोटोकॉल का इस्तेमाल किया जा रहा है:
डैश, एचटीटीपी लाइव स्ट्रीमिंग, और स्मूद स्ट्रीमिंग.
इस दस्तावेज़ में हमने हर स्ट्रीमिंग प्रोटोकॉल के लिए अपनी सहायता की जानकारी दी है. नोट जोड़ें हर प्रोटोकॉल के लिए इस्तेमाल किए जाने वाले टैग की जानकारी को छोटे रूप में दिया गया है . इसका मकसद है कि जानें कि हर प्रोटोकॉल का इस्तेमाल कैसे किया जाता है और कौनसी सुविधाएं ये प्रोटोकॉल, Cast की सुविधा वाले डिवाइसों पर काम करते हैं, ताकि का अनुभव देने में मदद मिलती है.
एचटीटीपी पर डाइनैमिक अडैप्टिव स्ट्रीमिंग (डीएएसएच)
आईएसओ DASH की पूरी जानकारी.
DASH, बिटरेट को स्ट्रीम करने का एक अडैप्टिव प्रोटोकॉल है. इसकी मदद से, अच्छी क्वालिटी वाले वीडियो चलाए जा सकते हैं
को एचटीटीपी(एस) सर्वर से स्ट्रीम किया जा सकता है. एक्सएमएल में बनाए गए मेनिफ़ेस्ट में ज़्यादातर शामिल हैं
वीडियो को शुरू करने और डाउनलोड करने के तरीके की मेटाडेटा जानकारी
कॉन्टेंट. Web रिसीवर प्लेयर के साथ काम करने वाले मुख्य सिद्धांत <Period>
हैं.
<AdaptationSet>
, <Representation>
, <SegmentTemplate>
,
<SegmentList>
, <BaseUrl>
, और <ContentProtection>
.
DASH मेनिफ़ेस्ट, रूट <MPD>
टैग से शुरू होता है और इसके अंदर एक या
ज़्यादा <Period>
टैग, जो स्ट्रीम किए जा रहे एक कॉन्टेंट के बारे में बताते हैं.
<Period>
टैग, स्ट्रीमिंग कॉन्टेंट के अलग-अलग हिस्सों को क्रम में लगाने की अनुमति देते हैं
और इनका इस्तेमाल अक्सर मुख्य कॉन्टेंट और विज्ञापन को अलग-अलग दिखाने के लिए किया जाता है
लगातार वीडियो कॉन्टेंट दिखाना.
<MPD>
से कम <AdaptationSet>
, इसके लिए प्रतिनिधित्व का एक सेट है
एक तरह की मीडिया स्ट्रीम हो. ज़्यादातर मामलों में, वीडियो, ऑडियो या कैप्शन. सबसे ज़्यादा
आम तौर पर, इस्तेमाल किए जा सकने वाले MIME टाइप "video/mp4", "audio/mp4", और "text/vtt" हैं. अगर आप
<ContentComponent contentType="$TYPE$">
को शामिल किया जा सकता है. हालांकि, ऐसा करना ज़रूरी नहीं है
<AdaptationSet>
से कम.
हर <AdaptationSet>
में, <Representation>
टैग की एक सूची होनी चाहिए
मौजूद होना चाहिए और Web रिसीवर प्लेयर codecs
जानकारी का इस्तेमाल इन कामों के लिए करता है
MSE सोर्स बफ़र और 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
एट्रिब्यूट से इसकी जानकारी मिलती है
यह बताता है कि एक ही अवधि के कितने सेगमेंट दोहराए जाते हैं, ताकि $Time$
का हिसाब लगाने के लिए,
media
एट्रिब्यूट.
<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 के इस्तेमाल के मुख्य उदाहरणों को यहां सपोर्ट करता है उन सामान्य एट्रिब्यूट की सूची है जिन्हें लागू करने के लिए, डैश का इस्तेमाल किया गया है अनदेखा करता है या इस्तेमाल नहीं करता है. इसका मतलब है, भले ही मेनिफ़ेस्ट में ये चीज़ें शामिल हों तो वीडियो चलाने के अनुभव पर उनका कोई असर नहीं पड़ता.
- availabilityStartTime
- segmentAlignment
एचटीटीपी लाइव स्ट्रीमिंग (HLS)
एचटीटीपी लाइव स्ट्रीमिंग की खास जानकारी और पूरी जानकारी हासिल की जा सकती है यहां पढ़ें.
वेब रिसीवर प्लेयर की एक मुख्य विशेषता उसका समर्थन करने की क्षमता है MSE में HLS को वीडियो चलाने की सुविधा हो. यह DASH से अलग है. इसमें मेनिफ़ेस्ट फ़ाइल एक ही फ़ॉर्मैट में आती है फ़ाइल अपलोड करने पर, 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 इस्तेमाल करने की अनुमति है. सेटिंग
YES के लिए DEFAULT एट्रिब्यूट का इस्तेमाल करने पर, यह पता चलेगा कि
डिफ़ॉल्ट रूप से इस वैकल्पिक स्ट्रीम को शामिल करता है. |
यहां उन एचएलएस टैग की सूची दी गई है जो फ़िलहाल Web रिसीवर प्लेयर के साथ काम करते हैं मीडिया प्लेलिस्ट:
टैग का नाम | फ़ंक्शन |
---|---|
#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
नंबर का इस्तेमाल किया जाएगा. ध्यान दें कि
एचएलएस स्पेसिफ़िकेशन में, हम मैच करने के लिए फ़ाइल के नाम की तुलना नहीं करते.
एचएलएस को लागू करने के लिए, एक और ऑडियो स्ट्रीम चुनी जा सकती है. जैसे
5.1 सराउंड साउंड, मुख्य ऑडियो प्लेबैक के तौर पर. यह काम इस तरह किया जा सकता है
आपके पास वैकल्पिक कोडेक के साथ #EXT-X-MEDIA
टैग होना चाहिए. साथ ही,
स्ट्रीम कॉन्फ़िगरेशन में सेगमेंट का फ़ॉर्मैट.
वेब रिसीवर प्लेयर को कुछ विशिष्ट विशिष्टता की आवश्यकता होती है. उदाहरण के लिए,
#EXT-INF
टैग है, तो हम यूआरआई की उम्मीद करते हैं. अगर यह यूआरआई नहीं है, तो उदाहरण के लिए
#EXT-X-DISCOUNTINUITY
की वजह से प्लेलिस्ट को पार्स नहीं किया जा सकेगा.
हर #EXT-X-TARGETDURATION
सेकंड में, हम प्लेलिस्ट/मेनिफ़ेस्ट को फिर से लोड करते हैं
को नई सेगमेंट बनाने के साथ-साथ, हम
सेगमेंट को नए सेगमेंट में बांटें. जब भी खोज का अनुरोध किया जाता है, तब हम
खोजी जा सकने वाली रेंज. लाइव के लिए, हम सिर्फ़ शुरुआत से वीडियो देखने की अनुमति देते हैं
सबसे नई सूची को अंत से तीन टारगेट अवधि तक रखा जा सकता है. इसलिए, उदाहरण के लिए,
अगर आपके पास 10 सेगमेंट की सूची है और आप सेगमेंट 6 पर हैं, तो
7 तक, लेकिन 8 नहीं.
सेगमेंट फ़ॉर्मैट के लिए सहायता
सीएएफ़ 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"
अब हम Widevine के साथ काम करने वाले KEYFORMAT
का इस्तेमाल करते हैं. साथ ही, यूआरआई में
BASE64 एन्कोडेड डीआरएम जानकारी XXXXXXX
जिसे डिकोड किए जाने पर कुंजी आईडी शामिल होता है:
{
"content_id": "MTQ1NjkzNzM1NDgxNA==",
"key_ids": [
"xxxxxxxxxxxxxxxx"
]
}
वर्शन 1 में ये एट्रिब्यूट बताए गए हैं:
एट्रिब्यूट | उदाहरण | ब्यौरा |
---|---|---|
KEYFORMATVERSIONS |
"1" |
इस प्रस्ताव में मुख्य फ़ॉर्मैट वर्शन 1 के बारे में बताया गया है |
KEYFORMAT |
"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" |
UUID, DASH IF IOP का Widevine UUID है. Widevine से एन्क्रिप्ट (सुरक्षित) की गई स्ट्रीम के लिए, एमपीडी में इसी स्ट्रिंग का इस्तेमाल किया जाता है. |
URI |
"data:text/plain;base64, <base64 encoded PSSH box>" |
उस स्ट्रीम का यूआरआई जिसमें डेटा टाइप और PSSH बॉक्स है. |
METHOD |
SAMPLE-AES-CTR |
यह कॉन्टेंट को एन्क्रिप्ट करने के लिए इस्तेमाल किए गए, एन्क्रिप्ट करने के तरीके के साइफ़र के बारे में बताता है. SAMPLE-AES से पता चलता है कि कॉन्टेंट को ‘cbcs’ का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किया गया है. SAMPLE-AES-CTR सिग्नल को यह संकेत देता है कि सामग्री को AES-CTR सुरक्षा स्कीम, यानी 'सेंस' में से एक का इस्तेमाल करके एन्क्रिप्ट किया गया है. |
DASH MPD में मैप की गई विशेषताएं:
एट्रिब्यूट | ब्यौरा |
---|---|
KEYFORMAT |
ContentProtection एलिमेंट का schemaIdUri एट्रिब्यूट. |
URI |
cenc:pssh एलिमेंट का कॉन्टेंट. |
KEYID |
कुंजी आईडी को कोड में बदलने वाला 16-बाइट का हेक्साडेसिमल स्ट्रिंग, जिसकी भूमिका MPEG DASH में default_kid के जैसी ही है. अगर हैरारकी वाली कुंजी स्कीम का इस्तेमाल किया जा रहा है, तो यह "रूट" होगा बटन दबाएं. |
वर्शन 2 सिग्नल के साथ एचएलएस प्लेलिस्ट का उदाहरण:
#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
यहां एचएलएस की उन सुविधाओं और टैग की सूची दी गई है जिन्हें हम फ़िलहाल इस्तेमाल नहीं करते या सहायता. इनके होने या न होने से, स्ट्रीमिंग के तरीके पर कोई असर नहीं पड़ता.
#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 के समान). DASH से अलग, स्मूद स्ट्रीमिंग का सुझाव मीडिया सेगमेंट के लिए, सिर्फ़ MPEG-4 पैकेजिंग.
यहां स्मूद स्ट्रीमिंग में सबसे आम टैग और एट्रिब्यूट की जानकारी दी गई है वेब रिसीवर प्लेयर का इस्तेमाल आज किया जा सकता है. कई कॉन्सेप्ट के बारे में यहां पहले ही बताया गया है ऊपर दिया गया DASH अनुभाग.
टैग/एट्रिब्यूट | इस्तेमाल |
---|---|
<SmoothStreamingMedia> | मेनिफ़ेस्ट के मुख्य टैग में ये एट्रिब्यूट शामिल होते हैं:
|
<StreamIndex> | स्ट्रीम का एक सेट, जो DASH के AdaptationSet से मिलता-जुलता है. आम तौर पर, यह टाइप होता है "टेक्स्ट", "वीडियो" या "ऑडियो". यूआरएल एट्रिब्यूट में आम तौर पर, टेंप्लेट वाला टेंप्लेट शामिल होता है फ़्रैगमेंट यूआरएल, जो बिटरेट या शुरू होने के समय जैसी जानकारी का इस्तेमाल करता है. |
<QualityLevel> | हर क्वालिटी लेवल टैग अपने बिटरेट और फ़ोर्सीसी कोडेक के बारे में बताता है. द फ़ोरसीसी कोड अक्सर ‘H264’, ‘AVC1’, ‘AACL’ वगैरह होते हैं. वीडियो के लिए, यह Maxwidth और MaxHight के ज़रिए रिज़ॉल्यूशन. ऑडियो के लिए, यह सैंपलिंग रेट और चैनलों की संख्या के ज़रिए, फ़्रीक्वेंसी (जैसे कि 44100). |
<c> | स्ट्रीम फ़्रैगमेंट एलिमेंट. इसमें शामिल हैं:
|
<Protection> | वैकल्पिक SystemID एट्रिब्यूट वाला टैग, जिसमें सिस्टम का आईडी शामिल है <softStreamingMedia> के तहत इस्तेमाल करने के लिए डीआरएम टैग के साथ जोड़ा जा सकता है. |
<ProtectionHeader> | <Protection> में जाकर, SystemID और कस्टम प्रॉपर्टी आम तौर पर, Base64 कोड में बदला गया होता है. Widevine के लिए, इसमें कुंजी आईडी, कुंजी लंबाई, एल्गोरिदम आईडी, जैसे कि AESCTR, LA_URL (लाइसेंस पाने का यूआरएल), LUI_URL (लाइसेंस यूज़र इंटरफ़ेस यूआरएल) और DS_ID (डोमेन सेवा आईडी). |
कॉन्टेंट की सुरक्षा
सुरक्षा सिस्टम आईडी को सही तरीके से कोड में बदलने के लिए, कृपया नीचे दी गई मैपिंग का इस्तेमाल करें:
- वाइडविन: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
- CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
<ProtectionHeader>
के लिए, यहां Base64 कोड में बदले गए डेटा का उदाहरण दिया गया है. कॉन्टेंट बनाने
जब डेटा को डिकोड किया जाता है, तो वह उसी फ़ॉर्मैट में होता है जैसा कि
DASH कॉन्टेंट की सुरक्षा से जुड़ी सहायता ऊपर दी गई है.
<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 के क्वालिटी लेवल पर हैं) होंगे जिसे शुरुआती समय में t="80649401378125" से लिया गया है के अंतर्गत वीडियो StreamIndex और 4 सेकंड की वृद्धि * 10000000 प्रति सेगमेंट:
QualityLevels(2)/Fragments(video=80649401378125) QualityLevels(2)/Fragments(video=80649441378125) ...
यहां स्मूद स्ट्रीमिंग एट्रिब्यूट की सूची दी गई है, जिन्हें हम फ़िलहाल अनदेखा करते हैं और हमारे पास ये हैं स्ट्रीमिंग की सुविधाओं पर कोई असर नहीं पड़ता. भले ही, ये सुविधाएं उपलब्ध कराई गई हों:
<SmoothStreamingMedia>
टैग में CanSeek, CanPause.<StreamIndex>
टैग में चंक, क्वालिटी लेवल. इसके बजाय, हम सेगमेंट की संख्या और जानकारी के आधार पर क्वालिटी लेवल की संख्या<StreamIndex>
के अंदर दिया गया है, जैसे कि असलQualityLevel
टैग और<c>
टैग.- BitsPerSample,
<QualityLevel>
में PacketSize का इस्तेमाल नहीं किया जाता.
डिसप्ले का टाइप देखें
canDisplayType
यह तरीका वेब रिसीवर डिवाइस की वीडियो और ऑडियो क्षमताओं की जांच करता है और
को पास किए गए मीडिया पैरामीटर की पुष्टि करके, बूलियन लौटाता है. सभी
पैरामीटर बनाना सही है, लेकिन पहला वैकल्पिक होता है — जितने ज़्यादा पैरामीटर शामिल किए जाएंगे,
इससे जाँच ज़्यादा सटीक तरीके से होगी.
इसका हस्ताक्षर canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
है
उदाहरण:
यह जांच करता है कि वेब रिसीवर डिवाइस और डिसप्ले वीडियो/mp4 के साथ काम करते हैं या नहीं इस खास कोडेक, डाइमेंशन, और फ़्रेमरेट के साथ mimetype:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
यह जांच करता है कि वेब रिसीवर डिवाइस और डिसप्ले 4K वीडियो फ़ॉर्मैट के साथ काम करता है या नहीं इस कोडेक के लिए, 3840 की चौड़ाई और 2160 की ऊंचाई तय करें:
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)
डीआरएम
कुछ मीडिया कॉन्टेंट के लिए, डिजिटल राइट मैनेजमेंट (डीआरएम) की ज़रूरत होती है. मीडिया कॉन्टेंट के लिए
जिसके मेनिफ़ेस्ट (DASH या HLS) में डीआरएम लाइसेंस (और मुख्य यूआरएल) सेव हो,
Cast 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
को क्लाउड से कास्ट डिवाइस पर शुरू किया जाता है. इसके लिए यह ज़रूरी है कि
क्रेडेंशियल डालें. इसके बाद वेब रिसीवर ऐप्लिकेशन लिखने वाले ऐप्लिकेशन
ज़रूरत के मुताबिक डीआरएम ऑपरेट करने के लिए setCredentials
जानकारी. यहां इसका एक उदाहरण दिया गया है
करने के लिए क्रेडेंशियल का इस्तेमाल करें.
सलाह: contentId, contentUrl और इकाई का इस्तेमाल करके मीडिया लोड करना भी देखें.
ऑडियो चैनल मैनेज करना
जब Cast प्लेयर मीडिया लोड करता है, तब यह एक ऑडियो सोर्स बफ़र सेट अप करता है. पर साथ ही, यह बफ़र में इस्तेमाल होने के लिए सही कोडेक भी चुनता है, जो मुख्य ट्रैक के एमआईएमई टाइप के हिसाब से होनी चाहिए. एक नया बफ़र और कोडेक सेट अप किया गया है:
- प्लेबैक शुरू होने पर,
- विज्ञापन के लिए हर ब्रेक पर, और
- का इस्तेमाल किया जा सकता है.
क्योंकि बफ़र एक कोडेक का इस्तेमाल करता है और कोडेक को चुना जाता है प्राइमरी ट्रैक के आधार पर, कुछ ऐसे मामले होते हैं जिनमें सेकंडरी ट्रैक कॉल को फ़िल्टर किया गया, लेकिन वह सुनाई नहीं दिया. ऐसा तब हो सकता है, जब किसी मीडिया प्रोग्राम का प्राइमरी वह ट्रैक सराउंड साउंड में हो, लेकिन दूसरे ऑडियो ट्रैक में स्टीरियो साउंड का इस्तेमाल किया गया हो. क्योंकि सेकंडरी ट्रैक का इस्तेमाल, अक्सर वैकल्पिक फ़ॉर्मैट में कॉन्टेंट उपलब्ध कराने के लिए किया जाता है भाषाओं के लिए, अलग-अलग संख्या में ट्रैक वाला मीडिया उपलब्ध कराने पर जैसे, बड़ी संख्या में दर्शक सुन न पाएं अपनी मातृभाषा में कॉन्टेंट पोस्ट कर सकें.
इन स्थितियों में बताया गया है कि प्रोग्रामिंग उपलब्ध कराना क्यों ज़रूरी है जहां प्राइमरी और सेकंडरी ट्रैक में समान संख्या में चैनल हों:
पहली स्थिति - मीडिया स्ट्रीम में चैनल नहीं है प्राइमरी और सेकंडरी ट्रैक में समानता:
- अंग्रेज़ी - AC-3 5.1 चैनल (मुख्य)
- स्वीडिश - AAC 2-channel
- फ़्रेंच - 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), चैनल की डिफ़ॉल्ट संख्या दो होती है. यह संख्या उस मीडिया का पता लगाने के लिए उठाए जाने वाले कदम ऑडियो ट्रैक.
अगर मुख्य ट्रैक सराउंड साउंड नहीं है (उदाहरण के लिए, दो चैनल वाला स्टीरियो ट्रैक), तो Shaka प्लेयर डिफ़ॉल्ट रूप से दो चैनल पर सेट हो जाएगा और ऐसे किसी भी सेकंडरी मीडिया ट्रैक को अपने-आप फ़िल्टर कर देगा जिसमें दो से ज़्यादा चैनल.
शाका के पसंदीदा ऑडियो चैनलों को सेटिंग की मदद से भी कॉन्फ़िगर किया जा सकता है
इस तारीख को shakaConfig
प्रॉपर्टी में preferredAudioChannelCount
cast.framework.PlaybackConfig.
उदाहरण के लिए:
shakaConfig = { "preferredAudioChannelCount": 6 };
preferredAudioChannelCount
को 6 पर सेट करने पर, Shaka Player जांच करता है कि क्या
यह सराउंड साउंड कोडेक (AC-3
या EC-3
) के साथ काम कर सकता है और
ऐसे मीडिया ट्रैक को अपने-आप फ़िल्टर कर देता है जो हमारी
चैनलों की संख्या.