Signatur
Beschreibung
Die schreibgeschützte Eigenschaft fecPacketsDiscarded eines RTCInboundRtpStreamStats-Objekts (Statistiktyp "inbound-rtp") zählt die RTP-Pakete mit Forward Error Correction (FEC), die zwar empfangen, deren Korrekturdaten aber verworfen wurden. Das passiert typischerweise, wenn alle durch das FEC-Paket geschützten Quellpakete bereits vollständig angekommen oder anderweitig wiederhergestellt waren. Möglich ist auch, dass das FEC-Paket zu spät eintraf, um noch rechtzeitig vor der Wiedergabe genutzt zu werden.
Der Wert ist eine Teilmenge von fecPacketsReceived. Aus dem Verhältnis beider Zähler sieht man, wie viel der FEC-Redundanz tatsächlich gebraucht wird: Ein hoher Anteil verworfener FEC-Pakete heißt, dass die Verbindung kaum Pakete verliert und der Mehraufwand an Bandbreite für FEC wenig bringt. Ein niedriger Anteil heißt dagegen, dass FEC aktiv verlorene Pakete rekonstruiert.
Man verwendet die Eigenschaft vor allem beim Überwachen der Verbindungsqualität, in Diagnose-Dashboards oder bei der Analyse, ob Mechanismen wie ULPFEC/FlexFEC für Video (oder RED für Audio) sinnvoll konfiguriert sind. Die Werte liest man über RTCPeerConnection.getStats() aus.
Rückgabewert
unsigned long long), die seit Beginn des Streams stetig wächst. undefined, wenn der Browser den Wert nicht unterstützt oder für den Stream keine FEC ausgehandelt wurde.Beispiele
FEC-Zähler aller eingehenden Streams auslesen
// pc ist eine verbundene RTCPeerConnection
const logFecStats = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
console.log(
`${stats.kind}: FEC empfangen=${stats.fecPacketsReceived ?? 'n/a'}, ` +
`verworfen=${stats.fecPacketsDiscarded ?? 'n/a'}`
);
}
});
};
await logFecStats(pc);
Nutzungsgrad der FEC im Intervall berechnen
// Misst alle 5 Sekunden, welcher Anteil der FEC-Pakete tatsächlich genutzt wurde
let previous = new Map();
const measureFecEfficiency = async (pc) => {
const report = await pc.getStats();
for (const stats of report.values()) {
if (stats.type !== 'inbound-rtp' || stats.fecPacketsReceived === undefined) continue;
const prev = previous.get(stats.id) ?? { received: 0, discarded: 0 };
const received = stats.fecPacketsReceived - prev.received;
const discarded = stats.fecPacketsDiscarded - prev.discarded;
const used = received - discarded;
if (received > 0) {
const usedPercent = ((used / received) * 100).toFixed(1);
console.log(`[${stats.kind}] ${used}/${received} FEC-Pakete genutzt (${usedPercent} %)`);
}
previous.set(stats.id, {
received: stats.fecPacketsReceived,
discarded: stats.fecPacketsDiscarded,
});
}
};
const timer = setInterval(() => measureFecEfficiency(pc), 5000);
// Später: clearInterval(timer);
Hinweis bei unnötiger FEC-Redundanz ausgeben
const checkFecOverhead = async (receiver) => {
// Statistiken nur für einen bestimmten RTCRtpReceiver
const report = await receiver.getStats();
const inbound = [...report.values()].find((s) => s.type === 'inbound-rtp');
if (!inbound?.fecPacketsReceived) {
return 'Keine FEC-Daten verfügbar';
}
const discardRatio = inbound.fecPacketsDiscarded / inbound.fecPacketsReceived;
return discardRatio > 0.95
? 'FEC wird kaum gebraucht – Verbindung nahezu verlustfrei'
: 'FEC rekonstruiert aktiv verlorene Pakete';
};
const [videoReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'video');
console.log(await checkFecOverhead(videoReceiver));
// Wichtig · Fallstricke
- Browser-Unterstützung: Vor allem Chromium-basierte Browser (Chrome, Edge, Opera) unterstützen die Eigenschaft. Firefox und Safari liefern sie nicht oder nicht zuverlässig. Deshalb vor dem Rechnen immer auf
undefinedprüfen, z. B. mit?? 0oder optionaler Verkettung. - Kumulativer Zähler: Der Wert zählt seit Beginn des Streams immer weiter. Für aktuelle Aussagen muss man die Differenz zwischen zwei Messungen bilden.
- Nur separate FEC-Pakete: Gezählt werden nur eigene FEC-RTP-Pakete (z. B. ULPFEC, FlexFEC). Die in den Opus-Datenstrom eingebettete FEC (In-Band-FEC) erzeugt keine eigenen Pakete und taucht hier nicht auf. Deshalb ist der Wert bei Audio oft
0oder fehlt. - Kein Verlustmaß: Verworfene FEC-Pakete bedeuten nicht, dass Daten verloren gingen. Für echten Paketverlust ist
packetsLostgedacht. - Die Eigenschaft ist schreibgeschützt. Die Statistikobjekte sind Momentaufnahmen und werden nicht automatisch aktualisiert.