Signatur
Beschreibung
Die Eigenschaft totalSamplesDuration des Dictionaries RTCInboundRtpStreamStats gibt an, wie lange das Audiomaterial insgesamt dauert, das über einen eingehenden RTP-Stream empfangen wurde. Der Wert wird in Sekunden als Gleitkommazahl angegeben. Er zählt ab dem Zeitpunkt, an dem der Stream angelegt wurde, und steigt danach nur noch an. Anders als in der ursprünglichen MDN-Kurzbeschreibung angegeben, gehört die Eigenschaft zu RTCInboundRtpStreamStats (Statistiktyp "inbound-rtp") und nicht zu RTCRemoteInboundRtpStreamStats.
Allein ist der Wert wenig aussagekräftig. Zusammen mit totalAudioEnergy ergibt er aber den durchschnittlichen Audiopegel über einen Zeitraum: Math.sqrt(totalAudioEnergy / totalSamplesDuration). Wenn Sie die Differenzen zweier Messungen nehmen, die Sie mit getStats() gemacht haben, erhalten Sie den mittleren Pegel für genau dieses Messintervall. Das eignet sich für Sprecheranzeigen, Pegelmesser oder die Erkennung von stummem Audio.
Den Wert lesen Sie über RTCPeerConnection.getStats() oder RTCRtpReceiver.getStats(). Filtern Sie dazu den zurückgegebenen RTCStatsReport nach Einträgen mit type === "inbound-rtp" und kind === "audio". Bei Videostreams fehlt die Eigenschaft.
Rückgabewert
undefined.Beispiele
Empfangene Audiodauer auslesen
// pc ist eine bestehende, verbundene RTCPeerConnection
const logAudioDuration = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp' && stats.kind === 'audio') {
console.log(`Empfangene Audiodauer: ${stats.totalSamplesDuration?.toFixed(2)} s`);
}
});
};
await logAudioDuration(pc);
Mittleren Audiopegel pro Messintervall berechnen
// Ermittelt den durchschnittlichen Pegel (0..1) eines Empfängers zwischen zwei Messungen
const createLevelMeter = (receiver) => {
let last = null;
return async () => {
const report = await receiver.getStats();
const inbound = [...report.values()].find(
(s) => s.type === 'inbound-rtp' && s.kind === 'audio'
);
if (!inbound || inbound.totalSamplesDuration === undefined) return null;
let level = null;
if (last) {
const dEnergy = inbound.totalAudioEnergy - last.totalAudioEnergy;
const dDuration = inbound.totalSamplesDuration - last.totalSamplesDuration;
level = dDuration > 0 ? Math.sqrt(dEnergy / dDuration) : 0;
}
last = inbound;
return level;
};
};
const [audioReceiver] = pc.getReceivers().filter((r) => r.track.kind === 'audio');
const measure = createLevelMeter(audioReceiver);
setInterval(async () => {
const level = await measure();
if (level !== null) console.log(`Mittlerer Pegel: ${level.toFixed(3)}`);
}, 1000);
Stummes oder stockendes Audio erkennen
// Vergleicht den Zuwachs der Audiodauer mit der tatsächlich vergangenen Zeit
let prev = null;
const checkAudioFlow = async (pc) => {
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type !== 'inbound-rtp' || s.kind !== 'audio') continue;
if (prev) {
const wallSeconds = (s.timestamp - prev.timestamp) / 1000;
const audioSeconds = s.totalSamplesDuration - prev.totalSamplesDuration;
const ratio = audioSeconds / wallSeconds;
if (ratio < 0.5) console.warn('Kaum Audio empfangen – Verbindung prüfen!');
}
prev = s;
}
};
setInterval(() => checkAudioFlow(pc), 2000);
// Wichtig · Fallstricke
- Nur bei Audio: Bei Einträgen mit
kind === "video"ist die Eigenschaft nicht vorhanden. Prüfen Sie deshalb immer aufundefined. - Kumulativer Wert: Der Wert wird seit dem Anlegen des Streams aufsummiert. Für aktuelle Pegel oder Raten brauchen Sie die Differenz zweier Messungen. Ein einzelner Messwert liefert nur einen Durchschnitt über die gesamte Laufzeit.
- Einheit: Sekunden als Gleitkommazahl, nicht Millisekunden. Das Feld
timestampdes Statistik-Objekts wird dagegen in Millisekunden angegeben. - Ausgefüllte Lücken: Je nach Implementierung können auch Samples mitgezählt werden, die künstlich erzeugt wurden, um verlorene Pakete zu überbrücken (Concealment). Für eine genauere Analyse eignen sich
concealedSamplesundtotalSamplesReceived. - Kompatibilität: Chromium-Browser unterstützen die Eigenschaft seit Langem. In Firefox und Safari kam sie erst in neueren Versionen hinzu. Die WebRTC-Statistik-Spezifikation ändert sich noch. Programmieren Sie daher defensiv und schauen Sie in aktuelle Kompatibilitätstabellen.