Start · Sprachen · JavaScript · Referenz · MediaEncryptedEvent.initData

MediaEncryptedEvent.initData

Eigenschaft

Die schreibgeschützte Eigenschaft <code>initData</code> liefert die Initialisierungsdaten eines <code>encrypted</code>-Ereignisses als <code>ArrayBuffer</code> oder <code>null</code>.

seit JavaScript Baseline: alle modernen Browser (Encrypted Media E Kategorie: webapi

Signatur

get MediaEncryptedEvent.initData

Beschreibung

Die Eigenschaft initData gehört zum Interface MediaEncryptedEvent der Encrypted Media Extensions (EME). Ein solches Ereignis löst ein HTMLMediaElement (<video> oder <audio>) mit dem Typ encrypted aus, sobald der Browser beim Abspielen verschlüsselte Medien erkennt. Die MDN-Kurzbeschreibung nennt hier fälschlich MediaKeyMessageEvent. Richtig ist MediaEncryptedEvent.

initData enthält die Initialisierungsdaten aus dem Medien-Container, zum Beispiel eine PSSH-Box bei CENC/MP4 oder die Key-ID bei WebM. Welches Format vorliegt, steht in der Schwester-Eigenschaft initDataType (z. B. "cenc", "keyids" oder "webm").

Normalerweise gibt man den Wert unverändert an MediaKeySession.prototype.generateRequest(initDataType, initData) weiter. Das Content Decryption Module (CDM) erzeugt daraus eine Lizenzanfrage, die es anschließend per message-Ereignis an die Anwendung übergibt. Enthält das Ereignis keine Initialisierungsdaten, ist der Wert null.

Rückgabewert

Typ
ArrayBuffer | null
Beschreibung
Ein ArrayBuffer mit den Initialisierungsdaten im Format von initDataType, oder null, wenn keine Daten vorhanden sind.

Beispiele

Lizenzanfrage im encrypted-Ereignis erzeugen

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

const setupEme = async () => {
  const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
    initDataTypes: ['cenc', 'keyids', 'webm'],
    videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
  }]);
  const mediaKeys = await access.createMediaKeys();
  await video.setMediaKeys(mediaKeys);

  video.addEventListener('encrypted', async (event) => {
    if (!event.initData) {
      console.warn('Keine Initialisierungsdaten vorhanden');
      return;
    }
    console.log('Typ:', event.initDataType, '| Bytes:', event.initData.byteLength);

    const session = mediaKeys.createSession();
    session.addEventListener('message', (msg) => {
      // msg.message an den Lizenzserver senden …
      console.log('Lizenzanfrage erzeugt:', msg.messageType);
    });
    await session.generateRequest(event.initDataType, event.initData);
  });
};

setupEme();
Typ: cenc | Bytes: 52 Lizenzanfrage erzeugt: license-request

Key-IDs aus initData im Format "keyids" auslesen

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

video.onencrypted = (event) => {
  if (event.initDataType !== 'keyids' || !event.initData) return;
  // Das Format "keyids" ist UTF-8-kodiertes JSON: {"kids":["base64url", …]}
  const json = new TextDecoder().decode(event.initData);
  const { kids } = JSON.parse(json);
  console.log('Key-IDs:', kids);
};
Key-IDs: ["LwVHf8JLtPrv2GUXFW2v_A"]

MediaEncryptedEvent selbst konstruieren (z. B. für Tests)

const payload = new TextEncoder().encode(JSON.stringify({ kids: ['LwVHf8JLtPrv2GUXFW2v_A'] }));

const event = new MediaEncryptedEvent('encrypted', {
  initDataType: 'keyids',
  initData: payload.buffer
});

console.log(event.initData instanceof ArrayBuffer, event.initData.byteLength);

const empty = new MediaEncryptedEvent('encrypted');
console.log(empty.initData);
true 36 null

// Wichtig · Fallstricke

  • Kann null sein: Prüfe den Wert immer, bevor du generateRequest() aufrufst. Andernfalls wird das Promise mit einem TypeError abgelehnt.
  • Mehrfaches Auslösen: Bei manchen Inhalten, etwa mit mehreren Spuren oder PSSH-Boxen, wird encrypted mehrmals ausgelöst. Merke dir, welche initData du bereits verarbeitet hast, zum Beispiel über einen Vergleich der Bytes. So vermeidest du doppelte Sessions und unnötige Anfragen an den Lizenzserver.
  • Format hängt von initDataType ab: "cenc" enthält eine oder mehrere PSSH-Boxen, "keyids" JSON und "webm" eine rohe Key-ID. Nicht jedes Schlüsselsystem unterstützt jedes Format. Frage die unterstützten Formate in requestMediaKeySystemAccess() über initDataTypes ab.
  • Schreibgeschützt: Wenn du der Eigenschaft einen Wert zuweist, passiert nichts. Eigene Werte lassen sich nur über den Konstruktor setzen.
  • Kompatibilität und Sicherheit: EME ist nur in sicheren Kontexten (HTTPS) verfügbar. Chrome, Edge, Firefox und Safari unterstützen EME, aber mit unterschiedlichen Schlüsselsystemen: Widevine, PlayReady oder FairPlay. org.w3.clearkey eignet sich zum Testen, ist aber nicht für echten Kopierschutz gedacht. In Safari verwendet FairPlay den initDataType "sinf" bzw. "skd".