Start · Sprachen · JavaScript · Referenz · WorkerNavigator.mediaCapabilities

WorkerNavigator.mediaCapabilities

Eigenschaft

Schreibgeschützte Eigenschaft, die im Worker-Kontext ein <code>MediaCapabilities</code>-Objekt liefert, um Decodierungs- und Codierungsfähigkeiten für Medienformate abzufragen.

seit JavaScript Baseline: moderne Browser (Chrome/Edge 66+, Firefo Kategorie: webapi

Signatur

WorkerNavigator.mediaCapabilities

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

Typ
MediaCapabilities
Beschreibung
Ein 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}`);
unterstützt: true, flüssig: true, effizient: true

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 }
// ]);
Gewählt: 1080p H.264

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());
VP8-Aufnahme möglich: true

// Wichtig · Fallstricke

  • Nur im Worker-Kontext: WorkerNavigator existiert nur in Workern (self.navigator). Im Hauptthread verwendest du window.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, fehlendes video- und audio-Objekt oder ein falsch formatierter MIME-Typ) lassen das Promise mit einem TypeError scheitern, statt supported: false zu liefern. Nutze try/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 als decodingInfo(), und der Typ webrtc wird nicht überall unterstützt.
  • Datenschutz: Die Ergebnisse können zum Fingerprinting beitragen. Deshalb können Browser die Antworten verallgemeinern, sodass smooth und powerEfficient nur Näherungswerte sind.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird stillschweigend ignoriert, im Strict Mode wirft sie einen TypeError.