Start · Sprachen · JavaScript · Referenz · RTCInboundRtpStreamStats.insertedSamplesForDeceleration

RTCInboundRtpStreamStats.insertedSamplesForDeceleration

Eigenschaft

Zählt fortlaufend, wie viele Audio-Samples der Jitter-Puffer eingefügt hat, um die Wiedergabe zu verlangsamen, zum Beispiel wenn zu wenige Daten vorliegen.

seit JavaScript Chromium-Browser (Chrome/Edge 83+); in Firefox und Kategorie: webapi

Signatur

RTCInboundRtpStreamStats.insertedSamplesForDeceleration

Beschreibung

Die schreibgeschützte Eigenschaft insertedSamplesForDeceleration des Wörterbuchs RTCInboundRtpStreamStats ist ein Zähler, der nur wächst. Jedes Mal, wenn der Jitter-Puffer die Audiowiedergabe verlangsamt, erhöht sich der Wert um die Differenz zwischen den empfangenen und den tatsächlich abgespielten Samples. Verlangsamt der Puffer die Wiedergabe, indem er Samples einfügt (Time-Stretching), entspricht der Wert genau der Anzahl dieser eingefügten Samples.

Der Jitter-Puffer verlangsamt die Wiedergabe, wenn Pakete zu spät oder unregelmäßig ankommen und der Puffer leerzulaufen droht. So lässt sich ein hörbarer Aussetzer vermeiden. Das Gegenstück ist removedSamplesForAcceleration. Dieser Zähler steigt, wenn der Puffer die Wiedergabe beschleunigt, um angestaute Verzögerung abzubauen.

Die Eigenschaft ist nur bei Statistiken mit kind === "audio" vorhanden. Setzen Sie den Wert ins Verhältnis zu totalSamplesReceived, erhalten Sie eine gute Kennzahl für die Qualität einer Verbindung: Ein hoher Anteil eingefügter Samples bedeutet starken Netzwerk-Jitter. Die Sprache klingt dann leicht gedehnt, auch wenn keine echten Aussetzer auftreten. Aussagekräftig sind vor allem die Änderungen zwischen zwei Messungen, nicht der absolute Wert.

Rückgabewert

Typ
number (unsigned long long)
Beschreibung
Gesamtzahl der Samples, die seit Beginn des Empfangs eingefügt wurden, um die Wiedergabe zu verlangsamen. Der Wert fehlt (undefined) bei Video-Streams und in Browsern, die die Eigenschaft nicht unterstützen.

Beispiele

Aktuellen Zählerstand für eingehende Audio-Streams auslesen

// pc ist eine bestehende RTCPeerConnection mit empfangenem Audio
const logDeceleration = async (pc) => {
  const stats = await pc.getStats();
  stats.forEach((report) => {
    if (report.type === 'inbound-rtp' && report.kind === 'audio') {
      console.log(`Eingefügte Samples: ${report.insertedSamplesForDeceleration ?? 'nicht unterstützt'}`);
    }
  });
};

await logDeceleration(pc);
Eingefügte Samples: 4320

Anteil der Verlangsamung pro Messintervall berechnen

let previous = null;

const measure = async (pc) => {
  const stats = await pc.getStats();
  for (const report of stats.values()) {
    if (report.type !== 'inbound-rtp' || report.kind !== 'audio') continue;
    if (previous) {
      const inserted = report.insertedSamplesForDeceleration - previous.insertedSamplesForDeceleration;
      const received = report.totalSamplesReceived - previous.totalSamplesReceived;
      const ratio = received > 0 ? (inserted / received) * 100 : 0;
      console.log(`Verlangsamung im Intervall: ${ratio.toFixed(2)} %`);
    }
    previous = report;
  }
};

// jede Sekunde messen
const timer = setInterval(() => measure(pc), 1000);
Verlangsamung im Intervall: 0.85 % Verlangsamung im Intervall: 3.12 %

Warnung bei starkem Jitter mit Beschleunigung vergleichen

const checkJitterBuffer = async (receiver) => {
  // Statistiken nur für einen einzelnen RTCRtpReceiver abrufen
  const stats = await receiver.getStats();
  for (const r of stats.values()) {
    if (r.type === 'inbound-rtp' && r.kind === 'audio') {
      const { insertedSamplesForDeceleration: ins = 0, removedSamplesForAcceleration: rem = 0, totalSamplesReceived: total = 1 } = r;
      const share = (ins + rem) / total;
      if (share > 0.05) {
        console.warn('Jitter-Puffer arbeitet stark – Netzwerk instabil');
      }
      return { ins, rem, share };
    }
  }
};

const [audioReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'audio');
console.log(await checkJitterBuffer(audioReceiver));
{ ins: 4320, rem: 1980, share: 0.013 }

// Wichtig · Fallstricke

  • Nur Audio: Bei kind === "video" gibt es diese Eigenschaft nicht. Prüfen Sie deshalb immer report.kind.
  • Zähler, der nur wächst: Der absolute Wert sagt wenig über den aktuellen Zustand aus. Vergleichen Sie zwei Messungen miteinander und setzen Sie die Differenz ins Verhältnis zu totalSamplesReceived.
  • Einheit Samples, nicht Sekunden: Um den Wert in Sekunden umzurechnen, teilen Sie ihn durch die Abtastrate des Codecs, zum Beispiel 48000 bei Opus. Beachten Sie auch die Zahl der Kanäle.
  • Browser-Kompatibilität: Die Eigenschaft wird vor allem in Chromium-Browsern unterstützt. In Firefox und Safari kann sie fehlen. Nutzen Sie deshalb Rückfallwerte wie ?? 0.
  • Verlangsamung ist kein Paketverlust. Fehlende Pakete, die verdeckt werden, zählen concealedSamples und concealmentEvents.