Signatur
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 mehrerepssh-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
"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);
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;
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 === '');
// Wichtig · Fallstricke
- Schreibgeschützt: Wenn Sie
event.initDataTypeetwas zuweisen, wird das still ignoriert (im Strict Mode gibt es einenTypeError). Den Wert können Sie nur über den Konstruktornew MediaEncryptedEvent(type, { initDataType })festlegen. - Groß- und Kleinschreibung zählt:
"CENC"ist kein gültiger Typ. Wenn Sie so einen Wert angenerateRequest()übergeben, schlägt der Aufruf mitNotSupportedErrorfehl. - Leere bzw. fehlende Daten: Stammen die Medien aus einer anderen Herkunft ohne CORS-Freigabe (oder handelt es sich um Mixed Content), setzt der Browser
initDataaufnull. Prüfen Sie deshalb immerinitData, bevor SiegenerateRequest()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, zeigtMediaKeySystemAccess.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").