Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.playoutId

RTCInboundRtpStreamStats.playoutId

Eigenschaft

Enthält die <code>id</code> des <code>RTCAudioPlayoutStats</code>-Objekts, das die Wiedergabe dieses eingehenden Audio-RTP-Streams beschreibt.

seit JavaScript Chrome/Edge 111+, Safari 17+; Firefox: nicht unter Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.playoutId

Beschreibung

Die Eigenschaft playoutId eines RTCInboundRtpStreamStats-Objekts ist ein String. Er verweist auf einen anderen Eintrag im selben RTCStatsReport, nämlich auf ein Statistikobjekt vom Typ "media-playout" (RTCAudioPlayoutStats). Dieses Objekt beschreibt, wie das empfangene Audio auf dem Ausgabegerät abgespielt wird, etwa mit synthetisierten Samples (Verdeckung von Aussetzern), Wiedergabeverzögerung und Gesamtzahl der abgespielten Samples.

Du brauchst die Eigenschaft, wenn du Probleme mit der Audioqualität auf Empfängerseite untersuchst. Die Werte in inbound-rtp beschreiben den Netzwerk- und Decoder-Teil (Paketverlust, Jitter). Die zugehörigen media-playout-Werte zeigen dagegen, was am Lautsprecher tatsächlich ankommt. Mit playoutId kannst du beide Sichten einander zuordnen.

Die Eigenschaft gibt es nur bei Streams mit kind === "audio". Bei Video-Streams fehlt sie, und auch bei Audio kann sie fehlen, solange noch keine Wiedergabe begonnen hat. Das referenzierte Objekt holst du dir mit report.get(stats.playoutId) aus demselben Bericht.

Rückgabewert

Typ
string | undefined
Beschreibung
Die id des zugehörigen RTCAudioPlayoutStats-Objekts (type: "media-playout") im selben RTCStatsReport. Der Wert ist undefined bei Video-Streams oder wenn der Browser die Eigenschaft nicht unterstützt.

Beispiele

playoutId eingehender Audio-Streams auslesen

// pc ist eine bestehende, verbundene RTCPeerConnection
const report = await pc.getStats();

report.forEach((stats) => {
  if (stats.type === "inbound-rtp" && stats.kind === "audio") {
    console.log(`Stream ${stats.ssrc}: playoutId = ${stats.playoutId ?? "(nicht verfügbar)"}`);
  }
});
Stream 123456789: playoutId = AP

Wiedergabe-Statistiken über playoutId auflösen

const logPlayout = async (pc) => {
  const report = await pc.getStats();

  for (const stats of report.values()) {
    if (stats.type !== "inbound-rtp" || stats.kind !== "audio") continue;
    if (!stats.playoutId) continue;

    const playout = report.get(stats.playoutId);
    if (!playout) continue;

    // Anteil synthetisierter Audiodauer (Verdeckung von Aussetzern)
    const ratio = playout.totalSamplesDuration > 0
      ? playout.synthesizedSamplesDuration / playout.totalSamplesDuration
      : 0;

    console.log(`Synthetisiert: ${(ratio * 100).toFixed(2)} %`);
    console.log(`Ø Wiedergabeverzögerung: ${(playout.totalPlayoutDelay / playout.totalSamplesCount * 1000).toFixed(1)} ms`);
  }
};

setInterval(() => logPlayout(pc), 5000);
Synthetisiert: 0.42 % Ø Wiedergabeverzögerung: 38.7 ms

Unterstützung prüfen

const supportsPlayoutStats = async (pc) => {
  const report = await pc.getStats();
  return [...report.values()].some(
    (s) => s.type === "inbound-rtp" && s.kind === "audio" && "playoutId" in s
  );
};

console.log(await supportsPlayoutStats(pc));
true

// Wichtig · Fallstricke

  • Nur Audio: Bei kind === "video" ist playoutId nie gesetzt. Frage deshalb immer vorher kind ab.
  • Kann fehlen: Bevor die Audiowiedergabe startet, zum Beispiel ohne verbundenes Ausgabegerät oder direkt nach dem Verbindungsaufbau, fehlt die Eigenschaft unter Umständen. Mit optionaler Verkettung (?.) bzw. ?? fängst du das ab.
  • Browser-Kompatibilität: Chromium-Browser unterstützen die Eigenschaft ab Version 111, Safari ab 17. Firefox liefert weder playoutId noch media-playout-Statistiken. Deshalb erst prüfen, ob die Eigenschaft vorhanden ist.
  • Gleicher Bericht: Die ID gilt nur innerhalb desselben RTCStatsReport. Löse sie immer im Bericht auf, aus dem sie stammt.
  • Die Werte in RTCAudioPlayoutStats sind kumulativ. Für Raten brauchst du die Differenz zwischen zwei Messungen.