Start · Sprachen · JavaScript · Referenz · MediaStreamTrack.applyConstraints()

MediaStreamTrack.applyConstraints()

Methode

Wendet neue Einschränkungen (z. B. Auflösung, Bildrate, Echounterdrückung) auf einen laufenden Medien-Track an, ohne den Stream neu anzufordern.

seit JavaScript Baseline: alle modernen Browser (Chrome 59+, Firef Kategorie: webapi

Signatur

MediaStreamTrack.prototype.applyConstraints(constraints)

Beschreibung

applyConstraints() ändert die Eigenschaften eines bereits laufenden MediaStreamTrack – etwa einer Kamera- oder Mikrofonspur aus getUserMedia(). So lässt sich zum Beispiel die Auflösung einer Videokonferenz bei schlechter Verbindung senken oder die Rauschunterdrückung umschalten, ohne einen neuen Stream anzufordern und den Nutzer erneut um Erlaubnis zu fragen.

Einschränkungen werden als MediaTrackConstraints-Objekt übergeben. Für jede Eigenschaft kannst du einen festen Wert angeben oder ein Objekt mit min, max, ideal und exact. Ein einfacher Wert (z. B. width: 1280) zählt als ideal, der Browser versucht also nur, ihm möglichst nahe zu kommen. min, max und exact sind dagegen Pflichtvorgaben: Kann das Gerät sie nicht erfüllen, wird das Promise abgelehnt. Über das Feld advanced gibst du eine Liste weiterer Einschränkungssätze an, die der Reihe nach versucht werden.

Die Methode gibt ein Promise zurück. Es wird erfüllt, sobald die Einschränkungen angewendet wurden. Welche Werte tatsächlich gelten, liest du danach mit track.getSettings() aus. Welche Eigenschaften und Wertebereiche das Gerät überhaupt kann, zeigen track.getCapabilities() und navigator.mediaDevices.getSupportedConstraints().

Wichtig: Jeder Aufruf ersetzt alle bisher gesetzten Einschränkungen des Tracks. Eigenschaften, die du nicht erneut angibst, fallen auf ihre Standardwerte zurück. Wenn du nur eine Eigenschaft ändern willst, übernimm die übrigen vorher mit track.getConstraints().

Parameter

Name Typ Default Beschreibung
$constraints MediaTrackConstraints {} Objekt mit den gewünschten Einschränkungen, z. B. width, height, frameRate, aspectRatio, facingMode, echoCancellation, noiseSuppression, autoGainControl, sampleRate sowie optional advanced (Array weiterer Einschränkungssätze). Werte sind entweder direkt angegeben oder als { min, max, ideal, exact }. Ohne Argument bzw. mit {} werden alle Einschränkungen entfernt.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Promise, das erfüllt wird, sobald die Einschränkungen angewendet wurden. Es wird mit einem OverconstrainedError abgelehnt, wenn Pflichtvorgaben (min, max, exact) nicht erfüllbar sind. Dessen Eigenschaft constraint nennt die betroffene Einschränkung.

Beispiele

Auflösung einer laufenden Kamera ändern

const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();

// Einfache Werte gelten als „ideal“ – der Browser nähert sich an
await track.applyConstraints({ width: 1280, height: 720, frameRate: 30 });

const { width, height, frameRate } = track.getSettings();
console.log(`Aktiv: ${width}x${height} @ ${frameRate} fps`);
Aktiv: 1280x720 @ 30 fps

Pflichtvorgaben mit Fehlerbehandlung (OverconstrainedError)

const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();

try {
  await track.applyConstraints({
    width: { exact: 3840 },
    height: { exact: 2160 }
  });
  console.log('4K aktiv');
} catch (err) {
  if (err.name === 'OverconstrainedError') {
    console.warn(`Nicht erfüllbar: ${err.constraint}`);
    // Ausweichlösung: Full HD als Idealwert
    await track.applyConstraints({ width: { ideal: 1920 }, height: { ideal: 1080 } });
  } else {
    throw err;
  }
}
Nicht erfüllbar: width

Nur eine Eigenschaft ändern, die übrigen behalten

const stream = await navigator.mediaDevices.getUserMedia({
  audio: { echoCancellation: true, noiseSuppression: true }
});
const [mic] = stream.getAudioTracks();

const toggleNoiseSuppression = async (enabled) => {
  // applyConstraints ersetzt ALLE Einschränkungen – daher bestehende übernehmen
  const current = mic.getConstraints();
  await mic.applyConstraints({ ...current, noiseSuppression: enabled });
  console.log('Rauschunterdrückung:', mic.getSettings().noiseSuppression);
};

await toggleNoiseSuppression(false);
Rauschunterdrückung: false

Bildrate an die Gerätefähigkeiten anpassen (z. B. bei schwacher Verbindung)

const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();

const caps = track.getCapabilities?.() ?? {};
const minFps = caps.frameRate?.min ?? 5;
const target = Math.max(minFps, 15);

await track.applyConstraints({
  ...track.getConstraints(),
  frameRate: { max: target }
});
console.log('Bildrate jetzt:', track.getSettings().frameRate);
Bildrate jetzt: 15

// Wichtig · Fallstricke

  • Einschränkungen werden ersetzt, nicht ergänzt: Jeder Aufruf überschreibt alle bisherigen Einschränkungen. Wenn du nur einen Wert ändern willst, führe ihn mit getConstraints() zusammen.
  • „ideal“ vs. Pflicht: Einfache Werte werden nur angestrebt. Mit exact, min und max kann ein OverconstrainedError ausgelöst werden. Prüfe deshalb nach dem Aufruf immer die tatsächlichen Werte mit getSettings().
  • Unterstützung prüfen: Nicht jeder Browser kennt jede Einschränkung. Unbekannte Eigenschaften werden stillschweigend ignoriert. Frage die unterstützten Eigenschaften mit navigator.mediaDevices.getSupportedConstraints() ab. getCapabilities() fehlt in älteren Firefox-Versionen.
  • Audio-Einschränkungen: Das nachträgliche Ändern von echoCancellation, noiseSuppression oder sampleRate wird je nach Browser (vor allem Safari und ältere Chrome-Versionen) nicht oder nur eingeschränkt unterstützt. Manchmal hilft nur ein neuer getUserMedia()-Aufruf.
  • Beendete Tracks: Bei einem Track mit readyState === 'ended' hat der Aufruf keine Wirkung.
  • Nur in sicheren Kontexten (HTTPS) verfügbar, wie die gesamte Media-Capture-API.
  • Viele gleichzeitige oder schnell aufeinanderfolgende Aufrufe können kurz Bildaussetzer verursachen, weil die Kamera neu konfiguriert wird. Warte deshalb auf das Promise, bevor du den nächsten Aufruf startest.