Signatur
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
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)"}`);
}
});
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);
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));
// Wichtig · Fallstricke
- Nur Audio: Bei
kind === "video"istplayoutIdnie gesetzt. Frage deshalb immer vorherkindab. - 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
playoutIdnochmedia-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
RTCAudioPlayoutStatssind kumulativ. Für Raten brauchst du die Differenz zwischen zwei Messungen.