Start · Sprachen · JavaScript · Referenz · MediaTrackSettings.screenPixelRatio

MediaTrackSettings.screenPixelRatio

Eigenschaft

Gibt das Verhältnis zwischen der physischen Pixelgröße der erfassten Anzeigefläche und der logischen Größe eines CSS-Pixels auf dem aufnehmenden Bildschirm an.

seit JavaScript Experimentell: Chromium-basierte Browser (ab ca. C Kategorie: webapi

Signatur

MediaTrackSettings.screenPixelRatio

Beschreibung

Die Eigenschaft screenPixelRatio des Wörterbuchs MediaTrackSettings ist eine Zahl (number). Sie gibt an, wie groß ein physisches Pixel der erfassten Anzeigefläche (bei ihrer physischen Auflösung) im Verhältnis zu einem logischen CSS-Pixel auf dem aufnehmenden Bildschirm ist. Bei einem HiDPI-/Retina-Monitor mit doppelter Pixeldichte liegt der Wert typischerweise bei 2.

Die Eigenschaft gibt es nur bei Videospuren aus der Bildschirmaufnahme, also aus navigator.mediaDevices.getDisplayMedia(). Kamera- und Mikrofonspuren liefern sie nicht. Du liest sie über MediaStreamTrack.getSettings() aus.

Wichtig ist sie vor allem, um zwischen physischer und logischer Auflösung umzurechnen. Teilst du width und height der Einstellungen durch screenPixelRatio, erhältst du die logische Größe der Fläche. Mit dieser Größe kannst du zum Beispiel per applyConstraints() Bandbreite sparen, etwa bei Videokonferenzen, in denen Text-Schärfe weniger wichtig ist als eine flüssige Übertragung. Ein Koordinaten-Abgleich zwischen dem Video und der Oberfläche ist damit ebenfalls möglich.

Der Wert ist eine reine Einstellung und keine Beschränkung (Constraint). Du kannst ihn also nur lesen und nicht über getDisplayMedia() oder applyConstraints() vorgeben.

Rückgabewert

Typ
number | undefined
Beschreibung
Positive Gleitkommazahl mit dem Pixelverhältnis, z. B. 1, 1.25 oder 2. Den Wert undefined bekommst du, wenn die Spur keine Bildschirmaufnahme ist oder der Browser die Eigenschaft nicht unterstützt.

Beispiele

Pixelverhältnis einer Bildschirmaufnahme auslesen

const startCapture = async () => {
  const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
  const [track] = stream.getVideoTracks();
  const { width, height, screenPixelRatio } = track.getSettings();

  console.log(`Physisch: ${width}x${height}`);
  console.log(`screenPixelRatio: ${screenPixelRatio ?? 'nicht unterstützt'}`);
};

document.querySelector('#share').addEventListener('click', startCapture);
Physisch: 3840x2160 screenPixelRatio: 2

Logische Auflösung berechnen und Aufnahme herunterskalieren

const captureAtLogicalSize = async () => {
  const stream = await navigator.mediaDevices.getDisplayMedia({ video: true });
  const [track] = stream.getVideoTracks();
  const { width, height, screenPixelRatio } = track.getSettings();

  if (typeof screenPixelRatio === 'number' && screenPixelRatio > 1) {
    const logicalWidth = Math.round(width / screenPixelRatio);
    const logicalHeight = Math.round(height / screenPixelRatio);
    // Bandbreite sparen: nur in logischer Auflösung übertragen
    await track.applyConstraints({ width: logicalWidth, height: logicalHeight });
    console.log('Neu:', track.getSettings().width, track.getSettings().height);
  }
  return stream;
};

document.querySelector('#share').addEventListener('click', captureAtLogicalSize);
Neu: 1920 1080

Unterstützung per Feature-Erkennung prüfen

const supported = navigator.mediaDevices.getSupportedConstraints();

if ('screenPixelRatio' in supported) {
  console.log('screenPixelRatio wird unterstützt');
} else {
  console.log('Fallback: Pixelverhältnis unbekannt, physische Auflösung verwenden');
}
screenPixelRatio wird unterstützt

// Wichtig · Fallstricke

  • Experimentell: Bisher unterstützen nur Chromium-basierte Browser die Eigenschaft. In Firefox und Safari ist sie undefined. Prüfe sie deshalb immer mit ?? oder typeof und sieh einen Ersatzweg vor.
  • Nur für Bildschirmaufnahmen: Bei Spuren aus getUserMedia() (Kamera, Mikrofon) fehlt die Eigenschaft.
  • Nicht als Constraint setzbar: Wenn du screenPixelRatio an getDisplayMedia() oder applyConstraints() übergibst, hat das keine Wirkung. Der Wert lässt sich nur lesen.
  • Nicht dasselbe wie window.devicePixelRatio: devicePixelRatio bezieht sich auf das aktuelle Dokument. screenPixelRatio dagegen beschreibt die erfasste Fläche, und die kann ein anderer Monitor mit anderer Skalierung sein.
  • Wert kann sich ändern: Wenn Nutzer die Quelle wechseln oder ein Fenster auf einen anderen Monitor ziehen, ändert sich der Wert möglicherweise. Lies ihn bei Bedarf erneut mit getSettings() aus.
  • Nur in sicheren Kontexten (HTTPS) verfügbar. Außerdem muss eine Nutzeraktion die Aufnahme auslösen, zum Beispiel ein Klick.