Signatur
Beschreibung
Die Eigenschaft MediaKeyMessageEvent.message gehört zu den Encrypted Media Extensions (EME). Sie enthält die Binärdaten, die das Content Decryption Module (CDM) an die Anwendung übergibt. In aller Regel ist das eine Lizenzanfrage (license-request), die du unverändert an deinen Lizenzserver (z. B. Widevine, PlayReady oder einen ClearKey-Server) weiterleitest.
Das Ereignis message wird auf einer MediaKeySession ausgelöst, nachdem du generateRequest() aufgerufen hast oder wenn das CDM eine Lizenzerneuerung bzw. -freigabe braucht. Welche Art von Nachricht vorliegt, erkennst du an event.messageType ("license-request", "license-renewal", "license-release", "individualization-request").
Der Inhalt des ArrayBuffer ist je nach Schlüsselsystem unterschiedlich: Bei Widevine und PlayReady ist es ein proprietäres Binärformat bzw. XML (PlayReady als UTF-16), bei ClearKey ein UTF-8-kodiertes JSON-Objekt. Die Serverantwort übergibst du anschließend mit session.update(response) wieder an die Session.
Rückgabewert
messageType ab und sollte normalerweise unverändert an den Lizenzserver geschickt werden.Beispiele
Lizenzanfrage an den Lizenzserver weiterleiten
const video = document.querySelector('video');
video.addEventListener('encrypted', async (event) => {
const access = await navigator.requestMediaKeySystemAccess('com.widevine.alpha', [{
initDataTypes: ['cenc'],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}]);
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);
const session = mediaKeys.createSession();
session.addEventListener('message', async (msgEvent) => {
// msgEvent.message ist ein ArrayBuffer
const response = await fetch('https://license.example.com/widevine', {
method: 'POST',
body: msgEvent.message
});
const license = await response.arrayBuffer();
await session.update(license);
});
await session.generateRequest(event.initDataType, event.initData);
});
ClearKey-Nachricht als JSON auslesen
session.onmessage = (event) => {
const text = new TextDecoder().decode(event.message);
const request = JSON.parse(text);
console.log(event.messageType, request);
};
Nach Nachrichtentyp unterscheiden
session.addEventListener('message', async ({ message, messageType }) => {
console.log(`${messageType}: ${message.byteLength} Bytes`);
if (messageType === 'license-release') {
await fetch('/license/release', { method: 'POST', body: message });
return;
}
const res = await fetch('/license', { method: 'POST', body: message });
await session.update(await res.arrayBuffer());
});
// Wichtig · Fallstricke
- Nicht verändern: Die Nachricht ist für den Lizenzserver bestimmt. Schicke sie als Binärdaten (
ArrayBuffer) im Body; eine Umwandlung in einen String zerstört proprietäre Formate wie Widevine. - Serverspezifische Hülle: Manche Lizenzserver (z. B. PlayReady-Setups oder DRM-Dienstleister) erwarten die Nachricht eingebettet in JSON/Base64 oder brauchen zusätzliche Header (Token,
Content-Type). Dokumentation des Anbieters beachten. - Sicherer Kontext: EME steht nur über HTTPS zur Verfügung; der Lizenzserver muss CORS korrekt konfigurieren, sonst scheitert der
fetch(). - Kompatibilität: Von allen modernen Browsern unterstützt, aber die verfügbaren Schlüsselsysteme unterscheiden sich (Chrome/Firefox: Widevine, Edge: PlayReady + Widevine, Safari: FairPlay). ClearKey eignet sich zum Testen.
- Die Eigenschaft ist schreibgeschützt; synthetische Events lassen sich über
new MediaKeyMessageEvent('message', { messageType, message })erzeugen.