Start · Sprachen · JavaScript · Referenz · RTCRtpSender.setParameters()

RTCRtpSender.setParameters()

Methode

Ändert die Kodierungsparameter eines <code>RTCRtpSender</code> (z. B. Bitrate, Bildrate, Skalierung, Aktivierung einzelner Simulcast-Ebenen), ohne dass eine SDP-Neuverhandlung nötig ist.

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

Signatur

RTCRtpSender.prototype.setParameters(parameters, setParameterOptions)

Beschreibung

Mit setParameters() änderst du, wie ein RTCRtpSender seinen Medien-Track kodiert und überträgt. Typische Anwendungen sind eine Obergrenze für die Bitrate (maxBitrate), eine niedrigere Bildrate (maxFramerate), eine herunterskalierte Auflösung (scaleResolutionDownBy) oder das Ein- und Ausschalten einzelner Simulcast-Ebenen über active.

Die Änderungen greifen ohne neues Offer/Answer. Damit eignet sich die Methode gut für adaptive Qualitätsregelung zur Laufzeit, etwa wenn die Bandbreite schwankt, beim Bildschirmteilen oder wenn in einer Videokonferenz ein Teilnehmer nur noch als Miniaturbild angezeigt wird.

Wichtig ist der Ablauf lesen, ändern, schreiben: Zuerst holst du mit getParameters() das aktuelle Parameterobjekt, dann änderst du es und übergibst es direkt an setParameters(). Das Objekt enthält eine transactionId. Stimmt sie nicht mit der zuletzt von getParameters() gelieferten überein, oder liegt zwischendurch ein Ereignisschleifen-Durchlauf, wird der Aufruf abgelehnt. Nur ein Teil der Felder darf verändert werden, zum Beispiel encodings[i].active, maxBitrate, maxFramerate, scaleResolutionDownBy, priority, networkPriority und degradationPreference. Die Anzahl der Encodings und ihre rid-Werte bleiben unveränderlich.

Parameter

Name Typ Default Beschreibung
$parameters Pflicht RTCRtpSendParameters Parameterobjekt, das zuvor mit getParameters() geholt und dann verändert wurde. Wichtige Felder: transactionId (nicht verändern), encodings (Array mit active, maxBitrate, maxFramerate, scaleResolutionDownBy, priority, networkPriority, scalabilityMode), degradationPreference. Nur lesbar sind codecs, headerExtensions und rtcp.
$setParameterOptions object {} Optionales Objekt mit weiteren Optionen, z. B. encodingOptions (Array mit keyFrame: boolean, um ein Keyframe anzufordern). Bisher nur in wenigen Browsern unterstützt.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das erfüllt wird, sobald die neuen Parameter übernommen wurden. Abgelehnt wird es u. a. mit InvalidStateError (Sender gestoppt oder veraltete bzw. fehlende transactionId), InvalidModificationError (unveränderliche Felder oder Anzahl der Encodings geändert), RangeError (z. B. scaleResolutionDownBy < 1) oder OperationError.

Beispiele

Maximale Video-Bitrate begrenzen

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();
const sender = pc.addTrack(track, stream);

const setMaxBitrate = async (sender, bitsPerSecond) => {
  const params = sender.getParameters();
  // Manche Browser liefern vor der Verhandlung ein leeres encodings-Array
  if (!params.encodings || params.encodings.length === 0) {
    params.encodings = [{}];
  }
  params.encodings[0].maxBitrate = bitsPerSecond;
  await sender.setParameters(params);
  console.log('Neue Bitrate:', sender.getParameters().encodings[0].maxBitrate);
};

await setMaxBitrate(sender, 500_000); // 500 kbit/s
Neue Bitrate: 500000

Simulcast-Ebene abschalten, wenn nur ein Miniaturbild angezeigt wird

const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const { sender } = pc.addTransceiver(stream.getVideoTracks()[0], {
  direction: 'sendonly',
  sendEncodings: [
    { rid: 'q', scaleResolutionDownBy: 4 },
    { rid: 'h', scaleResolutionDownBy: 2 },
    { rid: 'f' }
  ]
});

const setHighQuality = async (enabled) => {
  const params = sender.getParameters();
  for (const enc of params.encodings) {
    if (enc.rid === 'f') enc.active = enabled;
  }
  await sender.setParameters(params);
};

await setHighQuality(false); // volle Auflösung pausieren
console.log(sender.getParameters().encodings.map(e => `${e.rid}:${e.active}`));
["q:true", "h:true", "f:false"]

Bildschirmfreigabe: Schärfe vor Flüssigkeit, mit Fehlerbehandlung

const tuneForScreenShare = async (sender) => {
  const params = sender.getParameters();
  params.degradationPreference = 'maintain-resolution';
  if (params.encodings.length === 0) params.encodings = [{}];
  params.encodings[0].maxFramerate = 5;
  try {
    await sender.setParameters(params);
    console.log('Parameter übernommen');
  } catch (err) {
    console.error(`${err.name}: ${err.message}`);
  }
};

const pc = new RTCPeerConnection();
const screen = await navigator.mediaDevices.getDisplayMedia({ video: true });
const sender = pc.addTrack(screen.getVideoTracks()[0], screen);
await tuneForScreenShare(sender);
Parameter übernommen

// Wichtig · Fallstricke

  • Immer getParameters() direkt vorher aufrufen. Selbst gebaute Objekte oder zwischengespeicherte ältere Parameter scheitern an der transactionId und führen zu einem InvalidStateError. Zwischen den beiden Aufrufen darf kein await stehen.
  • Vor Abschluss der SDP-Verhandlung kann encodings in manchen Browsern leer sein, vor allem in älteren Chrome- und Firefox-Versionen. In diesem Fall ein Encoding-Objekt ergänzen oder die Einstellungen besser gleich per sendEncodings bei addTransceiver() setzen.
  • Die Anzahl der Encodings und die rid-Werte lassen sich nachträglich nicht ändern. Simulcast muss also schon beim Anlegen des Transceivers festgelegt werden.
  • maxBitrate ist eine Obergrenze, keine feste Zielrate. Die Staukontrolle kann die tatsächliche Rate weiter senken.
  • Browserunterschiede: Safari hat scaleResolutionDownBy und maxFramerate erst spät vollständig unterstützt. degradationPreference, scalabilityMode (SVC) und setParameterOptions werden nicht überall unterstützt. Vor dem Einsatz prüfen, zum Beispiel indem du nach dem Aufruf getParameters() ausliest.
  • Den Codec wechselst du nicht über diese Methode (codecs ist nur lesbar), sondern mit RTCRtpTransceiver.setCodecPreferences() und einer anschließenden Neuverhandlung.