Signatur
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
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();
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);
};
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);
// Wichtig · Fallstricke
- Kann
nullsein: Prüfe den Wert immer, bevor dugenerateRequest()aufrufst. Andernfalls wird das Promise mit einemTypeErrorabgelehnt. - Mehrfaches Auslösen: Bei manchen Inhalten, etwa mit mehreren Spuren oder PSSH-Boxen, wird
encryptedmehrmals ausgelöst. Merke dir, welcheinitDatadu 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
initDataTypeab:"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 inrequestMediaKeySystemAccess()überinitDataTypesab. - 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.clearkeyeignet sich zum Testen, ist aber nicht für echten Kopierschutz gedacht. In Safari verwendet FairPlay deninitDataType"sinf"bzw."skd".