מה זה EME?

תוספי מדיה מוצפנים הם API שמאפשר לאפליקציות אינטרנט לקיים אינטראקציה עם מערכות להגנה על תוכן, כדי לאפשר הפעלה של אודיו ווידאו מוצפנים.

EME נועד לאפשר את השימוש באותה האפליקציה ובקבצים מוצפנים בכל דפדפן, ללא קשר למערכת ההגנה הבסיסית. הדרך הראשונה מאפשרת את התהליך באמצעות ממשקי ה-API והזרימה הסטנדרטיים, והשנייה מתאפשרת באמצעות Common Encryption (הצפנה משותפת).

EME הוא תוסף למפרט של HTMLMediaElement — ומכאן השם. המשמעות של 'תוסף' היא שהתמיכה בדפדפן ב-EME היא אופציונלית: אם דפדפן לא תומך במדיה מוצפנת, הוא לא יוכל להפעיל מדיה מוצפנת, אבל EME לא נדרש לתאימות למפרט ה-HTML. מהמפרט של EME:

ההצעה הזו מרחיבה את HTMLMediaElement ומספקת ממשקי API לשליטה בהפעלה של תוכן מוגן.

ה-API תומך בתרחישים לדוגמה שונים, החל מפענוח מפתחות פשוט וברור ועד לווידאו בעל ערך גבוה (תוך הטמעה מתאימה של סוכן המשתמש). החלפת הרישיונות או המפתחות נשלטת על ידי האפליקציה, וכך אפשר לפתח אפליקציות הפעלה מתקדמות שתומכות במגוון טכנולוגיות לפענוח ולהגנה של תוכן.

המפרט הזה לא מגדיר מערכת להגנה על תוכן או לניהול זכויות דיגיטליות. במקום זאת, הוא מגדיר ממשק API נפוץ שיכול לשמש לגילוי, לבחירה ולאינטראקציה עם מערכות כאלה וכן עם מערכות פשוטות יותר להצפנת תוכן. ההטמעה של ניהול זכויות דיגיטלי (DRM) לא נדרשת כדי לעמוד במפרט הזה: צריך להטמיע רק את מערכת Clear Key כקו בסיס משותף.

ממשק ה-API הנפוץ תומך בקבוצה פשוטה של יכולות להצפנת תוכן, וכך משאירים למחברי הדפים פונקציות של אפליקציות, כמו אימות והרשאה. לשם כך יש צורך בגישור של הודעות ספציפיות למערכת להגנה על תוכן, במקום כשיש תקשורת מחוץ למסגרת בין מערכת ההצפנה לבין רישיון או שרת אחר.

הטמעות EME משתמשות ברכיבים החיצוניים הבאים:

  • מערכת מפתחות: מנגנון של הגנה על תוכן (DRM). EME לא מגדיר את מערכות המפתחות עצמן, מלבד 'ניקוי מפתח' (מידע נוסף על כך בהמשך).
  • Content Decryption Module (CDM): תוכנה בצד הלקוח או מנגנון חומרה שמאפשרים הפעלה של מדיה מוצפנת. בדומה למערכות מפתחות, EME לא מגדיר קובצי CDM, אבל מספק ממשק לאפליקציות לקיום אינטראקציה עם מנגנוני CDM זמינים.
  • שרת רישיונות (מפתחות): אינטראקציה עם CDM כדי לספק מפתחות לפענוח המדיה. המשא ומתן עם שרת הרישיונות הוא באחריות האפליקציה.
  • שירות אריזה: קידוד והצפנה של מדיה לצורך הפצה/צריכה.

שימו לב שאפליקציה שמשתמשת ב-EME יוצרת אינטראקציה עם שרת רישיונות כדי לקבל מפתחות שיאפשרו פענוח, אבל זהות המשתמש והאימות אינם חלק מ-EME. אחזור המפתחות כדי להפעיל את המדיה מתבצע אחרי (לא חובה) אימות של משתמש. שירותים כמו Netflix חייבים לאמת משתמשים באפליקציית האינטרנט שלהם: כשמשתמש נכנס לאפליקציה, האפליקציה קובעת את זהותו ואת ההרשאות שלו.

איך פועל EME?

אלו הם האינטראקציה בין הרכיבים של EME, בהתאם לקוד לדוגמה שלמטה:

אם יש מספר פורמטים או רכיבי Codec זמינים, אפשר להשתמש ב-MediaSource.isTypeSupported() או ב-HTMLMediaElement.canPlayType() כדי לבחור את הפורמט הנכון. עם זאת, ה-CDM עשוי לתמוך רק בחלק מהפריטים שהדפדפן תומך בתוכן לא מוצפן. עדיף לנהל משא ומתן על הגדרת MediaKeys לפני שבוחרים פורמט וקודק. אם האפליקציה מחכה לאירוע המוצפן, אבל MediaKeys מראה שהיא לא יכולה לטפל בפורמט/קודק שנבחרו, ייתכן שיהיה מאוחר מדי להחליף בלי להפריע להפעלה.

התהליך המומלץ הוא קודם כול לנהל משא ומתן על MediaKeys, ולהשתמש ב-MediaKeysSystemAccess.getConfiguration() כדי לברר על התצורה שעליה הוסכם.

אם אפשר לבחור רק פורמט אחד או קודק אחד, אין צורך ב-getConfiguration(). עם זאת, עדיין עדיף להגדיר קודם את MediaKeys. הסיבה היחידה להמתין לאירוע המוצפן היא אם אין דרך לדעת אם התוכן מוצפן או לא, אבל בפועל זה לא סביר.

  1. אפליקציית אינטרנט מנסה להפעיל אודיו או וידאו שיש בהם שידור מוצפן אחד או יותר.
  2. הדפדפן מזהה שהמדיה מוצפנת (ראו איך זה קורה בהמשך) ומפעיל אירוע מוצפן עם מטא-נתונים (initData) שהתקבלו מהמדיה לגבי ההצפנה.
  3. האפליקציה מטפלת באירוע המוצפן:

    1. אם לא שויך אובייקט MediaKeys לרכיב המדיה, קודם צריך לבחור מערכת מפתחות זמינה באמצעות navigator.requestMediaKeySystemAccess() כדי לבדוק אילו מערכות Key Systems זמינות, ולאחר מכן ליצור אובייקט MediaKeys עבור מערכת מפתחות זמינה באמצעות אובייקט MediaKeySystemAccess. שימו לב שהאתחול של אובייקט MediaKeys צריך להתרחש לפני האירוע המוצפן הראשון. כדי לקבל כתובת URL של שרת רישיונות, האפליקציה לא בוחרת מערכת מפתחות זמינה. אובייקט MediaKeys מייצג את כל המפתחות הזמינים לפענוח המדיה של רכיב אודיו או וידאו. הוא מייצג מכונת CDM ומספק גישה ל-CDM, במיוחד ליצירת סשנים של מפתחות, שמשמשים לקבלת מפתחות משרת רישיונות.

    2. אחרי שיוצרים אובייקט MediaKeys, מקצים אותו לרכיב המדיה: setMediaKeys() משייכת את אובייקט MediaKeys ל-HTMLMediaElement, כדי שניתן יהיה להשתמש במפתחות שלו במהלך ההפעלה, כלומר במהלך פענוח הקידוד.

  4. האפליקציה יוצרת MediaKeySession על ידי קריאה ל-createSession() ב-MediaKeys. הפעולה הזו יוצרת MediaKeySession, שמייצג את משך החיים של רישיון ואת המפתחות שלו.

  5. האפליקציה יוצרת בקשת רישיון באמצעות העברת נתוני המדיה שהתקבלו ב-handler המוצפן אל CDM, על ידי קריאה ל-createRequest() ב-MediaKeySession.

  6. ה-CDM מפעיל אירוע של הודעה: בקשה לקבלת מפתח משרת רישיונות.

  7. האובייקט MediaKeySession מקבל את האירוע של ההודעה, והאפליקציה שולחת הודעה לשרת הרישיונות (לדוגמה, באמצעות XHR).

  8. האפליקציה מקבלת תגובה משרת הרישיונות ומעבירה את הנתונים ל-CDM באמצעות שיטת update() של MediaKeySession.

  9. ה-CDM מפענח את המדיה באמצעות המפתחות שברישיון. ניתן להשתמש במפתח תקין מכל הפעלה ב-MediaKeys שמשויכת לרכיב המדיה. ה-CDM ייגש למפתח ולמדיניות, שנוספו לאינדקס לפי מזהה המפתח.

הפעלת המדיה תמשיך.

איך הדפדפן מזהה שהמדיה מוצפנת?

מידע זה נמצא במטא-נתונים של קובץ מאגר המדיה, שיהיה בפורמט כגון ISO BMFF או WebM. ב-ISO BMFF, המשמעות היא מטא-נתונים של הכותרת, שנקראים 'תיבת המידע של סכמת ההגנה'. WebM משתמש ברכיב Matroska ContentEncryption, עם כמה תוספות ספציפיות ל-WebM. קיימות הנחיות לכל קונטיינר במרשם ספציפי ל-EME.

שימו לב שיכולות להיות הודעות מרובות בין ה-CDM לבין שרת הרישיונות, וכל התקשורת בתהליך הזה תהיה אטומה לדפדפן ולאפליקציה: רק ה-CDM ושרת הרישיונות יכולים להבין את ההודעות, אבל שכבת האפליקציה יכולה לראות את סוג ההודעה שה-CDM שולח. בקשת הרישיון מכילה הוכחה לתוקף (וקשרי האמון) של ה-CDM וגם מפתח לשימוש בהצפנת מפתחות התוכן ברישיון שנוצר.

אבל מה למעשה CDMs עושים?

הטמעת EME לא מספקת כשלעצמה דרך לפענוח מדיה, אלא רק מספקת API שמאפשר לאפליקציית אינטרנט לתקשר עם מודולים של פענוח תוכן.

מה ש-CDMs למעשה לא מוגדר במפרט ה-EME, ו-CDM עשוי לטפל בפענוח קידוד (פתיחת דחיסה) של מדיה וגם בפענוח. מהיעילות הנמוכה ביותר לפונקציונליות CDM:

  • פענוח בלבד, מאפשר הפעלה באמצעות צינור המדיה הרגיל, לדוגמה, באמצעות רכיב <video>.
  • פענוח ופענוח, המעבירים פריימים של סרטון לדפדפן לצורך רינדור.
  • פענוח ופענוח, רינדור ישירות בחומרה (לדוגמה, GPU).

יש מספר דרכים להפוך CDM לזמין לאפליקציית אינטרנט:

  • אגד CDM עם הדפדפן.
  • יש להפיץ CDM בנפרד.
  • צור CDM לתוך מערכת ההפעלה.
  • כולל CDM בקושחה.
  • הטמעת CDM בחומרה.

במפרט ה-EME לא מוגדר האופן שבו CDM הופך לזמין, אבל בכל המקרים הדפדפן אחראי לבדיקה ולחשיפה של ה-CDM.

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

הצפנה נפוצה

פתרונות הצפנה נפוצים מאפשרים לספקי תוכן להצפין ולארוז את התוכן שלהם פעם אחת בכל קונטיינר או קודק, ולהשתמש בו במגוון של מערכות מפתחות, CDM ולקוחות: כלומר כל CDM שתומך בהצפנה משותפת. לדוגמה, ניתן להפעיל בדפדפן סרטון שנארז באמצעות PlayReady כדי להפעיל אותו בדפדפן באמצעות Widevine CDM שמקבל מפתח משרת רישיונות של Widevine.

זאת בניגוד לפתרונות מדור קודם, שיפעלו רק עם סטאק אנכי מלא, כולל לקוח יחיד שלרוב כלל גם סביבת זמן ריצה של אפליקציה.

Common Encryption (CENC) הוא תקן ISO שמגדיר סכימת הגנה ל-ISO BMFF. קונספט דומה חל על WebM.

הסרת המפתח

על אף ש-EME לא מגדיר פונקציונליות של DRM, אבל לפי המפרט הנוכחי, כל הדפדפנים שתומכים ב-EME חייבים להטמיע את Clear Key. באמצעות המערכת הזו, אפשר להצפין את המדיה באמצעות מפתח, ואז להפעיל אותה שוב על ידי אספקת המפתח הזה. אפשר מובנה בדפדפן עם מפתח ברור: לא צריך להשתמש במודול פענוח נפרד.

סביר להניח שלא ייעשה שימוש בסוגים רבים של תוכן מסחרי, אבל עם Clear Key אפשר לפעול בצורה מלאה בכל הדפדפנים שתומכים ב-EME. הוא גם שימושי לבדיקת יישומי EME ואפליקציות באמצעות EME, ללא צורך לבקש מפתח תוכן משרת רישיונות. יש דוגמה פשוטה ל-Clear Key בכתובת 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) ואנחנו מפתחים פתרונות נוספים.

HTMLMediaElement הוא יצור בעל יופי פשוט.

אנחנו יכולים לטעון, לפענח ולהפעיל מדיה פשוט על ידי אספקת כתובת URL מסוג src:

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

ה-Media Source API הוא תוסף ל-HTMLMediaElement שמאפשר שליטה מדויקת יותר במקור המדיה, על ידי מתן אפשרות ל-JavaScript לבנות זרמים להפעלה מ 'קטעי וידאו'. כך מתאפשרות טכניקות כמו סטרימינג דינמי והזזת מועד הצפייה.

למה MSE חשוב ל-EME? מכיוון שבנוסף להפצת תוכן מוגן, לספקי תוכן מסחרי חייבת להיות אפשרות להתאים את העברת התוכן לתנאי הרשת ולדרישות אחרות. לדוגמה, Netflix, למשל, משנה באופן דינמי את קצב העברת הנתונים של השידור בהתאם לשינויים בתנאי הרשת. EME פועל עם הפעלה של שידורי מדיה שמסופקים על ידי הטמעת MSE, בדיוק כמו עם מדיה שמסופקת באמצעות מאפיין src.

כיצד לפצל ולהפעיל מדיה שמקודדת בקצבי העברת נתונים שונים? ראו קטע DASH שבהמשך.

תוכלו לראות את ה-MSE בפעולה ב-simpl.info/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 ( MSE).

מרובה מכשירים, פלטפורמות מרובות וניידים – לא משנה מה תקראו, האינטרנט חווה לעיתים קרובות בתנאים של קישוריות משתנה. אספקה דינמית ואדפטיבית היא חיונית להתמודדות עם מגבלות רוחב פס ועם גיוון בעולם מרובה מכשירים.

DASH (הנקרא גם MPEG-DASH) נועד לאפשר את העברת המדיה הטובה ביותר בעולם בעייתי, הן לסטרימינג והן להורדה. כמה טכנולוגיות אחרות עושות משהו דומה – כמו HTTP Live Streaming (HLS) של Apple ו-Smooth Streaming של Microsoft – אבל DASH היא השיטה היחידה לסטרימינג עם קצב העברת נתונים דינמי ב-HTTP שמבוססת על תקן פתוח. DASH כבר נמצא בשימוש באתרים כגון YouTube.

מה זה קשור ל-EME ול-MSE? הטמעות DASH שמבוססות על MSE יכולות לנתח מניפסט, להוריד קטעי וידאו בקצב העברת נתונים מתאים ולהזין אותם לרכיב וידאו כשהוא במצב רעב, באמצעות תשתית HTTP קיימת.

במילים אחרות, DASH מאפשר לספקי תוכן מסחרי לבצע סטרימינג אדפטי של תוכן מוגן.

DASH עושה את מה שכתוב על הפח:

  • דינמית: בתגובה לתנאים משתנים.
  • ניתן להתאמה: התאמות שמותאמות לספק קצב העברת נתונים מתאים של אודיו או וידאו.
  • סטרימינג: מאפשר סטרימינג וגם הורדות.
  • HTTP: מאפשר העברת תוכן עם היתרון של HTTP, ללא החסרונות של שרת סטרימינג מסורתי.

הערוץ BBC התחיל לספק שידורי בדיקה באמצעות DASH:

המדיה מקודדת מספר פעמים בקצבי העברת נתונים שונים. כל קידוד נקרא 'ייצוג'. פלחי המדיה האלה מחולקים למספר פלחי מדיה. הלקוח מפעיל תוכנית על ידי בקשת פלחים מייצוג ב-HTTP לפי הסדר. אפשר לקבץ את הייצוגים לקבוצות התאמה של ייצוגים שמכילים תוכן מקביל. אם הלקוח רוצה לשנות את קצב העברת הנתונים, הוא יכול לבחור חלופה מקבוצת ההתאמה הנוכחית ולהתחיל לבקש קטעים מהייצוג הזה. התוכן מקודד כך שיאפשר ללקוח לבצע את המעבר בקלות. בנוסף למספר קטעי מדיה, לייצוג יש בדרך כלל גם פלח של הפעלה. אפשר להתייחס אליו ככותרת שמכילה מידע על הקידוד, גודל הפריים וכו'. הלקוח צריך להשיג את המזהה של ייצוג נתון לפני שהוא ישתמש בקטעי מדיה מהייצוג הזה.

לסיכום:

  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 שמשמש לנגן ההדגמה של YouTube DASH).

לפי מפרט DASH, קובץ MPD יכול לשמש בתור המקור של הסרטון. עם זאת, כדי לספק למפתחי אתרים יותר גמישות, ספקי דפדפנים בחרו במקום זאת להשאיר תמיכה ב-DASH לספריות JavaScript באמצעות MSE, כמו dash.js. ההטמעה של DASH ב-JavaScript מאפשרת לאלגוריתם ההתאמה להתפתח בלי שתצטרכו לעדכן את הדפדפן. השימוש ב-MSE מאפשר גם להתנסות בפורמטים חלופיים של מניפסטים ובמנגנוני העברה, בלי שתצטרכו לבצע שינויים בדפדפן. Shaka Player של Google מטמיע לקוח DASH עם תמיכה ב-EME.

Mozilla Developer Network כוללת הוראות לשימוש בכלים של WebM וב-FFmpeg כדי לפלח סרטונים וליצור MPD.

סיכום

השימוש באינטרנט כדי להציג וידאו ואודיו בתשלום גדל בקצב עצום. נראה שכל מכשיר חדש, בין אם מדובר בטאבלט, בקונסולת משחקים, בטלוויזיה מחוברת או בממיר, יכול להפעיל סטרימינג של מדיה מספקי התוכן העיקריים ב-HTTP. יותר מ-85% מהדפדפנים בנייד ובמחשבים תומכים עכשיו ב-<video> וב-<audio>, ולפי ההערכה של Cisco, מודעות הווידאו יהיו 80 עד 90 אחוזים מהתנועה הגלובלית של צרכנים באינטרנט עד 2017. בהקשר הזה, סביר להניח שהתמיכה בדפדפן להפצת תוכן מוגן תהיה משמעותית יותר ויותר, כי ספקי הדפדפנים מצמצמים את התמיכה בממשקי API שעליהם מסתמכים רוב יישומי הפלאגין של המדיה.

קריאה נוספת

מפרטים וסטנדרטים

מפרט EME: הטיוטה האחרונה של Editor Common Encryption (CENC) תוספים למקור מדיה: הטיוטה האחרונה של העורך תקן DASH (כן, זה קובץ PDF) סקירה כללית של תקן DASH

מאמרים

DTG Webinar (מיושן חלקית) מהו EME?, מאת Henri Sivonen Media Source Plugin, פריימר MPEG-DASH Test Streams: פוסט בבלוג של BBC R&D

הדגמות

ניקוי הדגמה של מפתח: simpl.info/ck הדגמה של תוספי מקור מדיה (MSE) Shaka Player של Google מטמיע לקוח DASH עם תמיכה ב-EME

משוב