Signatur
Beschreibung
Die Eigenschaft keySystem gehört zur Schnittstelle MediaKeySystemAccess der Encrypted Media Extensions (EME). Sie ist schreibgeschützt und liefert den Bezeichner des Schlüsselsystems, also des Content Decryption Module (CDM). Das ist genau das System, das beim Aufruf von navigator.requestMediaKeySystemAccess() angefragt und vom Browser erfolgreich bereitgestellt wurde.
Typische Werte sind in umgekehrter Domain-Schreibweise angegeben:
"org.w3.clearkey": Clear Key, das von der Spezifikation vorgeschriebene Referenzsystem ohne echten Kopierschutz"com.widevine.alpha": Google Widevine (Chrome, Firefox, Edge, Android)"com.microsoft.playready"bzw."com.microsoft.playready.recommendation": Microsoft PlayReady (Edge, Windows)"com.apple.fps"bzw."com.apple.fps.1_0": Apple FairPlay Streaming (Safari)
In der Praxis braucht man keySystem vor allem, wenn ein Player nacheinander mehrere Schlüsselsysteme ausprobiert. Die Eigenschaft zeigt dann, welches System tatsächlich verfügbar war. Davon hängt ab, welcher Lizenzserver angesprochen wird, welches Initialisierungsdaten-Format (PSSH-Box) gilt und wie die Lizenzanfrage aufgebaut sein muss.
Rückgabewert
"com.widevine.alpha". Er entspricht dem Wert, der an navigator.requestMediaKeySystemAccess() übergeben wurde.Beispiele
Unterstütztes Schlüsselsystem abfragen
const config = [{
initDataTypes: ['cenc'],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
}];
const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', config);
console.log(access.keySystem);
Erstes verfügbares DRM-System ermitteln und Lizenzserver wählen
const licenseServers = {
'com.widevine.alpha': 'https://drm.example.com/widevine',
'com.microsoft.playready': 'https://drm.example.com/playready',
'org.w3.clearkey': 'https://drm.example.com/clearkey'
};
const config = [{
initDataTypes: ['cenc'],
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.640028"' }],
audioCapabilities: [{ contentType: 'audio/mp4; codecs="mp4a.40.2"' }]
}];
const findKeySystem = async () => {
for (const system of Object.keys(licenseServers)) {
try {
return await navigator.requestMediaKeySystemAccess(system, config);
} catch {
// System nicht verfügbar, nächstes probieren
}
}
throw new Error('Kein unterstütztes Schlüsselsystem gefunden');
};
const access = await findKeySystem();
const licenseUrl = licenseServers[access.keySystem];
console.log(`Nutze ${access.keySystem} mit ${licenseUrl}`);
Schlüsselsystem mit Konfiguration protokollieren und MediaKeys erzeugen
const video = document.querySelector('video');
const access = await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
initDataTypes: ['keyids'],
videoCapabilities: [{ contentType: 'video/webm; codecs="vp9"' }]
}]);
console.log('System:', access.keySystem);
console.log('Konfiguration:', access.getConfiguration());
const mediaKeys = await access.createMediaKeys();
await video.setMediaKeys(mediaKeys);
// Wichtig · Fallstricke
- Nur lesbar: Wenn man
keySystemzuweist, hat das keine Wirkung (im Strict Mode gibt es einenTypeError). Um ein anderes System zu nutzen, muss manrequestMediaKeySystemAccess()erneut aufrufen. - Sicherer Kontext: EME steht nur über HTTPS (oder
localhost) zur Verfügung. In unsicheren Kontexten fehltnavigator.requestMediaKeySystemAccessoder wirft einen Fehler. - Browser-Unterschiede: Welche Schlüsselsysteme verfügbar sind, hängt von Browser, Betriebssystem und Hardware ab. Widevine fehlt in Safari, FairPlay gibt es nur bei Apple, PlayReady vor allem in Edge unter Windows. Nur Clear Key ist laut Spezifikation Pflicht.
- Varianten-Bezeichner: Manche Systeme haben mehrere Bezeichner (z. B.
com.microsoft.playready.recommendationmit Hardware-Sicherheitsstufen). Der zurückgegebene Wert entspricht exakt dem angefragten String. Vergleiche daher genau oder mitstartsWith(). - Datenschutz: Welche Schlüsselsysteme verfügbar sind, kann zum Fingerprinting genutzt werden. Manche Browser verlangen deshalb eine Nutzerzustimmung oder zeigen einen Hinweis an, wenn DRM aktiviert wird.
- Iframes: In Iframes muss die Permissions Policy
encrypted-mediaerlaubt sein (allow="encrypted-media").