एन्क्रिप्ट (सुरक्षित) किए गए मीडिया एक्सटेंशन, एक ऐसा एपीआई उपलब्ध कराता है जिसकी मदद से वेब ऐप्लिकेशन, कॉन्टेंट की सुरक्षा करने वाले सिस्टम के साथ इंटरैक्ट कर सकते हैं. इससे, एन्क्रिप्ट किए गए ऑडियो और वीडियो को चलाने की अनुमति मिलती है.
EME को इस तरह से डिज़ाइन किया गया है कि एक ही ऐप्लिकेशन और एन्क्रिप्ट (सुरक्षित) की गई फ़ाइलों का इस्तेमाल, किसी भी ब्राउज़र में किया जा सके. भले ही, सुरक्षा के लिए इस्तेमाल किया जा रहा सिस्टम कोई भी हो. पहला तरीका, स्टैंडर्ड एपीआई और फ़्लो की मदद से किया जाता है, जबकि दूसरा तरीका कॉमन एन्क्रिप्शन के सिद्धांत के आधार पर किया जाता है.
EME, HTMLMediaElement स्पेसिफ़िकेशन का एक एक्सटेंशन है — इसलिए इसका नाम ऐसा है. 'एक्सटेंशन' होने का मतलब है कि ब्राउज़र में EME की सुविधा होना ज़रूरी नहीं है: अगर कोई ब्राउज़र एन्क्रिप्ट (सुरक्षित) किए गए मीडिया के साथ काम नहीं करता है, तो वह एन्क्रिप्ट किए गए मीडिया को नहीं चला पाएगा. हालांकि, एचटीएमएल स्पेसिफ़िकेशन का पालन करने के लिए, EME की ज़रूरत नहीं है. ईएमई स्पेसिफ़िकेशन के मुताबिक:
इस प्रस्ताव में, HTMLMediaElement को बढ़ाया गया है. इसमें, सुरक्षित कॉन्टेंट के प्लेबैक को कंट्रोल करने के लिए एपीआई उपलब्ध कराए गए हैं.
एपीआई, अलग-अलग तरह के इस्तेमाल के उदाहरणों के साथ काम करता है. जैसे, साफ़ कुंजी को डिक्रिप्ट करने से लेकर, अच्छी क्वालिटी के वीडियो को डिक्रिप्ट करने तक. हालांकि, इसके लिए ज़रूरी है कि उपयोगकर्ता एजेंट को सही तरीके से लागू किया गया हो. लाइसेंस/कुंजी के आदान-प्रदान को ऐप्लिकेशन कंट्रोल करता है. इससे, कॉन्टेंट को डिक्रिप्ट करने और उसे सुरक्षित रखने वाली कई टेक्नोलॉजी के साथ काम करने वाले, बेहतरीन प्लेलबैक ऐप्लिकेशन बनाने में मदद मिलती है.
इस स्पेसिफ़िकेशन में, कॉन्टेंट की सुरक्षा या डिजिटल राइट मैनेजमेंट सिस्टम के बारे में नहीं बताया गया है. इसके बजाय, यह एक सामान्य एपीआई तय करता है. इसका इस्तेमाल, ऐसे सिस्टम के साथ-साथ कॉन्टेंट को एन्क्रिप्ट करने वाले आसान सिस्टम को ढूंढने, चुनने, और उनसे इंटरैक्ट करने के लिए किया जा सकता है. इस स्पेसिफ़िकेशन का पालन करने के लिए, डिजिटल राइट मैनेजमेंट (डीआरएम) को लागू करना ज़रूरी नहीं है: सिर्फ़ क्लियर बटन सिस्टम को सामान्य आधार के तौर पर लागू करना ज़रूरी है.
सामान्य API, कॉन्टेंट को एन्क्रिप्ट करने की सुविधाओं के एक आसान सेट के साथ काम करता है. साथ ही, यह पेज के लेखकों को पुष्टि करने और अनुमति देने जैसे ऐप्लिकेशन फ़ंक्शन देता है. ऐसा करने के लिए, कॉन्टेंट की सुरक्षा करने वाले सिस्टम के हिसाब से मैसेज को पेज के ज़रिए भेजा जाता है. ऐसा इसलिए किया जाता है, ताकि एन्क्रिप्शन सिस्टम और लाइसेंस या किसी दूसरे सर्वर के बीच, अलग से कम्यूनिकेशन न हो.
EME लागू करने के लिए, इन बाहरी कॉम्पोनेंट का इस्तेमाल किया जाता है:
- की सिस्टम: कॉन्टेंट की सुरक्षा (डीएमआर) का तरीका. ईएमई, क्लियर पासकोड के अलावा, पासकोड सिस्टम के बारे में खुद नहीं बताता. इस बारे में यहां ज़्यादा जानकारी दी गई है.
- कॉन्टेंट डिक्रिप्ट (एन्क्रिप्ट किए गए कॉन्टेंट को डिक्रिप्ट) करने वाला मॉड्यूल (सीडीएम): यह क्लाइंट-साइड सॉफ़्टवेयर या हार्डवेयर मकैनिज्म है, जो एन्क्रिप्ट किए गए मीडिया को चलाने की सुविधा देता है. मुख्य सिस्टम की तरह, ईएमई किसी भी सीडीएम की जानकारी नहीं देता. हालांकि, यह ऐप्लिकेशन के लिए एक इंटरफ़ेस उपलब्ध कराता है, ताकि वे उपलब्ध सीडीएम के साथ इंटरैक्ट कर सकें.
- लाइसेंस (कुंजी) सर्वर: मीडिया को डिक्रिप्ट करने के लिए कुंजियां उपलब्ध कराने के लिए, सीडीएम के साथ इंटरैक्ट करता है. लाइसेंस सर्वर के साथ बातचीत करने की ज़िम्मेदारी, ऐप्लिकेशन की है.
- पैकेजिंग सेवा: डिस्ट्रिब्यूशन/उपयोग के लिए, मीडिया को एन्कोड और एन्क्रिप्ट करती है.
ध्यान दें कि EME का इस्तेमाल करने वाला ऐप्लिकेशन, डिक्रिप्ट (सुरक्षित कॉन्टेंट को वापस सामान्य में बदलना) करने की सुविधा चालू करने के लिए कुंजियां पाने के लिए, लाइसेंस सर्वर के साथ इंटरैक्ट करता है. हालांकि, उपयोगकर्ता की पहचान और पुष्टि करना, EME का हिस्सा नहीं है. मीडिया चलाने की सुविधा चालू करने के लिए, कुंजियों को वापस पाने के लिए उपयोगकर्ता की पुष्टि की जाती है. हालांकि, ऐसा करना ज़रूरी नहीं है. Netflix जैसी सेवाओं को अपने वेब ऐप्लिकेशन में उपयोगकर्ताओं की पुष्टि करनी होगी: जब कोई उपयोगकर्ता ऐप्लिकेशन में साइन इन करता है, तो ऐप्लिकेशन उपयोगकर्ता की पहचान और विशेषाधिकारों का पता लगाता है.
ईएमई कैसे काम करता है?
यहां बताया गया है कि नीचे दिए गए कोड के उदाहरण के हिसाब से, EME के कॉम्पोनेंट कैसे इंटरैक्ट करते हैं:
अगर एक से ज़्यादा फ़ॉर्मैट या कोडेक उपलब्ध हैं, तो सही फ़ॉर्मैट चुनने के लिए, MediaSource.isTypeSupported() या HTMLMediaElement.canPlayType(), दोनों का इस्तेमाल किया जा सकता है. हालांकि, हो सकता है कि सीडीएम सिर्फ़ उस सबसेट के साथ काम करे जिसका इस्तेमाल ब्राउज़र, बिना एन्क्रिप्ट किए गए कॉन्टेंट के लिए करता है. फ़ॉर्मैट और कोडेक चुनने से पहले, MediaKeys कॉन्फ़िगरेशन के लिए बातचीत करना सबसे अच्छा होता है. अगर ऐप्लिकेशन, एन्क्रिप्ट किए गए इवेंट का इंतज़ार करता है, लेकिन MediaKeys से पता चलता है कि वह चुने गए फ़ॉर्मैट/कोडेक को हैंडल नहीं कर सकता, तो हो सकता है कि वीडियो चलाने में रुकावट आए बिना, फ़ॉर्मैट या कोडेक को स्विच करने का समय बीत चुका हो.
हमारा सुझाव है कि पहले MediaKeys के लिए बातचीत करें. इसके बाद, MediaKeysSystemAccess.getConfiguration() का इस्तेमाल करके, बातचीत के दौरान तय किए गए कॉन्फ़िगरेशन का पता लगाएं.
अगर चुनने के लिए सिर्फ़ एक फ़ॉर्मैट/कोडेक है, तो फिर getConfiguration() की ज़रूरत नहीं है. हालांकि, फिर भी MediaKeys को पहले सेट अप करना बेहतर है. एन्क्रिप्ट किए गए इवेंट का इंतज़ार सिर्फ़ तब करना चाहिए, जब यह पता न चल पाए कि कॉन्टेंट एन्क्रिप्ट किया गया है या नहीं. हालांकि, ऐसा होने की संभावना कम होती है.
- कोई वेब ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) की गई एक या उससे ज़्यादा स्ट्रीम वाला ऑडियो या वीडियो चलाने की कोशिश करता है.
- ब्राउज़र यह पहचानता है कि मीडिया को एन्क्रिप्ट (सुरक्षित) किया गया है. यह कैसे होता है, यह जानने के लिए नीचे दिया गया बॉक्स देखें. इसके बाद, ब्राउज़र एन्क्रिप्शन के बारे में मीडिया से मिले मेटाडेटा (initData) के साथ एन्क्रिप्ट किया गया इवेंट ट्रिगर करता है.
ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) किए गए इवेंट को मैनेज करता है:
अगर मीडिया एलिमेंट से कोई MediaKeys ऑब्जेक्ट नहीं जुड़ा है, तो पहले उपलब्ध कुंजी सिस्टम चुनें. इसके लिए, navigator.requestMediaKeySystemAccess() का इस्तेमाल करके देखें कि कौनसे कुंजी सिस्टम उपलब्ध हैं. इसके बाद, MediaKeySystemAccess ऑब्जेक्ट की मदद से, उपलब्ध कुंजी सिस्टम के लिए MediaKeys ऑब्जेक्ट बनाएं. ध्यान दें कि एन्क्रिप्ट (सुरक्षित) किए गए पहले इवेंट से पहले, MediaKeys ऑब्जेक्ट को शुरू किया जाना चाहिए. ऐप्लिकेशन, लाइसेंस सर्वर का यूआरएल अपने-आप पा लेता है. इसके लिए, उसे उपलब्ध कुंजी सिस्टम को चुनने की ज़रूरत नहीं होती. MediaKeys ऑब्जेक्ट, किसी ऑडियो या वीडियो एलिमेंट के मीडिया को डिक्रिप्ट करने के लिए उपलब्ध सभी कुंजियों को दिखाता है. यह सीडीएम इंस्टेंस को दिखाता है और सीडीएम का ऐक्सेस देता है. खास तौर पर, यह ऐक्सेस पासकोड सेशन बनाने के लिए दिया जाता है. इन पासकोड सेशन का इस्तेमाल, लाइसेंस सर्वर से पासकोड पाने के लिए किया जाता है.
MediaKeys ऑब्जेक्ट बनाने के बाद, उसे मीडिया एलिमेंट को असाइन करें: setMediaKeys() MediaKeys ऑब्जेक्ट को HTMLMediaElement से जोड़ता है, ताकि उसके पास वीडियो चलाने के दौरान, यानी डिकोड करने के दौरान कुंजियों का इस्तेमाल करने का विकल्प हो.
ऐप्लिकेशन, MediaKeys पर createSession() को कॉल करके MediaKeySession बनाता है. इससे एक MediaKeySession बनता है, जो लाइसेंस और उसकी कुंजियों के लाइफ़टाइम के बारे में बताता है.
ऐप्लिकेशन, एन्क्रिप्ट (सुरक्षित) किए गए हैंडलर में मिले मीडिया डेटा को सीडीएम में भेजकर, लाइसेंस का अनुरोध जनरेट करता है. इसके लिए, वह MediaKeySession पर generateRequest() को कॉल करता है.
सीडीएम, मैसेज इवेंट को ट्रिगर करता है: लाइसेंस सर्वर से कुंजी पाने का अनुरोध.
MediaKeySession ऑब्जेक्ट को मैसेज इवेंट मिलता है और ऐप्लिकेशन, लाइसेंस सर्वर को एक मैसेज भेजता है. उदाहरण के लिए, XHR के ज़रिए.
ऐप्लिकेशन को लाइसेंस सर्वर से जवाब मिलता है और वह MediaKeySession के update() तरीके का इस्तेमाल करके, डेटा को सीडीएम को भेजता है.
सीडीएम, लाइसेंस में मौजूद कुंजियों का इस्तेमाल करके मीडिया को डिक्रिप्ट करता है. मीडिया एलिमेंट से जुड़े MediaKeys में मौजूद किसी भी सेशन से, मान्य कुंजी का इस्तेमाल किया जा सकता है. सीडीएम, कुंजी और नीति को ऐक्सेस करेगा. इनका इंडेक्स, कुंजी आईडी के हिसाब से किया जाएगा.
मीडिया प्लेबैक फिर से शुरू हो जाता है.
ब्राउज़र को कैसे पता चलता है कि मीडिया एन्क्रिप्ट (सुरक्षित) किया गया है?
यह जानकारी, मीडिया कंटेनर फ़ाइल के मेटाडेटा में होती है. यह ISO BMFF या WebM जैसे फ़ॉर्मैट में होगी. ISO BMFF के लिए, इसका मतलब हेडर मेटाडेटा है, जिसे सुरक्षा स्कीम की जानकारी वाले बॉक्स कहा जाता है. WebM, Matroska ContentEncryption एलिमेंट का इस्तेमाल करता है. इसमें WebM के हिसाब से कुछ चीज़ें जोड़ी गई हैं. ईएमई से जुड़ी रजिस्ट्री में, हर कंटेनर के लिए दिशा-निर्देश दिए जाते हैं.
ध्यान दें कि सीडीएम और लाइसेंस सर्वर के बीच कई मैसेज हो सकते हैं. साथ ही, इस प्रोसेस में होने वाला सारा कम्यूनिकेशन, ब्राउज़र और ऐप्लिकेशन के लिए साफ़ तौर पर नहीं दिखता. मैसेज सिर्फ़ सीडीएम और लाइसेंस सर्वर को समझ आते हैं. हालांकि, ऐप्लिकेशन लेयर यह देख सकती है कि सीडीएम किस तरह का मैसेज भेज रहा है. लाइसेंस के अनुरोध में, सीडीएम की पुष्टि (और भरोसे के संबंध) का सबूत होता है. साथ ही, लाइसेंस में कॉन्टेंट की कुंजी (कुंजियों) को एन्क्रिप्ट (सुरक्षित) करते समय इस्तेमाल करने के लिए एक कुंजी भी होती है.
लेकिन सीडीएम असल में क्या करते हैं?
EME लागू करने से, मीडिया को डिक्रिप्ट करने का तरीका अपने-आप नहीं मिलता: यह सिर्फ़ वेब ऐप्लिकेशन के लिए एक एपीआई उपलब्ध कराता है, ताकि वह कॉन्टेंट डिक्रिप्ट करने वाले मॉड्यूल के साथ इंटरैक्ट कर सके.
EME स्पेसिफ़िकेशन में यह नहीं बताया गया है कि सीडीएम असल में क्या करते हैं. साथ ही, सीडीएम, मीडिया को डिक्रिप्ट करने के साथ-साथ डिकोड (डिकंप्रेस) भी कर सकते हैं. सीडीएम की सुविधाओं के लिए, कम से ज़्यादा बेहतर कई विकल्प उपलब्ध हैं:
- सिर्फ़ डिक्रिप्ट करने की सुविधा, जो सामान्य मीडिया पाइपलाइन का इस्तेमाल करके प्लेबैक को चालू करती है. उदाहरण के लिए, <video> एलिमेंट के ज़रिए.
- वीडियो को डिक्रिप्ट (सुरक्षित से सामान्य में बदलना) और डिकोड (कोड को सामान्य भाषा में बदलना) करना. साथ ही, वीडियो फ़्रेम को रेंडर करने के लिए ब्राउज़र को भेजना.
- सीधे हार्डवेयर (उदाहरण के लिए, जीपीयू) में डिक्रिप्ट और डिकोड करके रेंडर करना.
किसी वेब ऐप्लिकेशन के लिए सीडीएम उपलब्ध कराने के कई तरीके हैं:
- ब्राउज़र के साथ सीडीएम को बंडल करें.
- सीडीएम को अलग से डिस्ट्रिब्यूट करें.
- ऑपरेटिंग सिस्टम में सीडीएम बनाएं.
- फ़र्मवेयर में सीडीएम शामिल करें.
- हार्डवेयर में सीडीएम एम्बेड करना.
EME स्पेसिफ़िकेशन में यह नहीं बताया गया है कि सीडीएम को कैसे उपलब्ध कराया जाता है. हालांकि, सभी मामलों में ब्राउज़र की यह ज़िम्मेदारी होती है कि वह सीडीएम की जांच करे और उसे दिखाए.
EME किसी खास पासकोड सिस्टम का इस्तेमाल करने की ज़रूरी शर्त नहीं है. फ़िलहाल, डेस्कटॉप और मोबाइल ब्राउज़र में, 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')
);
}
सामान्य एन्क्रिप्शन
कॉमन एन्क्रिप्शन (सुरक्षित करने) के तरीकों की मदद से, कॉन्टेंट उपलब्ध कराने वाली कंपनियां हर कंटेनर/कोडेक के लिए एक बार अपने कॉन्टेंट को एन्क्रिप्ट (सुरक्षित) और पैकेज कर सकती हैं. साथ ही, वे कॉन्टेंट को कई तरह के पासकोड सिस्टम, सीडीएम, और क्लाइंट के साथ इस्तेमाल कर सकती हैं. जैसे, कॉमन एन्क्रिप्शन की सुविधा देने वाला कोई भी सीडीएम. उदाहरण के लिए, Playready का इस्तेमाल करके पैकेज किए गए वीडियो को ब्राउज़र में चलाया जा सकता है. इसके लिए, Widevine लाइसेंस सर्वर से कुंजी हासिल करने वाले Widevine सीडीएम का इस्तेमाल किया जाता है.
यह लेगसी सलूशन से अलग है, जो सिर्फ़ पूरे वर्टिकल स्टैक के साथ काम करता है. इसमें एक क्लाइंट भी शामिल होता है, जिसमें अक्सर ऐप्लिकेशन रनटाइम भी शामिल होता है.
कॉमन एन्क्रिप्शन (CENC), ISO स्टैंडर्ड है. इसमें ISO BMFF के लिए सुरक्षा योजना तय की गई है. यह कॉन्सेप्ट, WebM पर भी लागू होता है.
कुंजी को हटाएं
EME में डीआरएम की सुविधा के बारे में नहीं बताया गया है. हालांकि, फ़िलहाल स्पेसिफ़िकेशन के मुताबिक, EME के साथ काम करने वाले सभी ब्राउज़र को क्लियर पासकोड लागू करना होगा. इस सिस्टम का इस्तेमाल करके, मीडिया को किसी कुंजी से एन्क्रिप्ट (सुरक्षित) किया जा सकता है. इसके बाद, उस कुंजी को डालकर मीडिया को आसानी से चलाया जा सकता है. क्लियर पासकोड को ब्राउज़र में बनाया जा सकता है: इसके लिए, डिक्रिप्ट करने वाले अलग मॉड्यूल का इस्तेमाल करने की ज़रूरत नहीं होती.
हालांकि, कई तरह के व्यावसायिक कॉन्टेंट के लिए इसका इस्तेमाल नहीं किया जा सकता, लेकिन Clear Key, EME की सुविधा वाले सभी ब्राउज़र पर पूरी तरह से काम करता है. यह लाइसेंस सर्वर से कॉन्टेंट कुंजी का अनुरोध किए बिना, EME के लागू होने और EME का इस्तेमाल करने वाले ऐप्लिकेशन की जांच करने के लिए भी मददगार है. 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 फ़ॉर्मैट में किसी वीडियो को एन्क्रिप्ट करके, उसे क्लियर की के साथ इस्तेमाल किया जा सकता है. इसके लिए, webm_crypt के निर्देशों का पालन करें. कमर्शियल सेवाएं भी उपलब्ध हैं (कम से कम ISO BMFF/MP4 के लिए). साथ ही, अन्य समाधानों पर काम किया जा रहा है.
मिलती-जुलती टेक्नोलॉजी 1: मीडिया सोर्स एक्सटेंशन (एमएसई)
HTMLMediaElement एक आसान और खूबसूरत एलिमेंट है.
हम src यूआरएल देकर, मीडिया को लोड, डिकोड, और चला सकते हैं:
<video src="foo.webm"></video>
Media Source API, HTMLMediaElement का एक एक्सटेंशन है. इससे मीडिया के सोर्स को बेहतर तरीके से कंट्रोल किया जा सकता है. इसके लिए, JavaScript को वीडियो के 'चंक' से प्लेबैक के लिए स्ट्रीम बनाने की अनुमति दी जाती है. इससे, अडैप्टिव स्ट्रीमिंग और टाइम शिफ़्ट जैसी तकनीकें इस्तेमाल की जा सकती हैं.
एमईई के लिए एमएसई क्यों ज़रूरी है? ऐसा इसलिए है, क्योंकि कॉन्टेंट की सुरक्षा के अलावा, कमर्शियल कॉन्टेंट उपलब्ध कराने वाली कंपनियों को नेटवर्क की स्थितियों और अन्य ज़रूरी शर्तों के हिसाब से कॉन्टेंट डिलीवरी में बदलाव करने की ज़रूरत होती है. उदाहरण के लिए, Netflix, नेटवर्क की स्थिति में बदलाव होने पर स्ट्रीम की बिटरेट को डाइनैमिक तरीके से बदलता है. एमईएम, एमएसई लागू करने से मिलने वाली मीडिया स्ट्रीम के प्लेबैक के साथ काम करता है. ठीक उसी तरह जैसे यह src एट्रिब्यूट की मदद से मिलने वाली मीडिया स्ट्रीम के साथ काम करता है.
अलग-अलग बिटरेट में एन्कोड किए गए मीडिया को चंक में बांटकर कैसे चलाया जा सकता है? DASH सेक्शन देखें.
एमएसई को simpl.info/mse पर देखा जा सकता है. इस उदाहरण के लिए, फ़ाइल एपीआई का इस्तेमाल करके, एक वेबएम वीडियो को पांच हिस्सों में बांटा गया है. प्रोडक्शन ऐप्लिकेशन में, वीडियो के हिस्सों को AJAX के ज़रिए वापस लाया जाएगा.
सबसे पहले, एक SourceBuffer बनाया जाता है:
var sourceBuffer = mediaSource.addSourceBuffer(
'video/webm; codecs="vorbis,vp8"',
);
इसके बाद, पूरी फ़िल्म को वीडियो एलिमेंट पर 'स्ट्रीम' किया जाता है. इसके लिए, appendBuffer() तरीके का इस्तेमाल करके हर चंक को जोड़ा जाता है:
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);
}
};
एमएसई प्राइमर में एमएसई के बारे में ज़्यादा जानें.
मिलती-जुलती दूसरी टेक्नोलॉजी: डाइनैमिक अडैप्टिव स्ट्रीमिंग ओवर एचटीटीपी (डीएश)
मल्टी-डिवाइस, मल्टी-प्लैटफ़ॉर्म, मोबाइल — इसे किसी भी नाम से पुकारा जा सकता है. हालांकि, वेब को अक्सर ऐसी स्थितियों में इस्तेमाल किया जाता है जहां कनेक्टिविटी में बदलाव होता रहता है. कई डिवाइसों के ज़माने में, बैंडविड्थ की समस्याओं और डिवाइसों के हिसाब से बदलावों को मैनेज करने के लिए, डाइनैमिक और अडैप्टिव डिलीवरी ज़रूरी है.
DASH (जिसे MPEG-DASH भी कहा जाता है) को इस तरह डिज़ाइन किया गया है कि यह स्ट्रीमिंग और डाउनलोड, दोनों के लिए बेहतरीन मीडिया डिलीवरी की सुविधा दे सके. कई अन्य टेक्नोलॉजी भी कुछ ऐसा ही करती हैं — जैसे, Apple की एचटीटीपी लाइव स्ट्रीमिंग (एचएलएस) और Microsoft की स्मूद स्ट्रीमिंग — लेकिन एचटीटीपी के ज़रिए अडैप्टिव बिटरेट स्ट्रीमिंग का एकमात्र तरीका, डीएएसएच है, जो ओपन स्टैंडर्ड पर आधारित है. YouTube जैसी साइटें पहले से ही DASH का इस्तेमाल कर रही हैं.
इसका EME और MSE से क्या लेना-देना है? एमएसई पर आधारित डीएएसएच लागू करने की सुविधा, किसी मेनिफ़ेस्ट को पार्स कर सकती है. साथ ही, वीडियो के सेगमेंट को सही बिटरेट पर डाउनलोड कर सकती है. साथ ही, ज़रूरत पड़ने पर उन्हें वीडियो एलिमेंट को फ़ीड कर सकती है. इसके लिए, मौजूदा एचटीटीपी इन्फ़्रास्ट्रक्चर का इस्तेमाल किया जाता है.
दूसरे शब्दों में, DASH की मदद से व्यावसायिक कॉन्टेंट उपलब्ध कराने वाली कंपनियां, सुरक्षित कॉन्टेंट को अडैप्टिव स्ट्रीमिंग की सुविधा के साथ उपलब्ध करा सकती हैं.
DASH, जैसा नाम है वैसा ही काम करता है:
- डाइनैमिक: यह बदलती परिस्थितियों के हिसाब से काम करता है.
- अडैप्टिव: यह ऑडियो या वीडियो की सही बिटरेट देने के लिए अडजस्ट होता है.
- स्ट्रीमिंग: इस विकल्प की मदद से, वीडियो को स्ट्रीम करने के साथ-साथ डाउनलोड भी किया जा सकता है.
- एचटीटीपी: एचटीटीपी के फ़ायदों के साथ कॉन्टेंट डिलीवरी की सुविधा देता है. इसमें, सामान्य स्ट्रीमिंग सर्वर के नुकसान नहीं होते.
BBC ने DASH का इस्तेमाल करके टेस्ट स्ट्रीम उपलब्ध कराना शुरू कर दिया है:
मीडिया को अलग-अलग बिटरेट पर कई बार एन्कोड किया जाता है. हर कोड को रीप्रज़ेंटेशन कहा जाता है. इन्हें कई मीडिया सेगमेंट में बांटा जाता है. क्लाइंट, एचटीटीपी पर किसी प्रोग्राम के सेगमेंट का अनुरोध करके, उसे चलाता है. कॉन्टेंट के मिलते-जुलते वर्शन को एक ग्रुप में रखा जा सकता है. अगर क्लाइंट को बिटरेट बदलना है, तो वह मौजूदा अडैप्टेशन सेट से कोई विकल्प चुन सकता है और उस रीप्रज़ेंटेशन से सेगमेंट का अनुरोध करना शुरू कर सकता है. कॉन्टेंट को इस तरह से कोड में बदला जाता है कि क्लाइंट के लिए, एक सेगमेंट से दूसरे पर स्विच करना आसान हो. आम तौर पर, किसी रेप्रज़ेंटेशन में कई मीडिया सेगमेंट के साथ-साथ एक शुरू करने वाला सेगमेंट भी होता है. इसे हेडर के तौर पर देखा जा सकता है, जिसमें एन्कोडिंग, फ़्रेम साइज़ वगैरह की जानकारी होती है. किसी दिए गए रेप्रज़ेंटेशन से मीडिया सेगमेंट का इस्तेमाल करने से पहले, क्लाइंट को यह जानकारी हासिल करनी होती है.
खास जानकारी के लिए:
- मीडिया को अलग-अलग बिटरेट पर एन्कोड किया जाता है.
- अलग-अलग बिटरेट वाली फ़ाइलें, एचटीटीपी सर्वर से उपलब्ध कराई जाती हैं.
- क्लाइंट वेब ऐप्लिकेशन यह चुनता है कि 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 स्पेसिफ़िकेशन के मुताबिक, एमपीडी फ़ाइल का इस्तेमाल वीडियो के लिए src के तौर पर किया जा सकता है. हालांकि, वेब डेवलपर को ज़्यादा सुविधा देने के लिए, ब्राउज़र वेंडर ने एमएसई का इस्तेमाल करने वाली JavaScript लाइब्रेरी, जैसे कि dash.js के लिए DASH की सहायता को छोड़ने का विकल्प चुना है. JavaScript में DASH लागू करने से, ब्राउज़र अपडेट किए बिना अडैप्टेशन एल्गोरिदम को बेहतर बनाया जा सकता है. MSE का इस्तेमाल करके, ब्राउज़र में बदलाव किए बिना, अन्य मेनिफ़ेस्ट फ़ॉर्मैट और डिलीवरी के तरीकों के साथ भी एक्सपेरिमेंट किया जा सकता है. Google का Shaka Player, EME की सुविधा के साथ DASH क्लाइंट लागू करता है.
Mozilla Developer Network पर, वीडियो को सेगमेंट में बांटने और एमपीडी बनाने के लिए, WebM टूल और FFmpeg का इस्तेमाल करने के तरीके के बारे में निर्देश दिए गए हैं.
नतीजा
पैसे चुकाकर देखे जाने वाले वीडियो और ऑडियो को डिलीवर करने के लिए, वेब का इस्तेमाल बहुत तेज़ी से बढ़ रहा है. ऐसा लगता है कि हर नया डिवाइस, चाहे वह टैबलेट, गेम कंसोल, कनेक्टेड टीवी या सेट-टॉप बॉक्स हो, वह एचटीटीपी के ज़रिए कॉन्टेंट देने वाली मुख्य कंपनियों से मीडिया स्ट्रीम कर सकता है. 85%से ज़्यादा मोबाइल और डेस्कटॉप ब्राउज़र अब <video> और <audio> के साथ काम करते हैं. साथ ही, Cisco का अनुमान है कि साल 2017 तक ग्लोबल कंज्यूमर इंटरनेट ट्रैफ़िक का 80 से 90 प्रतिशत हिस्सा वीडियो से होगा. इस संदर्भ में, सुरक्षित कॉन्टेंट के डिस्ट्रिब्यूशन के लिए ब्राउज़र की सहायता का महत्व बढ़ता जा रहा है. ऐसा इसलिए है, क्योंकि ब्राउज़र वेंडर, उन एपीआई के लिए सहायता को कम कर रहे हैं जिन पर ज़्यादातर मीडिया प्लग इन निर्भर हैं.
इसके बारे में और पढ़ें
खास जानकारी और स्टैंडर्ड
EME स्पेसिफ़िकेशन: एडिटर का नया ड्राफ़्ट कॉमन एन्क्रिप्शन (CENC) मीडिया सोर्स एक्सटेंशन: एडिटर का नया ड्राफ़्ट DASH स्टैंडर्ड (हां, यह एक PDF है) DASH स्टैंडर्ड की खास जानकारी
लेख
DTG वेबिनार (कुछ हद तक पुराना) EME क्या है?, हेनरी सिवोनन की ओर से लिखा गया लेख मीडिया सोर्स एक्सटेंशन के बारे में जानकारी देने वाला लेख MPEG-DASH टेस्ट स्ट्रीम: BBC R&D ब्लॉग पोस्ट
डेमो
क्लियर पासकोड का डेमो: simpl.info/ck मीडिया सोर्स एक्सटेंशन (एमएसई) का डेमो Google का Shaka Player, EME की सुविधा वाले DASH क्लाइंट को लागू करता है