Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.removedSamplesForAcceleration

RTCInboundRtpStreamStats.removedSamplesForAcceleration

Eigenschaft

Zählt kumulativ die Audio-Samples, die der Empfänger durch beschleunigte Wiedergabe (Time-Stretching) verworfen hat, um die Latenz im Jitter-Puffer abzubauen.

seit JavaScript Chrome 83+, Edge 83+, Opera; nicht in Firefox und Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.removedSamplesForAcceleration

Beschreibung

Die Eigenschaft removedSamplesForAcceleration gehört zum Dictionary RTCInboundRtpStreamStats und ist nur bei Audio-Streams vorhanden (kind === "audio"). Füllt sich der Jitter-Puffer zu stark, weil z. B. Pakete nach einem Netzwerk-Stau gebündelt ankommen, spielt der Empfänger das Audio kurz etwas schneller ab. Dabei werden Samples entfernt. Die Eigenschaft summiert bei jedem solchen Vorgang die Differenz aus den Samples, die aus dem Jitter-Puffer genommen wurden, und den Samples, die tatsächlich ausgegeben wurden.

Der Wert ist ein kumulativer Zähler. Er beginnt bei 0, sobald der Stream startet, und steigt nur an. Aussagekräftig ist daher vor allem die Änderung zwischen zwei Messungen. Setzt man diese ins Verhältnis zu totalSamplesReceived, erhält man den Anteil der beschleunigten Samples. Ein hoher Anteil deutet auf starken Jitter oder eine zu groß gewählte Pufferverzögerung hin.

Das Gegenstück ist insertedSamplesForDeceleration. Es zählt die Samples, die bei verlangsamter Wiedergabe eingefügt werden, wenn der Puffer leerzulaufen droht. Beide Werte zusammen mit jitterBufferDelay und concealedSamples zeigen, wie gut NetEQ bzw. der Jitter-Puffer mit der Netzwerkqualität zurechtkommt.

Rückgabewert

Typ
number | undefined
Beschreibung
Ganzzahliger, monoton steigender Zähler (unsigned long long) der Samples, die für die Beschleunigung entfernt wurden. Bei Video-Streams und in Browsern ohne Unterstützung ist der Wert undefined.

Beispiele

Wert aus den Statistiken einer Verbindung auslesen

// pc ist eine bestehende RTCPeerConnection mit eingehendem Audio
const logAcceleration = async (pc) => {
  const report = await pc.getStats();
  report.forEach((stats) => {
    if (stats.type === 'inbound-rtp' && stats.kind === 'audio') {
      console.log('Entfernte Samples (Beschleunigung):',
        stats.removedSamplesForAcceleration ?? 'nicht unterstützt');
    }
  });
};

await logAcceleration(pc);
Entfernte Samples (Beschleunigung): 4320

Beschleunigungsrate pro Intervall überwachen

// Anteil der beschleunigten Samples alle 5 Sekunden berechnen
let previous = null;

const monitor = async (pc) => {
  const report = await pc.getStats();
  for (const stats of report.values()) {
    if (stats.type !== 'inbound-rtp' || stats.kind !== 'audio') continue;
    if (stats.removedSamplesForAcceleration === undefined) return;

    if (previous) {
      const removed = stats.removedSamplesForAcceleration - previous.removed;
      const received = stats.totalSamplesReceived - previous.received;
      const rate = received > 0 ? (removed / received) * 100 : 0;
      console.log(`Beschleunigt: ${rate.toFixed(2)} % der Samples`);
      if (rate > 5) console.warn('Hoher Jitter – Netzwerk prüfen');
    }
    previous = {
      removed: stats.removedSamplesForAcceleration,
      received: stats.totalSamplesReceived
    };
  }
};

const timer = setInterval(() => monitor(pc), 5000);
// später: clearInterval(timer);
Beschleunigt: 1.37 % der Samples

Beschleunigung und Verlangsamung vergleichen

// Hinweise auf die Arbeit des Jitter-Puffers sammeln
const jitterBufferSummary = async (receiver) => {
  const report = await receiver.getStats(); // RTCRtpReceiver
  const inbound = [...report.values()].find((s) => s.type === 'inbound-rtp');
  if (!inbound) return null;
  return {
    beschleunigt: inbound.removedSamplesForAcceleration ?? 0,
    verlangsamt: inbound.insertedSamplesForDeceleration ?? 0,
    verdeckt: inbound.concealedSamples ?? 0,
    empfangen: inbound.totalSamplesReceived ?? 0
  };
};

const [audioReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'audio');
console.table(await jitterBufferSummary(audioReceiver));
┌──────────────┬─────────┐ │ beschleunigt │ 4320 │ │ verlangsamt │ 2880 │ │ verdeckt │ 960 │ │ empfangen │ 1440000 │ └──────────────┴─────────┘

// Wichtig · Fallstricke

  • Nur bei Audio: Bei inbound-rtp-Einträgen mit kind === "video" gibt es die Eigenschaft nicht. Deshalb immer kind prüfen und ?? 0 bzw. eine undefined-Prüfung einbauen.
  • Kumulativer Zähler: Der Absolutwert sagt wenig aus. Werte immer als Differenz zwischen zwei getStats()-Aufrufen auswerten. Wird ein Transceiver neu verhandelt oder ein neuer Stream gestartet, kann der Zähler wieder bei 0 beginnen, weil die Statistik-ID wechselt.
  • Einheit Samples, nicht Millisekunden: Um die Zeit zu erhalten, durch die Abtastrate teilen (z. B. 48000 bei Opus). Bei Stereo werden die Samples pro Kanal gezählt, nicht einzeln je Kanal.
  • Browser-Unterstützung: Nur in Chromium-basierten Browsern verfügbar (Chrome, Edge, Opera). Firefox und Safari liefern den Wert derzeit nicht. Die Eigenschaft ist daher nur für Diagnose und Monitoring geeignet, nicht für kritische Programmlogik.
  • Etwas Beschleunigung ist normal. Nur dauerhaft hohe Raten weisen auf Netzprobleme hin, die man auch hören kann (leicht „gehetzt“ klingendes Audio).