Signatur
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
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);
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);
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));
// Wichtig · Fallstricke
- Nur bei Audio: Bei
inbound-rtp-Einträgen mitkind === "video"gibt es die Eigenschaft nicht. Deshalb immerkindprüfen und?? 0bzw. eineundefined-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 bei0beginnen, 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).