Start · Sprachen · JavaScript · Referenz · MediaEncryptedEvent.initDataType

MediaEncryptedEvent.initDataType

Eigenschaft

Schreibgeschützter String, der das Format der Initialisierungsdaten (<code>initData</code>) eines <code>encrypted</code>-Ereignisses angibt, z. B. <code>"cenc"</code>, <code>"keyids"</code> oder <code>"webm"</code>.

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

Signatur

MediaEncryptedEvent.initDataType

Beschreibung

Die schreibgeschützte Eigenschaft initDataType des MediaEncryptedEvent gibt einen String zurück, der den Typ der Initialisierungsdaten beschreibt, die in event.initData enthalten sind. Groß- und Kleinschreibung werden dabei beachtet. (Hinweis: Die Eigenschaft gehört zu MediaEncryptedEvent, nicht zu MediaKeyMessageEvent, wie es in manchen Quellen falsch steht.)

Ein MediaEncryptedEvent wird als encrypted-Ereignis auf einem HTMLMediaElement (<video> oder <audio>) ausgelöst, wenn der Browser im Medienstrom verschlüsselungsbezogene Initialisierungsdaten findet. Diese stecken zum Beispiel in einer pssh-Box eines MP4-Containers oder in den Header-Daten einer WebM-Datei. Welche Werte möglich sind, legt die W3C Initialization Data Format Registry fest:

  • "cenc" – Common Encryption (ISO/IEC 23001-7), also eine oder mehrere pssh-Boxen aus MP4/fMP4
  • "keyids" – eine JSON-Liste mit Schlüssel-IDs (wird vor allem bei Clear Key verwendet)
  • "webm" – eine einzelne Schlüssel-ID aus einer WebM-Datei

In der Praxis reichen Sie den Wert zusammen mit initData direkt an MediaKeySession.generateRequest(initDataType, initData) weiter. Das Content Decryption Module (CDM) erzeugt daraus eine Lizenzanfrage. Außerdem sollten Sie schon bei navigator.requestMediaKeySystemAccess() über initDataTypes angeben, welche Formate Ihre Anwendung unterstützt.

Rückgabewert

Typ
string
Beschreibung
Der Typ der Initialisierungsdaten, z. B. "cenc", "keyids" oder "webm". Wurde beim Erzeugen des Ereignisses kein Typ angegeben, ist der Wert ein leerer String "".

Beispiele

encrypted-Ereignis auswerten und Lizenzanfrage 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) => {
    console.log('Init-Datentyp:', event.initDataType);
    if (!event.initData) {
      console.warn('Keine Initialisierungsdaten verfügbar');
      return;
    }
    const session = mediaKeys.createSession();
    session.addEventListener('message', (msg) => {
      // msg.message an den Lizenzserver schicken ...
      console.log('Lizenzanfrage:', msg.messageType);
    });
    await session.generateRequest(event.initDataType, event.initData);
  });
};

setupEme().catch(console.error);
Init-Datentyp: cenc Lizenzanfrage: license-request

Nur unterstützte Formate verarbeiten

const SUPPORTED_TYPES = new Set(['cenc', 'keyids']);

const onEncrypted = (event) => {
  // Vergleich ist case-sensitiv: 'CENC' wäre ungültig
  if (!SUPPORTED_TYPES.has(event.initDataType)) {
    console.error(`Nicht unterstützter Init-Datentyp: "${event.initDataType}"`);
    return;
  }
  console.log(`Verarbeite ${event.initDataType}-Daten (${event.initData.byteLength} Bytes)`);
};

document.querySelector('video').onencrypted = onEncrypted;
Verarbeite cenc-Daten (52 Bytes)

Ereignis manuell erzeugen (z. B. für Tests)

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

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

console.log(event.initDataType);
console.log(new MediaEncryptedEvent('encrypted').initDataType === '');
keyids true

// Wichtig · Fallstricke

  • Schreibgeschützt: Wenn Sie event.initDataType etwas zuweisen, wird das still ignoriert (im Strict Mode gibt es einen TypeError). Den Wert können Sie nur über den Konstruktor new MediaEncryptedEvent(type, { initDataType }) festlegen.
  • Groß- und Kleinschreibung zählt: "CENC" ist kein gültiger Typ. Wenn Sie so einen Wert an generateRequest() übergeben, schlägt der Aufruf mit NotSupportedError fehl.
  • Leere bzw. fehlende Daten: Stammen die Medien aus einer anderen Herkunft ohne CORS-Freigabe (oder handelt es sich um Mixed Content), setzt der Browser initData auf null. Prüfen Sie deshalb immer initData, bevor Sie generateRequest() aufrufen.
  • Nicht jedes Key-System unterstützt jeden Typ: Widevine und PlayReady arbeiten meist mit "cenc", Clear Key zusätzlich mit "keyids" und "webm". Welche Typen tatsächlich unterstützt werden, zeigt MediaKeySystemAccess.getConfiguration().initDataTypes.
  • Kompatibilität: Die Eigenschaft ist Teil der Encrypted Media Extensions (EME) und steht in allen aktuellen Desktop-Browsern und den meisten mobilen Browsern zur Verfügung. EME funktioniert nur in sicheren Kontexten (HTTPS). Safari unterstützt als proprietäres DRM nur FairPlay (Init-Datentyp "sinf" bzw. "skd").