এনক্রিপ্ট করা মিডিয়া এক্সটেনশনগুলি একটি API প্রদান করে যা ওয়েব অ্যাপ্লিকেশনগুলিকে এনক্রিপ্ট করা অডিও এবং ভিডিও প্লেব্যাকের অনুমতি দেওয়ার জন্য বিষয়বস্তু সুরক্ষা সিস্টেমের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম করে৷
অন্তর্নিহিত সুরক্ষা ব্যবস্থা নির্বিশেষে যেকোন ব্রাউজারে ব্যবহার করার জন্য একই অ্যাপ এবং এনক্রিপ্ট করা ফাইলগুলিকে সক্ষম করার জন্য EME ডিজাইন করা হয়েছে। আগেরটি প্রমিত API এবং প্রবাহ দ্বারা সম্ভব হয়েছে যখন পরবর্তীটি সাধারণ এনক্রিপশনের ধারণার দ্বারা সম্ভব হয়েছে৷
EME হল HTMLMediaElement স্পেসিফিকেশনের একটি এক্সটেনশন — তাই নাম। একটি 'এক্সটেনশন' হওয়ার অর্থ হল EME-এর জন্য ব্রাউজার সমর্থন ঐচ্ছিক: যদি একটি ব্রাউজার এনক্রিপ্ট করা মিডিয়া সমর্থন না করে, তাহলে এটি এনক্রিপ্ট করা মিডিয়া চালাতে সক্ষম হবে না, কিন্তু HTML স্পেক কমপ্লায়েন্সের জন্য EME এর প্রয়োজন নেই৷ EME স্পেক থেকে:
এই প্রস্তাবটি HTMLMediaElement প্রসারিত করে যা সুরক্ষিত সামগ্রীর প্লেব্যাক নিয়ন্ত্রণ করতে API প্রদান করে।
এপিআই সাধারণ ক্লিয়ার কী ডিক্রিপশন থেকে উচ্চ মানের ভিডিও পর্যন্ত ব্যবহারের ক্ষেত্রে সমর্থন করে (একটি উপযুক্ত ব্যবহারকারী এজেন্ট বাস্তবায়ন দেওয়া হয়েছে)। লাইসেন্স/কী এক্সচেঞ্জ অ্যাপ্লিকেশন দ্বারা নিয়ন্ত্রিত হয়, যা কন্টেন্ট ডিক্রিপশন এবং সুরক্ষা প্রযুক্তির একটি পরিসীমা সমর্থন করে শক্তিশালী প্লেব্যাক অ্যাপ্লিকেশনগুলির বিকাশের সুবিধা দেয়৷
এই স্পেসিফিকেশন একটি বিষয়বস্তু সুরক্ষা বা ডিজিটাল অধিকার ব্যবস্থাপনা সিস্টেম সংজ্ঞায়িত করে না। বরং, এটি একটি সাধারণ এপিআইকে সংজ্ঞায়িত করে যা এই ধরনের সিস্টেমের পাশাপাশি সহজ কন্টেন্ট এনক্রিপশন সিস্টেমের সাথে আবিষ্কার, নির্বাচন এবং ইন্টারঅ্যাক্ট করতে ব্যবহার করা যেতে পারে। এই স্পেসিফিকেশন মেনে চলার জন্য ডিজিটাল রাইটস ম্যানেজমেন্টের বাস্তবায়নের প্রয়োজন নেই: শুধুমাত্র ক্লিয়ার কী সিস্টেমকে একটি সাধারণ বেসলাইন হিসেবে প্রয়োগ করতে হবে।
সাধারণ API কন্টেন্ট এনক্রিপশন ক্ষমতার একটি সাধারণ সেট সমর্থন করে, অ্যাপ্লিকেশন ফাংশন যেমন প্রমাণীকরণ এবং অনুমোদন পৃষ্ঠা লেখকদের কাছে রেখে দেয়। এনক্রিপশন সিস্টেম এবং একটি লাইসেন্স বা অন্য সার্ভারের মধ্যে ব্যান্ড-অব-ব্যান্ড যোগাযোগ অনুমান করার পরিবর্তে বিষয়বস্তু সুরক্ষা সিস্টেম-নির্দিষ্ট বার্তাগুলিকে পৃষ্ঠা দ্বারা মধ্যস্থতা করার প্রয়োজন দ্বারা এটি অর্জন করা হয়।
EME বাস্তবায়ন নিম্নলিখিত বাহ্যিক উপাদান ব্যবহার করে:
- কী সিস্টেম: একটি বিষয়বস্তু সুরক্ষা (ডিআরএম) প্রক্রিয়া। EME ক্লিয়ার কী ( নীচে সে সম্পর্কে আরও) ছাড়াও কী সিস্টেমগুলিকে সংজ্ঞায়িত করে না।
- কন্টেন্ট ডিক্রিপশন মডিউল (CDM): একটি ক্লায়েন্ট-সাইড সফ্টওয়্যার বা হার্ডওয়্যার মেকানিজম যা এনক্রিপ্ট করা মিডিয়ার প্লেব্যাক সক্ষম করে। কী সিস্টেমের মতো, ইএমই কোনো সিডিএম সংজ্ঞায়িত করে না, তবে উপলব্ধ সিডিএমগুলির সাথে যোগাযোগ করার জন্য অ্যাপ্লিকেশনগুলির জন্য একটি ইন্টারফেস প্রদান করে।
- লাইসেন্স (কী) সার্ভার: মিডিয়া ডিক্রিপ্ট করার জন্য কী প্রদান করতে একটি CDM এর সাথে ইন্টারঅ্যাক্ট করে। লাইসেন্স সার্ভারের সাথে আলোচনার দায়িত্ব আবেদনের।
- প্যাকেজিং পরিষেবা: বিতরণ/ব্যবহারের জন্য মিডিয়া এনকোড এবং এনক্রিপ্ট করে।
মনে রাখবেন যে EME ব্যবহার করে একটি অ্যাপ্লিকেশন ডিক্রিপশন সক্ষম করার জন্য কী পেতে লাইসেন্স সার্ভারের সাথে ইন্টারঅ্যাক্ট করে, কিন্তু ব্যবহারকারীর পরিচয় এবং প্রমাণীকরণ EME এর অংশ নয়। মিডিয়া প্লেব্যাক সক্ষম করার জন্য কীগুলি পুনরুদ্ধার করা হয় (ঐচ্ছিকভাবে) ব্যবহারকারীকে প্রমাণীকরণ করার পরে। Netflix-এর মতো পরিষেবাগুলিকে অবশ্যই তাদের ওয়েব অ্যাপ্লিকেশনের মধ্যে ব্যবহারকারীদের প্রমাণীকরণ করতে হবে: যখন একজন ব্যবহারকারী অ্যাপ্লিকেশনটিতে সাইন ইন করেন, তখন অ্যাপ্লিকেশনটি ব্যবহারকারীর পরিচয় এবং সুযোগ-সুবিধা নির্ধারণ করে।
EME কিভাবে কাজ করে?
নীচের কোড উদাহরণের সাথে মিল রেখে EME এর উপাদানগুলি কীভাবে ইন্টারঅ্যাক্ট করে তা এখানে রয়েছে:
একাধিক ফরম্যাট বা কোডেক উপলব্ধ থাকলে, MediaSource.isTypeSupported() বা HTMLMediaElement.canPlayType() উভয়ই সঠিকটি নির্বাচন করতে ব্যবহার করা যেতে পারে। যাইহোক, সিডিএম শুধুমাত্র এনক্রিপ্ট করা সামগ্রীর জন্য ব্রাউজার যা সমর্থন করে তার একটি উপসেট সমর্থন করতে পারে। একটি ফর্ম্যাট এবং কোডেক নির্বাচন করার আগে একটি MediaKeys কনফিগারেশন নিয়ে আলোচনা করা ভাল৷ যদি অ্যাপ্লিকেশনটি এনক্রিপ্ট করা ইভেন্টের জন্য অপেক্ষা করে কিন্তু তখন MediaKeys দেখায় যে এটি নির্বাচিত ফরম্যাট/কোডেক পরিচালনা করতে পারে না, প্লেব্যাকে বাধা না দিয়ে স্যুইচ করতে অনেক দেরি হতে পারে।
প্রস্তাবিত প্রবাহ হল প্রথমে MediaKeys নিয়ে আলোচনা করা, MediaKeysSystemAccess.getConfiguration() ব্যবহার করে আলোচনা করা কনফিগারেশন খুঁজে বের করা।
যদি শুধুমাত্র একটি ফর্ম্যাট/কোডেক থেকে বেছে নেওয়া হয়, তাহলে getConfiguration() এর কোন প্রয়োজন নেই। যাইহোক, প্রথমে MediaKeys সেট আপ করা এখনও পছন্দনীয়। এনক্রিপ্ট করা ইভেন্টের জন্য অপেক্ষা করার একমাত্র কারণ হল বিষয়বস্তু এনক্রিপ্ট করা হয়েছে কিনা তা জানার কোন উপায় না থাকলে, কিন্তু বাস্তবে এটি অসম্ভাব্য।
- একটি ওয়েব অ্যাপ্লিকেশন অডিও বা ভিডিও চালানোর চেষ্টা করে যাতে এক বা একাধিক এনক্রিপ্ট করা স্ট্রিম রয়েছে।
- ব্রাউজার স্বীকার করে যে মিডিয়াটি এনক্রিপ্ট করা হয়েছে (এটি কীভাবে ঘটে তার জন্য নীচের বাক্সটি দেখুন) এবং এনক্রিপশন সম্পর্কে মিডিয়া থেকে প্রাপ্ত মেটাডেটা (initData) সহ একটি এনক্রিপ্ট করা ইভেন্ট ফায়ার করে।
অ্যাপ্লিকেশনটি এনক্রিপ্ট করা ইভেন্ট পরিচালনা করে:
যদি কোন MediaKeys অবজেক্ট মিডিয়া উপাদানের সাথে যুক্ত না থাকে, তাহলে প্রথমে একটি উপলব্ধ কী সিস্টেম নির্বাচন করুন navigator.requestMediaKeySystemAccess() ব্যবহার করে কী সিস্টেমগুলি উপলব্ধ তা পরীক্ষা করে দেখুন, তারপর একটি MediaKeySystemAccess অবজেক্টের মাধ্যমে একটি উপলব্ধ কী সিস্টেমের জন্য একটি MediaKeys অবজেক্ট তৈরি করুন। উল্লেখ্য যে MediaKeys অবজেক্টের সূচনা প্রথম এনক্রিপ্ট করা ইভেন্টের আগে হওয়া উচিত। একটি লাইসেন্স সার্ভার URL প্রাপ্তি একটি উপলব্ধ কী সিস্টেম নির্বাচন স্বাধীনভাবে অ্যাপ্লিকেশন দ্বারা সম্পন্ন করা হয়. একটি MediaKeys অবজেক্ট একটি অডিও বা ভিডিও উপাদানের জন্য মিডিয়া ডিক্রিপ্ট করার জন্য উপলব্ধ সমস্ত কী উপস্থাপন করে। এটি একটি সিডিএম দৃষ্টান্ত উপস্থাপন করে এবং সিডিএম-এ অ্যাক্সেস প্রদান করে, বিশেষত কী সেশন তৈরি করার জন্য, যা লাইসেন্স সার্ভার থেকে কী পেতে ব্যবহৃত হয়।
একবার MediaKeys অবজেক্ট তৈরি হয়ে গেলে, এটিকে মিডিয়া উপাদানে বরাদ্দ করুন: setMediaKeys() একটি HTMLMediaElement-এর সাথে MediaKeys অবজেক্টকে সংযুক্ত করে, যাতে এর কীগুলি প্লেব্যাকের সময়, অর্থাৎ ডিকোডিংয়ের সময় ব্যবহার করা যেতে পারে।
অ্যাপটি MediaKeys-এ createSession() কল করে একটি MediaKeySession তৈরি করে। এটি একটি MediaKeySession তৈরি করে, যা একটি লাইসেন্সের জীবনকাল এবং এর কী(গুলি) প্রতিনিধিত্ব করে।
অ্যাপটি এনক্রিপ্ট করা হ্যান্ডলারে প্রাপ্ত মিডিয়া ডেটা সিডিএম-এ প্রেরণ করে, MediaKeySession-এ generateRequest() কল করে লাইসেন্সের অনুরোধ তৈরি করে।
সিডিএম একটি বার্তা ইভেন্ট ফায়ার করে: লাইসেন্স সার্ভার থেকে একটি কী অর্জনের অনুরোধ।
MediaKeySession অবজেক্ট বার্তা ইভেন্ট গ্রহণ করে এবং অ্যাপ্লিকেশন লাইসেন্স সার্ভারে একটি বার্তা পাঠায় (উদাহরণস্বরূপ, XHR এর মাধ্যমে)।
অ্যাপ্লিকেশনটি লাইসেন্স সার্ভার থেকে একটি প্রতিক্রিয়া পায় এবং MediaKeySession-এর update() পদ্ধতি ব্যবহার করে ডেটা CDM-তে পাঠায়।
সিডিএম লাইসেন্সের কী ব্যবহার করে মিডিয়াকে ডিক্রিপ্ট করে। মিডিয়া উপাদানের সাথে যুক্ত MediaKeys-এর মধ্যে যেকোনো সেশন থেকে একটি বৈধ কী ব্যবহার করা যেতে পারে। সিডিএম কী এবং নীতি অ্যাক্সেস করবে, কী আইডি দ্বারা সূচীকৃত।
মিডিয়া প্লেব্যাক আবার শুরু হয়।
কিভাবে ব্রাউজার জানে যে মিডিয়া এনক্রিপ্ট করা হয়েছে?
এই তথ্যটি মিডিয়া কন্টেইনার ফাইলের মেটাডেটাতে রয়েছে, যা ISO BMFF বা WebM-এর মতো ফর্ম্যাটে থাকবে৷ ISO BMFF এর জন্য এর অর্থ হেডার মেটাডেটা, যাকে বলা হয় সুরক্ষা স্কিম তথ্য বাক্স। WebM কিছু WebM-নির্দিষ্ট সংযোজন সহ Matroska ContentEncryption উপাদান ব্যবহার করে। EME-নির্দিষ্ট রেজিস্ট্রিতে প্রতিটি কন্টেইনারের জন্য নির্দেশিকা প্রদান করা হয়।
মনে রাখবেন যে সিডিএম এবং লাইসেন্স সার্ভারের মধ্যে একাধিক বার্তা থাকতে পারে এবং এই প্রক্রিয়ার সমস্ত যোগাযোগ ব্রাউজার এবং অ্যাপ্লিকেশনের সাথে অস্বচ্ছ: বার্তাগুলি শুধুমাত্র সিডিএম এবং লাইসেন্স সার্ভার দ্বারা বোঝা যায়, যদিও অ্যাপ স্তরটি দেখতে পারে কোন ধরনের বার্তা সিডিএম পাঠাচ্ছে। লাইসেন্সের অনুরোধে সিডিএম-এর বৈধতা (এবং আস্থার সম্পর্ক) প্রমাণ রয়েছে এবং সেইসাথে ফলস্বরূপ লাইসেন্সে বিষয়বস্তু কী(গুলি) এনক্রিপ্ট করার সময় ব্যবহার করার জন্য একটি কী রয়েছে।
কিন্তু সিডিএম আসলে কি করে?
একটি EME বাস্তবায়ন নিজেই মিডিয়া ডিক্রিপ্ট করার একটি উপায় প্রদান করে না: এটি কেবল একটি ওয়েব অ্যাপ্লিকেশনের জন্য সামগ্রী ডিক্রিপশন মডিউলগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য একটি API প্রদান করে।
সিডিএম আসলে যা করে তা ইএমই স্পেক দ্বারা সংজ্ঞায়িত করা হয় না এবং একটি সিডিএম মিডিয়ার ডিকোডিং (ডিকম্প্রেশন) পাশাপাশি ডিক্রিপশন পরিচালনা করতে পারে। কমপক্ষে থেকে সবচেয়ে শক্তিশালী, সিডিএম কার্যকারিতার জন্য বেশ কয়েকটি সম্ভাব্য বিকল্প রয়েছে:
- শুধুমাত্র ডিক্রিপশন, সাধারণ মিডিয়া পাইপলাইন ব্যবহার করে প্লেব্যাক সক্ষম করা, উদাহরণস্বরূপ একটি <ভিডিও> উপাদানের মাধ্যমে।
- ডিক্রিপশন এবং ডিকোডিং, রেন্ডারিংয়ের জন্য ব্রাউজারে ভিডিও ফ্রেম পাস করা।
- ডিক্রিপশন এবং ডিকোডিং, সরাসরি হার্ডওয়্যারে রেন্ডারিং (উদাহরণস্বরূপ, GPU)।
একটি ওয়েব অ্যাপে সিডিএম উপলব্ধ করার একাধিক উপায় রয়েছে:
- ব্রাউজার দিয়ে একটি সিডিএম বান্ডিল করুন।
- আলাদাভাবে একটি সিডিএম বিতরণ করুন।
- অপারেটিং সিস্টেমে একটি সিডিএম তৈরি করুন।
- ফার্মওয়্যারে একটি সিডিএম অন্তর্ভুক্ত করুন।
- হার্ডওয়্যারে একটি সিডিএম এম্বেড করুন।
কিভাবে একটি সিডিএম উপলব্ধ করা হয় তা ইএমই স্পেক দ্বারা সংজ্ঞায়িত করা হয় না, তবে সমস্ত ক্ষেত্রে ব্রাউজার সিডিএম পরীক্ষা এবং প্রকাশের জন্য দায়ী।
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 CDM ব্যবহার করে একটি ব্রাউজারে চালানো যেতে পারে।
এটি লিগ্যাসি সমাধানগুলির বিপরীতে যা শুধুমাত্র একটি সম্পূর্ণ উল্লম্ব স্ট্যাকের সাথে কাজ করবে, একটি একক ক্লায়েন্ট সহ যা প্রায়শই একটি অ্যাপ্লিকেশন রানটাইম অন্তর্ভুক্ত করে।
কমন এনক্রিপশন (CENC) হল একটি ISO স্ট্যান্ডার্ড যা ISO BMFF-এর জন্য একটি সুরক্ষা স্কিম সংজ্ঞায়িত করে; একটি অনুরূপ ধারণা WebM এ প্রযোজ্য।
ক্লিয়ার কী
যদিও ইএমই ডিআরএম কার্যকারিতা সংজ্ঞায়িত করে না, তবে বিশেষত্ব বর্তমানে বাধ্যতামূলক করে যে EME সমর্থনকারী সমস্ত ব্রাউজারকে অবশ্যই ক্লিয়ার কী প্রয়োগ করতে হবে। এই সিস্টেমটি ব্যবহার করে, মিডিয়াকে একটি কী দিয়ে এনক্রিপ্ট করা যেতে পারে এবং তারপরে সেই কী প্রদান করে আবার চালানো যায়। ক্লিয়ার কী ব্রাউজারে তৈরি করা যেতে পারে: এটির জন্য আলাদা ডিক্রিপশন মডিউল ব্যবহারের প্রয়োজন নেই।
অনেক ধরনের বাণিজ্যিক সামগ্রীর জন্য ব্যবহার করার সম্ভাবনা না থাকলেও, EME সমর্থন করে এমন সমস্ত ব্রাউজার জুড়ে Clear Key সম্পূর্ণরূপে ইন্টারঅপারেবল। লাইসেন্স সার্ভার থেকে একটি বিষয়বস্তু কী অনুরোধ করার প্রয়োজন ছাড়াই এটি 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_crypt নির্দেশাবলী অনুসারে WebM-এর জন্য করা যেতে পারে। বাণিজ্যিক পরিষেবাগুলিও উপলব্ধ (অন্তত ISO BMFF/MP4-এর জন্য) এবং অন্যান্য সমাধানগুলি তৈরি করা হচ্ছে৷
সম্পর্কিত প্রযুক্তি 1: মিডিয়া সোর্স এক্সটেনশন (MSE)
HTMLMediaElement হল সরল সৌন্দর্যের একটি প্রাণী।
আমরা একটি src URL প্রদান করে মিডিয়া লোড, ডিকোড এবং প্লে করতে পারি:
<video src="foo.webm"></video>
মিডিয়া সোর্স API হল HTMLMediaElement-এর একটি এক্সটেনশন যা জাভাস্ক্রিপ্টকে ভিডিওর 'খণ্ডগুলি' থেকে প্লেব্যাকের জন্য স্ট্রীম তৈরি করার অনুমতি দিয়ে মিডিয়ার উত্সের উপর আরও সূক্ষ্ম নিয়ন্ত্রণ সক্ষম করে। এটি পরিবর্তে অভিযোজিত স্ট্রিমিং এবং সময় পরিবর্তনের মতো কৌশলগুলিকে সক্ষম করে।
কেন MSE EME এর জন্য গুরুত্বপূর্ণ? কারণ সুরক্ষিত বিষয়বস্তু বিতরণের পাশাপাশি, বাণিজ্যিক বিষয়বস্তু প্রদানকারীরা অবশ্যই নেটওয়ার্কের অবস্থা এবং অন্যান্য প্রয়োজনীয়তার সাথে সামগ্রী বিতরণকে মানিয়ে নিতে সক্ষম হবেন। Netflix, উদাহরণস্বরূপ, নেটওয়ার্ক অবস্থার পরিবর্তনের সাথে সাথে গতিশীলভাবে স্ট্রিম বিটরেট পরিবর্তন করে। EME একটি MSE বাস্তবায়ন দ্বারা প্রদত্ত মিডিয়া স্ট্রীমগুলির প্লেব্যাকের সাথে কাজ করে, ঠিক যেমন এটি একটি src বৈশিষ্ট্যের মাধ্যমে সরবরাহ করা মিডিয়ার সাথে কাজ করে।
বিভিন্ন বিটরেটে এনকোড করা মিডিয়াকে কীভাবে খণ্ড ও প্লে ব্যাক করবেন? নীচের DASH বিভাগটি দেখুন।
আপনি simpl.info/mse- এ MSE কাজ করতে দেখতে পারেন; এই উদাহরণের উদ্দেশ্যে, একটি WebM ভিডিও ফাইল API ব্যবহার করে পাঁচটি খণ্ডে বিভক্ত। একটি উত্পাদন অ্যাপ্লিকেশনে, ভিডিওর অংশগুলি 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);
}
};
MSE প্রাইমারে MSE সম্পর্কে আরও জানুন।
সম্পর্কিত প্রযুক্তি 2: ডাইনামিক অ্যাডাপটিভ স্ট্রিমিং ওভার HTTP (DASH)
মাল্টি-ডিভাইস, মাল্টি-প্ল্যাটফর্ম, মোবাইল — আপনি যেটাকেই বলুন না কেন, ওয়েব প্রায়শই পরিবর্তনযোগ্য সংযোগের শর্তে অভিজ্ঞ হয়। বহু-ডিভাইস জগতে ব্যান্ডউইথের সীমাবদ্ধতা এবং পরিবর্তনশীলতার সাথে মোকাবিলা করার জন্য গতিশীল, অভিযোজিত বিতরণ অত্যন্ত গুরুত্বপূর্ণ।
DASH (ওরফে MPEG-DASH) স্ট্রিমিং এবং ডাউনলোড উভয়ের জন্যই ফ্ল্যাকি বিশ্বে সর্বোত্তম সম্ভাব্য মিডিয়া ডেলিভারি সক্ষম করার জন্য ডিজাইন করা হয়েছে৷ অন্যান্য বেশ কিছু প্রযুক্তি একই রকম কিছু করে — যেমন Apple-এর HTTP লাইভ স্ট্রিমিং (HLS) এবং Microsoft-এর স্মুথ স্ট্রিমিং — কিন্তু DASH হল HTTP-এর মাধ্যমে অভিযোজিত বিটরেট স্ট্রিমিংয়ের একমাত্র পদ্ধতি যা ওপেন স্ট্যান্ডার্ডের উপর ভিত্তি করে। DASH ইতিমধ্যেই YouTube এর মতো সাইট দ্বারা ব্যবহার করা হচ্ছে৷
EME এবং MSE এর সাথে এর কি সম্পর্ক? MSE-ভিত্তিক DASH বাস্তবায়নগুলি একটি ম্যানিফেস্টকে পার্স করতে পারে, একটি উপযুক্ত বিটরেটে ভিডিওর সেগমেন্টগুলি ডাউনলোড করতে পারে এবং ক্ষুধার্ত হয়ে গেলে সেগুলিকে একটি ভিডিও উপাদানে খাওয়াতে পারে — বিদ্যমান HTTP পরিকাঠামো ব্যবহার করে৷
অন্য কথায়, DASH বাণিজ্যিক সামগ্রী প্রদানকারীদের সুরক্ষিত সামগ্রীর অভিযোজিত স্ট্রিমিং করতে সক্ষম করে।
DASH টিনের উপর যা বলে তা করে:
- গতিশীল: পরিবর্তিত পরিস্থিতিতে সাড়া দেয়।
- অভিযোজিত: একটি উপযুক্ত অডিও বা ভিডিও বিটরেট প্রদান করতে অভিযোজিত হয়।
- স্ট্রিমিং: স্ট্রিমিংয়ের পাশাপাশি ডাউনলোডের অনুমতি দেয়।
- HTTP: একটি ঐতিহ্যগত স্ট্রিমিং সার্ভারের অসুবিধা ছাড়াই HTTP এর সুবিধার সাথে সামগ্রী বিতরণ সক্ষম করে।
বিবিসি DASH ব্যবহার করে পরীক্ষামূলক স্ট্রীম সরবরাহ করা শুরু করেছে:
মিডিয়া বিভিন্ন বিটরেটে বহুবার এনকোড করা হয়। প্রতিটি এনকোডিংকে রিপ্রেজেন্টেশন বলা হয়। এগুলি কয়েকটি মিডিয়া সেগমেন্টে বিভক্ত। ক্লায়েন্ট এইচটিটিপি-তে উপস্থাপনা থেকে ক্রমানুসারে বিভাগগুলির অনুরোধ করে একটি প্রোগ্রাম চালায়। উপস্থাপনাগুলিকে সমতুল্য বিষয়বস্তু সমন্বিত উপস্থাপনাগুলির অভিযোজন সেটে গোষ্ঠীভুক্ত করা যেতে পারে। যদি ক্লায়েন্ট বিটরেট পরিবর্তন করতে চায় তবে এটি বর্তমান অভিযোজন সেট থেকে একটি বিকল্প বেছে নিতে পারে এবং সেই প্রতিনিধিত্ব থেকে সেগমেন্টের অনুরোধ করা শুরু করতে পারে। বিষয়বস্তু এমনভাবে এনকোড করা হয়েছে যাতে ক্লায়েন্টের জন্য এই সুইচিং সহজ হয়। মিডিয়া সেগমেন্টের একটি সংখ্যা ছাড়াও, একটি উপস্থাপনা সাধারণত একটি সূচনা সেগমেন্ট আছে। এটিকে একটি শিরোনাম হিসাবে ভাবা যেতে পারে, যাতে এনকোডিং, ফ্রেমের আকার ইত্যাদি সম্পর্কে তথ্য রয়েছে৷ একজন ক্লায়েন্টকে সেই উপস্থাপনা থেকে মিডিয়া বিভাগগুলি গ্রহণ করার আগে একটি প্রদত্ত উপস্থাপনের জন্য এটি পেতে হবে৷
সংক্ষিপ্ত করতে:
- মিডিয়া বিভিন্ন বিটরেট এ এনকোড করা হয়.
- বিভিন্ন বিটরেট ফাইল একটি HTTP সার্ভার থেকে উপলব্ধ করা হয়.
- একটি ক্লায়েন্ট ওয়েব অ্যাপ বেছে নেয় কোন বিটরেট পুনরুদ্ধার করতে হবে এবং DASH এর সাথে প্লে ব্যাক করতে হবে।
ভিডিও বিভাজন প্রক্রিয়ার অংশ হিসাবে, একটি XML ম্যানিফেস্ট যা মিডিয়া প্রেজেন্টেশন বর্ণনা (MPD) নামে পরিচিত প্রোগ্রামগতভাবে তৈরি করা হয়। এটি সময়কাল এবং URL সহ অভিযোজন সেট এবং উপস্থাপনা বর্ণনা করে। একটি MPD এই মত দেখায়:
<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>
(এই XMLটি YouTube DASH ডেমো প্লেয়ারের জন্য ব্যবহৃত .mpd ফাইল থেকে নেওয়া হয়েছে।)
DASH স্পেক অনুসারে, একটি MPD ফাইল তত্ত্বগতভাবে একটি ভিডিওর জন্য src হিসাবে ব্যবহার করা যেতে পারে। যাইহোক, ওয়েব ডেভেলপারদের আরও নমনীয়তা দেওয়ার জন্য, ব্রাউজার বিক্রেতারা DASH সমর্থনকে MSE যেমন dash.js ব্যবহার করে জাভাস্ক্রিপ্ট লাইব্রেরি পর্যন্ত ছেড়ে দেওয়া বেছে নিয়েছে। জাভাস্ক্রিপ্টে DASH প্রয়োগ করা ব্রাউজার আপডেটের প্রয়োজন ছাড়াই অভিযোজন অ্যালগরিদমকে বিকশিত হতে দেয়। MSE ব্যবহার করা ব্রাউজার পরিবর্তনের প্রয়োজন ছাড়াই বিকল্প ম্যানিফেস্ট ফরম্যাট এবং ডেলিভারি মেকানিজম নিয়ে পরীক্ষা-নিরীক্ষার অনুমতি দেয়। Google এর শাকা প্লেয়ার EME সমর্থন সহ একটি DASH ক্লায়েন্ট প্রয়োগ করে৷
Mozilla ডেভেলপার নেটওয়ার্কের নির্দেশাবলী রয়েছে কিভাবে WebM টুল এবং FFmpeg ভিডিওকে সেগমেন্ট করতে এবং একটি MPD তৈরি করতে ব্যবহার করতে হয়।
উপসংহার
ভিডিও এবং অডিওর জন্য অর্থ প্রদানের জন্য ওয়েবের ব্যবহার ব্যাপক হারে বাড়ছে। মনে হচ্ছে প্রতিটি নতুন ডিভাইস, তা একটি ট্যাবলেট, গেম কনসোল, সংযুক্ত টিভি বা সেট-টপ বক্সই হোক না কেন, HTTP এর মাধ্যমে প্রধান বিষয়বস্তু প্রদানকারীদের থেকে মিডিয়া স্ট্রিম করতে সক্ষম। 85% এর বেশি মোবাইল এবং ডেস্কটপ ব্রাউজার এখন <ভিডিও> এবং <অডিও> সমর্থন করে, এবং সিসকো অনুমান করে যে ভিডিও 2017 সালের মধ্যে বিশ্বব্যাপী গ্রাহক ইন্টারনেট ট্রাফিকের 80 থেকে 90 শতাংশ হবে। এই প্রসঙ্গে, সুরক্ষিত সামগ্রী বিতরণের জন্য ব্রাউজার সমর্থন সম্ভবত ক্রমবর্ধমান তাৎপর্যপূর্ণ হয়ে উঠছে, কারণ ব্রাউজার বিক্রেতারা API-এর জন্য সমর্থন কমিয়ে দেয় যা বেশিরভাগ মিডিয়া প্লাগইন নির্ভর করে।
আরও পড়া
চশমা এবং মান
EME স্পেক : সর্বশেষ সম্পাদকের খসড়া কমন এনক্রিপশন (CENC) মিডিয়া সোর্স এক্সটেনশন : সর্বশেষ সম্পাদকের ড্রাফ্ট ড্যাশ স্ট্যান্ডার্ড (হ্যাঁ, এটি একটি পিডিএফ) ড্যাশ স্ট্যান্ডার্ডের ওভারভিউ
প্রবন্ধ
ডিটিজি ওয়েবিনার (আংশিকভাবে অপ্রচলিত) ইএমই কী? , হেনরি সিভোনেন মিডিয়া সোর্স এক্সটেনশন প্রাইমার MPEG-DASH টেস্ট স্ট্রীম দ্বারা: BBC R&D ব্লগ পোস্ট
ডেমো
ক্লিয়ার কী ডেমো: simpl.info/ck মিডিয়া সোর্স এক্সটেনশন (MSE) ডেমো Google এর শাকা প্লেয়ার EME সমর্থন সহ একটি DASH ক্লায়েন্ট প্রয়োগ করে