Start · Sprachen · JavaScript · Referenz · MediaKeySystemAccess.createMediaKeys()

MediaKeySystemAccess.createMediaKeys()

Methode

Erzeugt asynchron ein neues <code>MediaKeys</code>-Objekt für das ausgehandelte Schlüsselsystem und liefert es als <code>Promise</code> zurück.

seit JavaScript Baseline: alle modernen Browser (EME, nur in siche Kategorie: webapi

Signatur

MediaKeySystemAccess.prototype.createMediaKeys()

Beschreibung

createMediaKeys() gehört zur Encrypted Media Extensions API (EME). Nachdem navigator.requestMediaKeySystemAccess() ein MediaKeySystemAccess-Objekt geliefert hat, erzeugt diese Methode daraus ein MediaKeys-Objekt. Dieses steht für die Schlüssel, die beim Entschlüsseln eines Medienelements verwendet werden.

Das erzeugte MediaKeys-Objekt wird dann per HTMLMediaElement.setMediaKeys() an ein <video>- oder <audio>-Element gebunden. Über mediaKeys.createSession() legst du danach Schlüssel-Sitzungen an, die mit dem Lizenzserver kommunizieren.

Die Konfiguration, die beim Erzeugen gilt, entspricht dem Rückgabewert von getConfiguration(). Du kannst also Codecs, Robustheit und Sitzungstypen nicht mehr nachträglich ändern. Für mehrere Medienelemente kannst du von demselben Access-Objekt mehrere MediaKeys-Instanzen erzeugen.

Rückgabewert

Typ
Promise<MediaKeys>
Beschreibung
Ein Promise, das sich in ein neues MediaKeys-Objekt auflöst. Bei Fehlern wird es abgelehnt, z. B. mit InvalidStateError oder NotSupportedError.

Beispiele

Clear Key einrichten und an ein Video binden

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

const config = [{
  initDataTypes: ['cenc'],
  videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}];

const setupEme = async () => {
  const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', config);
  const mediaKeys = await access.createMediaKeys();
  await video.setMediaKeys(mediaKeys);
  console.log('MediaKeys gesetzt für', access.keySystem);
};

setupEme().catch(err => console.error('EME-Fehler:', err.name, err.message));
MediaKeys gesetzt für org.w3.clearkey

Schlüsselsystem mit Ausweichlösung wählen

const keySystems = ['com.widevine.alpha', 'com.microsoft.playready', 'org.w3.clearkey'];
const config = [{
  initDataTypes: ['cenc'],
  audioCapabilities: [{ contentType: 'audio/mp4; codecs="mp4a.40.2"' }],
  videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}];

const getMediaKeys = async () => {
  for (const ks of keySystems) {
    try {
      const access = await navigator.requestMediaKeySystemAccess(ks, config);
      const keys = await access.createMediaKeys();
      return { keySystem: ks, keys };
    } catch {
      // nächstes System versuchen
    }
  }
  throw new Error('Kein unterstütztes Schlüsselsystem gefunden');
};

getMediaKeys().then(({ keySystem }) => console.log('Verwende', keySystem));
Verwende com.widevine.alpha

Session erzeugen und auf Lizenzanfrage reagieren

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

video.addEventListener('encrypted', async (event) => {
  if (!video.mediaKeys) {
    const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
      initDataTypes: [event.initDataType],
      videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
    }]);
    await video.setMediaKeys(await access.createMediaKeys());
  }

  const session = video.mediaKeys.createSession();
  session.addEventListener('message', async (msg) => {
    const res = await fetch('/license', { method: 'POST', body: msg.message });
    await session.update(await res.arrayBuffer());
  });
  await session.generateRequest(event.initDataType, event.initData);
});

// Wichtig · Fallstricke

  • Nur in sicheren Kontexten: EME funktioniert ausschließlich über HTTPS oder auf localhost. In iframes muss die Berechtigungsrichtlinie encrypted-media erlaubt sein.
  • Browser-Unterschiede: Welche Schlüsselsysteme verfügbar sind, hängt vom Browser ab. Chrome und Firefox bieten Widevine an, Edge PlayReady und Safari FairPlay (com.apple.fps). Nur org.w3.clearkey ist weit verbreitet, bietet aber keinen echten Schutz.
  • Das Promise kann auch dann abgelehnt werden, wenn requestMediaKeySystemAccess() erfolgreich war. Das passiert z. B. bei einem fehlenden oder deaktivierten CDM-Modul oder wenn der Nutzer DRM abgelehnt hat. Fange solche Fehler deshalb immer mit try/catch ab.
  • setMediaKeys() kann fehlschlagen, wenn die MediaKeys-Instanz schon an ein anderes Element gebunden ist. Erzeuge in diesem Fall pro Element eine eigene Instanz.
  • Die Methode erwartet keine Argumente. Die Konfiguration wird bereits bei requestMediaKeySystemAccess() festgelegt.