EME WTF؟

مقدمة عن إضافات الوسائط المشفرة

توفر إضافات الوسائط المشفرة واجهة برمجة تطبيقات تمكِّن تطبيقات الويب من التفاعل مع أنظمة حماية المحتوى للسماح بتشغيل الصوت والفيديو المشفّرين.

تم تصميم أداة EME لإتاحة استخدام التطبيق نفسه والملفات المشفّرة في أي متصفِّح، بغض النظر عن نظام الحماية الأساسي. ويمكن تحقيق الأول من خلال واجهات برمجة التطبيقات والتدفق الموحّدين بينما يتوفر الأخير من خلال مفهوم التشفير المشترك.

EME هي إضافة إلى مواصفات HTMLMediaElement، ومن هنا جاء اسمها. يعني استخدام "إضافة" أنّ استخدام المتصفّح EME اختياري: إذا كان المتصفّح لا يتيح استخدام الوسائط المشفرة، لن يتمكّن من تشغيل وسائط مشفّرة، ولكن لن يكون ملف EME مطلوبًا للامتثال لمواصفات HTML. من مواصفات EME:

تستخدم عمليات تنفيذ EME المكونات الخارجية التالية:

  • نظام المفاتيح: يشير إلى آلية حماية المحتوى (DRM). لا تُعرّف EME أنظمة المفاتيح نفسها، باستثناء "Clear Key" (المفتاح الواضح) (يتوفّر المزيد من المعلومات حول ذلك أدناه).
  • وحدة فك تشفير المحتوى (CDM): آلية خاصة ببرنامج أو جهاز من جهة العميل تتيح تشغيل الوسائط المشفرة. كما هو الحال مع الأنظمة الرئيسية، لا تُحدِّد EME أي أوامر توزيع، ولكنها توفر واجهة للتطبيقات للتفاعل مع أجهزة إدارة المحتوى المتاحة.
  • خادم الترخيص (المفتاح): يتفاعل مع أداة إدارة المحتوى (CDM) لتوفير مفاتيح لفك تشفير الوسائط. يقع على عاتق التطبيق مسؤولية التفاوض مع خادم الترخيص.
  • خدمة حزمة المحتوى: تشفّر الوسائط وتشفِّرها للتوزيع/الاستهلاك.

تجدر الإشارة إلى أنّ التطبيق الذي يستخدم EME يتفاعل مع خادم الترخيص للحصول على مفاتيح لتفعيل فك التشفير، ولكن هوية المستخدم والمصادقة ليستا جزءًا من EME. يتم استرداد المفاتيح لتفعيل تشغيل الوسائط بعد (اختياريًا) مصادقة مستخدم. يجب أن تصادق خدمات مثل Netflix على المستخدمين داخل تطبيق الويب الخاص بها: عندما يسجّل أحد المستخدمين الدخول إلى التطبيق، يحدد التطبيق هوية المستخدم وامتيازاته.

كيف تعمل أداة EME؟

إليك كيفية تفاعل مكونات EME، بما يتوافق مع مثال التعليمة البرمجية أدناه:

  1. يحاول أحد تطبيقات الويب تشغيل صوت أو فيديو يتضمّن عملية بث مشفّرة واحدة أو أكثر.
  2. يدرك المتصفّح أنّ الوسائط مشفرة (راجِع المربّع أدناه للتعرّف على كيفية حدوث ذلك) ويطلق حدث encrypted بالبيانات الوصفية (initData) التي تم الحصول عليها من الوسائط حول التشفير.
  3. يعالج التطبيق حدث encrypted:
    1. في حال عدم ربط أي عنصر MediaKeys بعنصر الوسائط، عليك أولاً اختيار نظام مفاتيح تشفير باستخدام navigator.requestMediaKeySystemAccess() للتحقّق من أنظمة المفاتيح المتاحة، ثم إنشاء كائن MediaKeys لأحد عناصر نظام المفاتيح المتاحة من خلال عنصر MediaKeySystemAccess. تجدر الإشارة إلى أنّه يجب إعداد عنصر MediaKeys قبل حدث encrypted الأول. يحصل التطبيق على عنوان URL لخادم الترخيص بشكل مستقل عن اختيار نظام إدارة مفاتيح متاح. يمثّل الكائن MediaKeys جميع المفاتيح المتاحة لفك تشفير الوسائط لعنصر صوتي أو عنصر فيديو. وهو يمثل مثيلاً لـ CDM ويوفر إمكانية الوصول إلى CDM، لا سيما لإنشاء الجلسات الرئيسية التي تُستخدم للحصول على المفاتيح من خادم ترخيص.
    2. بعد إنشاء الكائن MediaKeys، يمكنك تعيينه لعنصر الوسائط: يربط setMediaKeys() الكائن MediaKeys بعنصر HTMLMediaElement، لكي يتم استخدام مفاتيحه أثناء التشغيل، أي أثناء فك الترميز.
  4. ينشئ التطبيق MediaKeySession من خلال طلب الرقم createSession() على MediaKeys. ويؤدّي ذلك إلى إنشاء MediaKeySession، والتي تمثّل العمر الافتراضي للترخيص ومفاتيحه.
  5. ينشئ التطبيق طلب ترخيص من خلال تمرير بيانات الوسائط التي تم الحصول عليها في معالج encrypted إلى وحدة التحكُّم في المحتوى (CDM)، من خلال طلب generateRequest() على MediaKeySession.
  6. تنشط أداة CDM حدث message، وهو طلب للحصول على مفتاح من خادم ترخيص.
  7. يتلقّى الكائن MediaKeySession حدث message ويرسل التطبيق رسالة إلى خادم الترخيص (عبر XHR مثلاً).
  8. يتلقى التطبيق استجابة من خادم الترخيص ويمرر البيانات إلى CDM باستخدام طريقة update() في MediaKeySession.
  9. تفكّ وحدة إدارة المحتوى (CDM) تشفير الوسائط باستخدام المفاتيح الموجودة في الترخيص. ويمكن استخدام مفتاح صالح من أي جلسة داخل MediaKey المرتبطة بعنصر الوسائط. سيصل CDM إلى المفتاح والسياسة المفهرَسة بواسطة معرّف المفتاح.
  10. يتم استئناف تشغيل الوسائط.

حُلَّت المسألة...

تجدر الإشارة إلى أنّه قد تكون هناك رسائل متعدّدة بين CDM وخادم الترخيص، بالإضافة إلى أنّ جميع الاتصالات في هذه العملية غير واضحة بالنسبة إلى المتصفّح والتطبيق: لا يتعرّف CDM وخادم الترخيص على الرسائل إلا، على الرغم من أنّ طبقة التطبيق يمكنها معرفة نوع الرسالة التي يرسلها CDM. يحتوي طلب الترخيص على إثبات لصلاحية CDM (وعلاقة الثقة)، بالإضافة إلى مفتاح لاستخدامه عند تشفير مفاتيح المحتوى في الترخيص الناتج.

...ولكن ما هي وظيفتها الفعلية؟

لا يوفّر تنفيذ EME في حد ذاته طريقة لفك تشفير الوسائط: فهو يوفر واجهة برمجة تطبيقات لتطبيق ويب للتفاعل مع وحدات فك تشفير المحتوى.

وفي الواقع، لا يتم تحديد ما تفعله أجهزة إدارة المحتوى (CDM) بواسطة مواصفات EME، وقد تتولى الأداة التعامل مع فك تشفير (فك ضغط) الوسائط وفك التشفير. ومن الأقل إلى الأكثر قوةً، هناك العديد من الخيارات المحتملة لوظيفة CDM:

  • فك التشفير فقط، مع تفعيل التشغيل باستخدام مسار الوسائط العادي، من خلال عنصر <video> مثلاً
  • فك التشفير وفك الترميز، وتمرير إطارات الفيديو إلى المتصفّح لعرضها
  • فك التشفير وفك الترميز، والعرض مباشرةً في الأجهزة (على سبيل المثال، وحدة معالجة الرسومات)

هناك عدة طرق لإتاحة CDM لتطبيق ويب:

  • تجميع CDM مع المتصفح.
  • توزيع CDM بشكل منفصل.
  • إنشاء CDM في نظام التشغيل.
  • تضمين CDM في البرامج الثابتة
  • تضمين CDM في الأجهزة.

لا تعتمد مواصفة EME على كيفية توفير جهاز CDM، ولكن في جميع الحالات يكون المتصفّح مسؤولاً عن فحصه وعرضه.

ولا يفرِض EME نظام مفاتيح معيّنًا، فمتصفِّح Chrome يتوافق مع نظام التشغيل Widevine ويتوافق IE11 مع المتصفِّحات الحالية المتوافقة مع أجهزة الكمبيوتر المكتبي والأجهزة الجوّالة.

الحصول على مفتاح من خادم ترخيص

أثناء الاستخدام التجاري العادي، سيتم تشفير المحتوى وترميزه باستخدام خدمة أو أداة تغليف. وبمجرد إتاحة الوسائط المشفرة على الإنترنت، يمكن لبرنامج الويب الحصول على مفتاح (مضمن في الترخيص) من خادم ترخيص واستخدام المفتاح لتمكين فك التشفير وتشغيل المحتوى.

يعرض الرمز التالي (المعدّل من أمثلة المواصفات) كيف يمكن لتطبيق اختيار نظام مفاتيح ملائم والحصول على مفتاح من خادم ترخيص.

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

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

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')
  );
}

التشفير الشائع

تُتيح حلول التشفير الشائعة لموفّري المحتوى تشفير المحتوى وتجميعه مرة واحدة لكل حاوية أو برنامج ترميز، واستخدامه مع مجموعة متنوعة من أنظمة المفاتيح وأنظمة إدارة المحتوى (CDM) والبرامج العميلة: ويعني ذلك أي وحدة تحكم في المحتوى تتيح التشفير المشترك. على سبيل المثال، يمكن تشغيل فيديو تم حزمه باستخدام 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 على الأقل)، وهناك حلول أخرى قيد التطوير.

إضافات مصادر الوسائط (MSE)

HTMLMediaElement هو مخلوق يحتوي على جمال بسيط.

يمكننا تحميل الوسائط وفك ترميزها وتشغيلها ببساطة من خلال توفير عنوان URL لـ src:

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

تُعد واجهة برمجة التطبيقات Media Source API إضافة لـ HTMLMediaElement تتيح التحكم بشكل أكثر دقة في مصدر الوسائط، وذلك من خلال السماح لـ JavaScript بإنشاء مجموعات بث للتشغيل من "أجزاء" من الفيديو. ويؤدي ذلك بدوره إلى تفعيل أساليب مثل البث التكيُّفي وتغيير الوقت.

ما سبب أهمية الخطأ التربيعي المتوسط في عملية EME؟ فبالإضافة إلى توزيع المحتوى المحمي، يجب أن يكون موفرو المحتوى التجاري قادرين على تعديل تسليم المحتوى مع ظروف الشبكة والمتطلبات الأخرى. على سبيل المثال، يغيّر Netflix معدل نقل البيانات ديناميكيًا مع تغيّر ظروف الشبكة. تعمل أداة EME مع تشغيل ساحات مشاركات الوسائط التي يوفّرها تطبيق MSE، تمامًا كما تفعل مع الوسائط المقدَّمة من خلال سمة src.

كيف يمكن تقسيم وتشغيل الوسائط المشفرة بمعدلات نقل بيانات مختلفة؟ راجع قسم DASH أدناه.

يمكنك الاطّلاع على الخطأ التربيعي المتوسط عمليًا على الرابط simpl.info/mse. ولأغراض تتعلق بهذا المثال، يتم تقسيم فيديو WebM إلى خمسة مقاطع باستخدام File APIs. في تطبيق الإنتاج، يتم استرجاع مقاطع من الفيديو عبر 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);
  }
};

تعرّف على المزيد عن الخطأ التربيعي المتوسط في مقالة HTML5 Rocks.

البث الديناميكي التكيُّفي عبر HTTP (DASH)

أجهزة متعددة، وأنظمة أساسية متعددة، وجوال - أيًا كان اسمها، فإن الويب غالبًا ما يتم اختباره في ظل ظروف الاتصال القابل للتغيير. فالعرض الديناميكي والتكيّفي مهم جدًا في التعامل مع قيود معدل نقل البيانات والتباين في عالم الأجهزة المتعددة.

تمّ تصميم DASH (المعروفة أيضًا باسم MPEG-DASH) لتوفير أفضل طريقة ممكنة لتوصيل الوسائط في عالم غير مستقر، لكل من البث والتنزيل. وهناك العديد من التكنولوجيات الأخرى التي تنفّذ إجراءات مشابهة، مثل البث المباشر وفق بروتوكول HTTP (HLS) من Apple والبث السلس من Microsoft، ولكن بروتوكول DASH هو الطريقة الوحيدة لبث معدل نقل البيانات التكيُّفي عبر HTTP ويستند إلى معيار مفتوح. تُستخدم DASH حاليًا في مواقع مثل YouTube.

ما علاقة ذلك بكل من EME وMSE؟ يمكن لعمليات تنفيذ DASH المستندة إلى الخطأ التربيعي المتوسط تحليل البيان وتنزيل مقاطع من الفيديو بمعدل نقل بيانات مناسب وتغذية عنصر الفيديو عندما يتعذر عليه استخدام البنية الأساسية الحالية لبروتوكول HTTP.

بعبارة أخرى، يتيح DASH لمزودي المحتوى التجاري إجراء بث تكيُّفي للمحتوى المحمي.

يقوم DASH بما يقوله على القصدير:

  • ديناميكي: تستجيب للظروف المتغيرة.
  • تكيُّفي: تتكيّف هذه الميزة مع المحتوى الذي يتم فيه ضبط معدل نقل بيانات مناسب للصوت أو الفيديو.
  • البث: يتيح البث والتنزيل.
  • HTTP:يتيح هذا الخيار عرض المحتوى باستخدام بروتوكول HTTP، بدون أي عيوب في خادم البث التقليدي.

بدأت شبكة BBC تقديم مجموعات بث تجريبية باستخدام بروتوكول DASH:

خلاصة القول:

  1. يتم تشفير الوسائط بمعدلات نقل بيانات مختلفة.
  2. تتوفر الملفات المختلفة لمعدل نقل البيانات من خادم HTTP.
  3. يختار تطبيق الويب للعميل معدل نقل البيانات المطلوب استرداده وتشغيله مرة أخرى باستخدام 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 هذا مأخوذ من ملف .mpd المستخدَم في مشغّل العرض التوضيحي لـ DASH في YouTube).

وفقًا لمواصفات DASH، يمكن نظريًا استخدام ملف MPD باعتباره src لفيديو معيّن. ومع ذلك، وبهدف توفير المزيد من المرونة لمطوّري البرامج على الويب، اختار مورّدو المتصفّحات بدلاً من ذلك ترك دعم DASH في مكتبات JavaScript باستخدام الخطأ التربيعي المتوسط، مثل dash.js. يسمح تنفيذ DASH في JavaScript لخوارزمية التكيف بالتطور دون الحاجة إلى تحديثات المتصفح. ويتيح استخدام الخطأ التربيعي المتوسط أيضًا إجراء تجارب على تنسيقات ملفات بيان بديلة وآليات عرض بدون الحاجة إلى إجراء تغييرات على المتصفّح. ينفِّذ Shaka Player من Google برنامج DASH بدعم EME.

تتضمّن شبكة مطوّري برامج Mozilla تعليمات حول كيفية استخدام أدوات WebM وFFmpeg لتقسيم الفيديو وإنشاء تنسيق MPD.

الخلاصة

يتزايد استخدام الويب لعرض محتوى صوتي وفيديو مدفوع بمعدّل هائل. يبدو أن كل جهاز جديد، سواء كان جهازًا لوحيًا، أو وحدة تحكم ألعاب، أو تلفزيونًا متصلاً، أو جهاز فكّ ترميز المحتوى التلفزيوني، قادر على بث الوسائط من مقدمي المحتوى الرئيسيين عبر HTTP. أكثر من 85% من المتصفحات المتوافقة مع الأجهزة الجوّالة وأجهزة سطح المكتب تتوافق الآن مع <video> و<audio>، وتقدِّر شركة Cisco أن الفيديوهات ستجذب ما بين 80 إلى 90 بالمئة من الزيارات الواردة من المستهلكين على الإنترنت حول العالم بحلول عام 2017. في هذا السياق، من المرجّح أن يزداد أهمية استخدام المتصفِّحات المستخدَمة لتوزيع المحتوى المحمي بشكل متزايد، وذلك لأنّ مورِّدي المتصفّحات يقلّلون الدعم لواجهات برمجة التطبيقات التي تعتمد عليها معظم المكوّنات الإضافية للوسائط.

محتوى إضافي للقراءة

المواصفات والمعايير

مقالات