Signatur
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
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));
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));
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 Berechtigungsrichtlinieencrypted-mediaerlaubt 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). Nurorg.w3.clearkeyist 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 mittry/catchab. setMediaKeys()kann fehlschlagen, wenn dieMediaKeys-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.