Signatur
Beschreibung
Die Eigenschaft mediaCapabilities des WorkerNavigator-Interfaces gibt ein MediaCapabilities-Objekt zurück. Es ist dasselbe API wie navigator.mediaCapabilities im Hauptthread, steht aber innerhalb von Web Workern über self.navigator zur Verfügung.
Mit den Methoden decodingInfo() und encodingInfo() findest du heraus, ob eine bestimmte Kombination aus Container, Codec, Auflösung, Bitrate und Bildrate unterstützt wird, ob die Wiedergabe flüssig (smooth) läuft und ob sie energieeffizient (powerEfficient, meist durch Hardware-Beschleunigung) ist. Beide Methoden geben ein Promise zurück.
Im Worker lohnt sich das zum Beispiel, wenn dort Medien-Pipelines laufen (etwa mit WebCodecs oder MSE in Workern) oder wenn du die Auswahl der Streaming-Qualität (Adaptive Bitrate) aus dem Hauptthread auslagern willst, damit die Oberfläche nicht blockiert.
Rückgabewert
MediaCapabilities-Objekt mit den Methoden decodingInfo(configuration) und encodingInfo(configuration), die jeweils Promise<MediaCapabilitiesInfo> mit den Feldern supported, smooth und powerEfficient zurückgeben.Beispiele
Decodierungsfähigkeit im Worker prüfen
// worker.js
const config = {
type: 'file',
video: {
contentType: 'video/webm; codecs="vp09.00.10.08"',
width: 1920,
height: 1080,
bitrate: 4_000_000,
framerate: 30
}
};
const info = await self.navigator.mediaCapabilities.decodingInfo(config);
console.log(`unterstützt: ${info.supported}, flüssig: ${info.smooth}, effizient: ${info.powerEfficient}`);
Beste Streaming-Qualität im Worker auswählen
// worker.js – Hauptthread schickt Kandidaten, Worker wählt aus
const pruefen = async (variante) => {
const info = await navigator.mediaCapabilities.decodingInfo({
type: 'media-source',
video: {
contentType: variante.contentType,
width: variante.width,
height: variante.height,
bitrate: variante.bitrate,
framerate: 30
}
});
return { ...variante, ...info };
};
self.addEventListener('message', async ({ data: varianten }) => {
const ergebnisse = await Promise.all(varianten.map(pruefen));
// höchste Auflösung, die flüssig und energieeffizient läuft
const beste = ergebnisse
.filter((v) => v.supported && v.smooth && v.powerEfficient)
.sort((a, b) => b.height - a.height)[0] ?? ergebnisse.find((v) => v.supported);
self.postMessage(beste?.label ?? 'keine');
});
// main.js
// const worker = new Worker('worker.js', { type: 'module' });
// worker.onmessage = (e) => console.log('Gewählt:', e.data);
// worker.postMessage([
// { label: '4K AV1', contentType: 'video/mp4; codecs="av01.0.12M.08"', width: 3840, height: 2160, bitrate: 16_000_000 },
// { label: '1080p H.264', contentType: 'video/mp4; codecs="avc1.640028"', width: 1920, height: 1080, bitrate: 5_000_000 }
// ]);
Codierungsfähigkeit mit Feature-Erkennung prüfen
// worker.js
const kannCodieren = async () => {
if (!('mediaCapabilities' in self.navigator) ||
typeof navigator.mediaCapabilities.encodingInfo !== 'function') {
return false;
}
try {
const info = await navigator.mediaCapabilities.encodingInfo({
type: 'record',
video: {
contentType: 'video/webm; codecs="vp8"',
width: 1280,
height: 720,
bitrate: 2_500_000,
framerate: 30
}
});
return info.supported;
} catch (err) {
// TypeError bei ungültiger Konfiguration oder nicht unterstütztem type
console.warn('Prüfung fehlgeschlagen:', err.message);
return false;
}
};
console.log('VP8-Aufnahme möglich:', await kannCodieren());
// Wichtig · Fallstricke
- Nur im Worker-Kontext:
WorkerNavigatorexistiert nur in Workern (self.navigator). Im Hauptthread verwendest duwindow.navigator.mediaCapabilities. - Feature-Erkennung: Die Unterstützung im Worker kam in manchen Browsern später als im Hauptthread. Prüfe immer mit
'mediaCapabilities' in navigator, bevor du die Methoden aufrufst. - Ungültige Konfigurationen (z. B. fehlendes
contentType, fehlendesvideo- undaudio-Objekt oder ein falsch formatierter MIME-Typ) lassen das Promise mit einemTypeErrorscheitern, stattsupported: falsezu liefern. Nutzetry/catch. - Codec-Strings genau angeben: Ohne vollständigen
codecs-Parameter (z. B.avc1.640028) sind die Ergebnisse unzuverlässig oder das Promise wird abgelehnt. encodingInfo()ist weniger verbreitet alsdecodingInfo(), und der Typwebrtcwird nicht überall unterstützt.- Datenschutz: Die Ergebnisse können zum Fingerprinting beitragen. Deshalb können Browser die Antworten verallgemeinern, sodass
smoothundpowerEfficientnur Näherungswerte sind. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird stillschweigend ignoriert, im Strict Mode wirft sie einen
TypeError.