ईएमई क्या है?

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

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

EME, HTMLMediaElement स्पेसिफ़िकेशन का एक एक्सटेंशन है — इसलिए यह नाम है. 'एक्सटेंशन' होने का मतलब है कि ब्राउज़र पर ईएमई के लिए काम करना ज़रूरी नहीं है: अगर किसी ब्राउज़र पर एन्क्रिप्ट (सुरक्षित) किया गया मीडिया काम नहीं करता, तो वह एन्क्रिप्ट (सुरक्षित) किया गया मीडिया नहीं चला पाएगा. हालांकि, एचटीएमएल की खास बातों का पालन करने के लिए, ईएमई की ज़रूरत नहीं होती. EME की खास जानकारी से:

इस प्रस्ताव में, सुरक्षित कॉन्टेंट को चलाने को कंट्रोल करने के लिए, एपीआई उपलब्ध कराने वाले HTMLMediaElement के बारे में भी बताया गया है.

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

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

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

ईएमई लागू करने के लिए, इन बाहरी कॉम्पोनेंट का इस्तेमाल किया जाता है:

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

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

ईएमई कैसे काम करता है?

यहां बताया गया है कि ईएमई के कॉम्पोनेंट, नीचे दिए गए कोड के उदाहरण के मुताबिक कैसे इंटरैक्ट करते हैं:

अगर एक से ज़्यादा फ़ॉर्मैट या कोडेक उपलब्ध हैं, तो MediaSource.isTypeSupported() या HTMLMediaElement.canPlayType() दोनों का इस्तेमाल करके, सही फ़ॉर्मैट या कोडेक चुना जा सकता है. हालांकि, सीडीएम सिर्फ़ उस सबसेट के लिए काम करता है जो ब्राउज़र पर एन्क्रिप्ट (सुरक्षित) नहीं किए गए कॉन्टेंट के साथ काम करता है. फ़ॉर्मैट और कोडेक चुनने से पहले, MediaKeys कॉन्फ़िगरेशन की समीक्षा करना सबसे अच्छा होता है. अगर ऐप्लिकेशन, एन्क्रिप्ट किए गए इवेंट की इंतज़ार करता है, लेकिन MediaKeys दिखाता है कि वह चुने गए फ़ॉर्मैट/कोडेक को हैंडल नहीं कर सकता, तो प्लेबैक में रुकावट डाले बिना स्विच करने में बहुत देरी हो सकती है.

हमारा सुझाव है कि पहले MediaKeys के लिए नेगोशिएट करें. इसके लिए MediaKeysSystemAccess.getConfiguration() का इस्तेमाल करें, ताकि तय किए गए कॉन्फ़िगरेशन का पता लगाया जा सके.

अगर चुनने के लिए सिर्फ़ एक ही फ़ॉर्मैट/कोडेक है, तो getConfiguration() की ज़रूरत नहीं है. हालांकि, पहले MediaKeys को सेट अप करने को प्राथमिकता दी जाएगी. एन्क्रिप्ट (सुरक्षित) किए गए इवेंट के लिए इंतज़ार करने की वजह सिर्फ़ तब होती है, जब यह जानने का कोई तरीका न हो कि कॉन्टेंट को एन्क्रिप्ट (सुरक्षित) किया गया है या नहीं. हालांकि, इस बात की संभावना ज़्यादा होती है.

  1. वेब ऐप्लिकेशन ऐसे ऑडियो या वीडियो को चलाने की कोशिश करता है जिसमें एन्क्रिप्ट की गई एक या ज़्यादा स्ट्रीम हों.
  2. ब्राउज़र यह पता लगाता है कि मीडिया एन्क्रिप्ट (सुरक्षित) किया गया है (ऐसा करने का तरीका जानने के लिए, नीचे दिया गया बॉक्स देखें). साथ ही, ब्राउज़र, एन्क्रिप्ट (सुरक्षित) किए गए इवेंट को मीडिया से मिले मेटाडेटा (initData) के साथ सक्रिय करता है.
  3. यह ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) किए गए इवेंट को मैनेज करता है:

    1. अगर मीडिया एलिमेंट के साथ कोई MediaKeys ऑब्जेक्ट नहीं जोड़ा गया है, तो पहले navigator.requestMediaKeySystemAccess() का इस्तेमाल करके किसी उपलब्ध 'की सिस्टम' को चुनें. इससे यह पता लगाया जा सकेगा कि कौनसे मुख्य सिस्टम उपलब्ध हैं. इसके बाद, MediaKeySystemAccess ऑब्जेक्ट की मदद से, किसी उपलब्ध कुंजी सिस्टम के लिए, MediaKeys ऑब्जेक्ट बनाएं. ध्यान दें कि MediaKeys ऑब्जेक्ट को, एन्क्रिप्ट किए गए पहले इवेंट से पहले शुरू किया जाना चाहिए. ऐप्लिकेशन, लाइसेंस सर्वर का यूआरएल पाने के लिए, उपलब्ध कुंजी सिस्टम को स्वतंत्र रूप से चुनता है. MediaKeys ऑब्जेक्ट, किसी ऑडियो या वीडियो एलिमेंट के लिए मीडिया को डिक्रिप्ट करने के लिए उपलब्ध सभी कुंजियों को दिखाता है. यह एक सीडीएम इंस्टेंस के बारे में बताता है और खास तौर पर मुख्य सेशन बनाने के लिए सीडीएम को ऐक्सेस देता है. इसका इस्तेमाल लाइसेंस सर्वर से कुंजियां पाने के लिए किया जाता है.

    2. MediaKeys ऑब्जेक्ट बनने के बाद, इसे मीडिया एलिमेंट को असाइन करें: setMediaKeys() की मदद से, MediaKeys ऑब्जेक्ट को एक HTMLMediaElement के साथ जोड़ा जा सकता है. इससे प्लेबैक के दौरान यानी कि डिकोड करने के दौरान, इसकी कुंजियों का इस्तेमाल किया जा सकेगा.

  4. यह ऐप्लिकेशन, MediaKeys पर createSession() को कॉल करके MediaKeySession बनाता है. इससे एक MediaKeySession बनाई जाती है, जो लाइसेंस और उसकी कुंजियों के लाइफ़टाइम को दिखाती है.

  5. ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) किए गए हैंडलर से मिले मीडिया डेटा को सीडीएम के पास भेजकर, लाइसेंस का अनुरोध करता है. इसके लिए, MediaKeySession पर generateRequest() को कॉल किया जाता है.

  6. सीडीएम एक मैसेज इवेंट सक्रिय करता है: इसमें लाइसेंस सर्वर से कुंजी हासिल करने का अनुरोध किया जाता है.

  7. MediaKeySession ऑब्जेक्ट को मैसेज इवेंट मिलता है. साथ ही, ऐप्लिकेशन, लाइसेंस सर्वर को (उदाहरण के लिए, XHR के ज़रिए) एक मैसेज भेजता है.

  8. ऐप्लिकेशन को लाइसेंस सर्वर से रिस्पॉन्स मिलता है और वह MediaKeySession के अपडेट() तरीके का इस्तेमाल करके, डेटा को सीडीएम को भेजता है.

  9. सीडीएम, लाइसेंस में दिए गए बटन का इस्तेमाल करके मीडिया को डिक्रिप्ट करता है. मीडिया एलिमेंट से जुड़े MediaKeys के किसी भी सेशन में, सही कुंजी का इस्तेमाल किया जा सकता है. सीडीएम, कुंजी और नीति को ऐक्सेस करेगा. इसे कुंजी के आईडी से इंडेक्स किया जाएगा.

मीडिया प्लेबैक फिर से शुरू हो जाएगा.

ब्राउज़र को कैसे पता चलता है कि मीडिया एन्क्रिप्ट (सुरक्षित) किया गया है?

यह जानकारी मीडिया कंटेनर फ़ाइल के मेटाडेटा में है, जो ISO BMFF या WebM जैसे फ़ॉर्मैट में होगा. आईएसओ बीएमएफ़एफ़ के लिए इसका मतलब हेडर मेटाडेटा है. इसे प्रोटेक्शन स्कीम जानकारी बॉक्स कहा जाता है. WebM में कुछ WebM-खास सुविधाओं के साथ, Matroska ContentEncrypt एलिमेंट का इस्तेमाल किया जाता है. ईएमई पर आधारित रजिस्ट्री में मौजूद हर कंटेनर के लिए दिशा-निर्देश दिए जाते हैं.

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

लेकिन, सीडीएम असल में क्या करते हैं?

ईएमई लागू करने से, मीडिया को डिक्रिप्ट नहीं किया जा सकता: इससे, वेब ऐप्लिकेशन को सिर्फ़ एक एपीआई मिलता है, ताकि कॉन्टेंट डिक्रिप्शन मॉड्यूल का इस्तेमाल किया जा सके.

सीडीएम असल में क्या करते हैं, इसे ईएमई स्पेसिफ़िकेशन में तय नहीं किया जाता. सीडीएम, मीडिया के साथ-साथ डिकोडिंग (डिकंप्रेशन) को भी हैंडल कर सकता है. सीडीएम फ़ंक्शन के लिए, कम से कम से लेकर सबसे बेहतर विकल्प तक कई विकल्प मौजूद हैं:

  • सिर्फ़ डिक्रिप्शन, यानी सामान्य मीडिया पाइपलाइन का इस्तेमाल करके वीडियो चलाने की सुविधा. उदाहरण के लिए, किसी <video> एलिमेंट के ज़रिए.
  • रेंडरिंग के लिए वीडियो फ़्रेम को ब्राउज़र पर पास करना, वीडियो फ़्रेम को डिकोड करना और डिकोड करना.
  • डीकोड करना और उसे डिकोड करना, सीधे हार्डवेयर में रेंडर करना. उदाहरण के लिए, जीपीयू.

किसी वेब ऐप्लिकेशन पर सीडीएम उपलब्ध कराने के कई तरीके हैं:

  • ब्राउज़र के साथ सीडीएम बंडल करें.
  • सीडीएम को अलग से डिस्ट्रिब्यूट करें.
  • ऑपरेटिंग सिस्टम में कोई सीडीएम बनाएं.
  • फ़र्मवेयर में सीडीएम शामिल करें.
  • हार्डवेयर में सीडीएम एम्बेड करें.

सीडीएम को किस तरह उपलब्ध कराया जाता है, यह ईएमई स्पेसिफ़िकेशन में तय नहीं किया जाता. हालांकि, सभी मामलों में ब्राउज़र, सीडीएम की जांच करने और उसे सार्वजनिक करने के लिए ज़िम्मेदार होता है.

ईएमई किसी खास 'की' सिस्टम को ज़रूरी नहीं करता. मौजूदा डेस्कटॉप और मोबाइल ब्राउज़र में Chrome, Widevine पर काम करता है और IE11, PlayReady के साथ काम करता है.

लाइसेंस सर्वर से कुंजी पाना

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

यह कोड (खास जानकारी के उदाहरणों से लिया गया) दिखाता है कि कोई ऐप्लिकेशन, सही कुंजी सिस्टम कैसे चुन सकता है और लाइसेंस सर्वर से कुंजी कैसे पा सकता है.

    var video = document.querySelector('video');

    var config = [{initDataTypes: ['webm'],
      videoCapabilities: [{contentType: 'video/webm; codecs="vp09.00.10.08"'}]}];

    if (!video.mediaKeys) {
      navigator.requestMediaKeySystemAccess('org.w3.clearkey',
          config).then(
        function(keySystemAccess) {
          var promise = keySystemAccess.createMediaKeys();
          promise.catch(
            console.error.bind(console, 'Unable to create MediaKeys')
          );
          promise.then(
            function(createdMediaKeys) {
              return video.setMediaKeys(createdMediaKeys);
            }
          ).catch(
            console.error.bind(console, 'Unable to set MediaKeys')
          );
          promise.then(
            function(createdMediaKeys) {
              var initData = new Uint8Array([...]);
              var keySession = createdMediaKeys.createSession();
              keySession.addEventListener('message', handleMessage,
                  false);
              return keySession.generateRequest('webm', initData);
            }
          ).catch(
            console.error.bind(console,
              'Unable to create or initialize key session')
          );
        }
      );
    }

    function handleMessage(event) {
      var keySession = event.target;
      var license = new Uint8Array([...]);
      keySession.update(license).catch(
        console.error.bind(console, 'update() failed')
      );
    }

एन्क्रिप्ट (सुरक्षित) करने का सामान्य तरीका

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

इसके उलट, ऐसे लेगसी सलूशन के उलट होता है जो सिर्फ़ एक पूरे वर्टिकल स्टैक के साथ काम करते हैं. इसमें एक क्लाइंट ऐसा होता है जिसमें अक्सर ऐप्लिकेशन रनटाइम भी शामिल होता है.

सामान्य एन्क्रिप्शन (सीईएनसी), आईएसओ बीएमएफ़एफ़ के लिए सुरक्षा स्कीम तय करने वाला एक आईएसओ स्टैंडर्ड है. इसी तरह का सिद्धांत WebM पर लागू होता है.

कुंजी हटाएं

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

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

// Define a key: hardcoded in this example
// – this corresponds to the key used for encryption
var KEY = new Uint8Array([
  0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b, 0x68, 0xef, 0x12, 0x2a, 0xfc,
  0xe4, 0xae, 0x3c,
]);

var config = [
  {
    initDataTypes: ['webm'],
    videoCapabilities: [
      {
        contentType: 'video/webm; codecs="vp8"',
      },
    ],
  },
];

var video = document.querySelector('video');
video.addEventListener('encrypted', handleEncrypted, false);

navigator
  .requestMediaKeySystemAccess('org.w3.clearkey', config)
  .then(function (keySystemAccess) {
    return keySystemAccess.createMediaKeys();
  })
  .then(function (createdMediaKeys) {
    return video.setMediaKeys(createdMediaKeys);
  })
  .catch(function (error) {
    console.error('Failed to set up MediaKeys', error);
  });

function handleEncrypted(event) {
  var session = video.mediaKeys.createSession();
  session.addEventListener('message', handleMessage, false);
  session
    .generateRequest(event.initDataType, event.initData)
    .catch(function (error) {
      console.error('Failed to generate a license request', error);
    });
}

function handleMessage(event) {
  // If you had a license server, you would make an asynchronous XMLHttpRequest
  // with event.message as the body.  The response from the server, as a
  // Uint8Array, would then be passed to session.update().
  // Instead, we will generate the license synchronously on the client, using
  // the hard-coded KEY at the top.
  var license = generateLicense(event.message);

  var session = event.target;
  session.update(license).catch(function (error) {
    console.error('Failed to update the session', error);
  });
}

// Convert Uint8Array into base64 using base64url alphabet, without padding.
function toBase64(u8arr) {
  return btoa(String.fromCharCode.apply(null, u8arr))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=*$/, '');
}

// This takes the place of a license server.
// kids is an array of base64-encoded key IDs
// keys is an array of base64-encoded keys
function generateLicense(message) {
  // Parse the clearkey license request.
  var request = JSON.parse(new TextDecoder().decode(message));
  // We only know one key, so there should only be one key ID.
  // A real license server could easily serve multiple keys.
  console.assert(request.kids.length === 1);

  var keyObj = {
    kty: 'oct',
    alg: 'A128KW',
    kid: request.kids[0],
    k: toBase64(KEY),
  };
  return new TextEncoder().encode(
    JSON.stringify({
      keys: [keyObj],
    }),
  );
}

इस कोड की जांच करने के लिए, आपको एन्क्रिप्ट (सुरक्षित) किया गया वीडियो चलाना होगा. साफ़ कुंजी के साथ उपयोग के लिए किसी वीडियो को एन्क्रिप्ट करना, webm_crypt निर्देशों के अनुसार WebM के लिए किया जा सकता है. व्यावसायिक सेवाएं भी उपलब्ध हैं (कम से कम ISO बीएमएफ़एफ़/एमपी4 के लिए) और अन्य समाधान डेवलप किए जा रहे हैं.

HTMLMediaElement एक ऐसी चीज़ है जो सामान्य ब्यूटी से जुड़ी होती है.

हम बस एक src यूआरएल देकर, मीडिया को लोड, डिकोड, और चला सकते हैं:

<video src="foo.webm"></video>

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

MSE, ईएमई के लिए क्यों ज़रूरी है? व्यावसायिक कॉन्टेंट देने वालों को, सुरक्षित कॉन्टेंट बांटने के साथ-साथ, नेटवर्क और अन्य ज़रूरी शर्तों के हिसाब से भी कॉन्टेंट डिलीवरी करने की सुविधा मिलनी चाहिए. उदाहरण के लिए, Netflix, नेटवर्क की स्थितियों में बदलाव होने पर स्ट्रीम बिटरेट डाइनैमिक रूप से बदलता है. ईएमई, MSE (MSA) को लागू करने से मिलने वाली मीडिया स्ट्रीम को चलाने की सुविधा के साथ काम करता है.

अलग-अलग बिटरेट के हिसाब से कोड में बदले गए मीडिया को कैसे अलग-अलग करें और चलाएं? नीचे दिया गया DASH सेक्शन देखें.

MSE को SIMpl.info/mse पर काम करता हुआ देखा जा सकता है. इस उदाहरण में, File API का इस्तेमाल करके, WebM वीडियो को पांच हिस्सों में बांटा गया है. किसी प्रोडक्शन ऐप्लिकेशन में, कई वीडियो को AJAX के ज़रिए वापस लाया जाएगा.

सबसे पहले एक SourceBuffer बनाया जाता है:

var sourceBuffer = mediaSource.addSourceBuffer(
  'video/webm; codecs="vorbis,vp8"',
);

इसके बाद, EngageBuffer() तरीके का इस्तेमाल करके हर हिस्से को जोड़कर पूरी मूवी को वीडियो एलिमेंट के साथ 'स्ट्रीम' किया जाता है:

reader.onload = function (e) {
  sourceBuffer.appendBuffer(new Uint8Array(e.target.result));
  if (i === NUM_CHUNKS - 1) {
    mediaSource.endOfStream();
  } else {
    if (video.paused) {
      // start playing after first chunk is appended
      video.play();
    }
    readChunk_(++i);
  }
};

एमएसई प्राइमर में MSE के बारे में ज़्यादा जानें.

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

DASH (यानी MPEG-DASH) को इस तरह से डिज़ाइन किया गया है कि वह स्ट्रीमिंग और डाउनलोड, दोनों के लिए अनियमित दुनिया में सबसे अच्छी मीडिया डिलीवरी कर सके. कई दूसरी टेक्नोलॉजी भी इसी तरह की चीज़ें करती हैं — जैसे कि Apple की एचटीटीपी लाइव स्ट्रीमिंग (HLS) और Microsoft की स्मूद स्ट्रीमिंग — लेकिन DASH एचटीटीपी के ज़रिए अडैप्टिव बिटरेट स्ट्रीमिंग का इकलौता तरीका है, जो ओपन स्टैंडर्ड पर आधारित है. YouTube जैसी साइटें DASH का पहले से इस्तेमाल कर रही हैं.

इसका ईएमई और एमएसई के साथ क्या संबंध है? MSE-आधारित DASH लागू करने से, मेनिफ़ेस्ट को पार्स किया जा सकता है, वीडियो के सेगमेंट को सही बिटरेट पर डाउनलोड किया जा सकता है, और जब उसे कुछ इस्तेमाल करना हो, तो मौजूदा एचटीटीपी इन्फ़्रास्ट्रक्चर का इस्तेमाल करके, उसे वीडियो एलिमेंट में फ़ीड कर सकते हैं.

दूसरे शब्दों में, DASH व्यावसायिक कॉन्टेंट देने वालों को, सुरक्षित कॉन्टेंट की अडैप्टिव स्ट्रीमिंग करने की सुविधा देता है.

DASH टिन के बारे में वही जानकारी देता है:

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

BBC ने DASH का इस्तेमाल करके टेस्ट स्ट्रीम उपलब्ध कराना शुरू कर दिया है:

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

खास जानकारी:

  1. मीडिया को अलग-अलग बिटरेट के हिसाब से एन्कोड किया जाता है.
  2. अलग-अलग बिटरेट वाली फ़ाइलें, किसी एचटीटीपी सर्वर से उपलब्ध कराई जाती हैं.
  3. क्लाइंट वेब ऐप्लिकेशन यह चुनता है कि किस बिटरेट को वापस पाना है और DASH के साथ चलाना है.

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

    <MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" mediaPresentationDuration="PT0H3M1.63S" minBufferTime="PT1.5S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011"
    type="static">
      <Period duration="PT0H3M1.63S" start="PT0S">
        <AdaptationSet>
          <ContentComponent contentType="video" id="1" />
          <Representation bandwidth="4190760" codecs="avc1.640028" height="1080" id="1" mimeType="video/mp4" width="1920">
            <BaseURL>car-20120827-89.mp4</BaseURL>
            <SegmentBase indexRange="674-1149">
              <Initialization range="0-673" />
            </SegmentBase>
          </Representation>
          <Representation bandwidth="2073921" codecs="avc1.4d401f" height="720" id="2" mimeType="video/mp4" width="1280">
            <BaseURL>car-20120827-88.mp4</BaseURL>
            <SegmentBase indexRange="708-1183">
              <Initialization range="0-707" />
            </SegmentBase>
          </Representation>

          …

        </AdaptationSet>
      </Period>
    </MPD>

(यह एक्सएमएल, YouTube DASH डेमो प्लेयर के लिए इस्तेमाल की गई .mpd फ़ाइल से लिया गया है.)

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

Mozilla डेवलपर नेटवर्क ने वीडियो को सेगमेंट करने और MPD बनाने के लिए, WebM टूल और FFmpeg का इस्तेमाल करने के निर्देश दिए हैं.

नतीजा

पैसे चुकाकर वीडियो और ऑडियो चलाने के लिए वेब का इस्तेमाल बहुत तेज़ी से बढ़ रहा है. ऐसा लगता है कि हर नया डिवाइस, चाहे वह टैबलेट हो, गेम कंसोल हो, कनेक्टेड टीवी हो या सेट-टॉप बॉक्स हो, एचटीटीपी पर मुख्य कॉन्टेंट देने वालों के मीडिया स्ट्रीम कर सकता है. 85%से ज़्यादा मोबाइल और डेस्कटॉप ब्राउज़र, अब <video> और <audio> पर काम करते हैं. Cisco का अनुमान है कि साल 2017 तक, दुनिया भर में उपभोक्ताओं के लिए वीडियो से आने वाले इंटरनेट ट्रैफ़िक का 80 से 90 प्रतिशत हिस्सा बन जाएगा. इस मामले में, सुरक्षित कॉन्टेंट डिस्ट्रिब्यूशन के लिए, ब्राउज़र के इस्तेमाल की संभावना ज़्यादा होती जा रही है. ऐसा इसलिए है, क्योंकि ब्राउज़र वेंडर उन एपीआई के लिए काम को कम करते हैं जिन पर ज़्यादातर मीडिया प्लगिन भरोसा करते हैं.

इसके बारे में और पढ़ें

खास जानकारी और स्टैंडर्ड

ईएमई की खास जानकारी: एडिटर का नया ड्राफ़्ट कॉमन एन्क्रिप्शन (सीईएनसी) मीडिया सोर्स एक्सटेंशन: एडिटर का नया ड्राफ़्ट डीएएसई स्टैंडर्ड (हां, यह PDF है) डीएएस स्टैंडर्ड की खास जानकारी

लेख

DTG वेबिनार (कुछ हद तक पुराना) हेनरी सिवोनेन का ईएमई क्या है?, मीडिया सोर्स एक्सटेंशन प्राइमर MPEG-DASH टेस्ट स्ट्रीम: BBC R&D ब्लॉग पोस्ट

डेमो

कुंजी का डेमो हटाएं: SIMpl.info/ck मीडिया सोर्स एक्सटेंशन (MSE) डेमो Google का Shaka Player EME की मदद से DASH क्लाइंट लागू करता है

सुझाव/राय दें या शिकायत करें