Signatur
Beschreibung
Die Eigenschaft trackIdentifier des Wörterbuchs RTCInboundRtpStreamStats enthält einen String. Er entspricht dem Wert von MediaStreamTrack.id des Tracks, über den die eingehenden Medien eines RTP-Streams ausgegeben werden. Über diesen Wert ordnest du eine Statistik vom Typ "inbound-rtp" eindeutig einem konkreten Empfangs-Track zu, zum Beispiel dem Track aus RTCRtpReceiver.track oder aus dem track-Ereignis.
Das ist vor allem bei Verbindungen mit mehreren Audio- und Videospuren nützlich, etwa bei Videokonferenzen mit mehreren Teilnehmern. Mit trackIdentifier zeigst du Werte wie packetsLost, jitter oder framesPerSecond beim richtigen Video-Element an.
Die Eigenschaft hat die frühere Verknüpfung über trackId und die inzwischen entfernten Statistiken vom Typ "track" abgelöst. Die ID stammt vom lokal erzeugten Empfangs-Track. Sie muss nicht mit der Track-ID auf der Senderseite übereinstimmen.
Beispiele
Track-IDs aller eingehenden Streams ausgeben
// pc ist eine bestehende RTCPeerConnection
const listInboundTracks = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'inbound-rtp') {
console.log(`${stats.kind}: ${stats.trackIdentifier}`);
}
});
};
await listInboundTracks(pc);
Statistik einem empfangenen Track zuordnen
pc.addEventListener('track', async ({ track }) => {
// Kurz warten, bis erste Pakete eingegangen sind
await new Promise((r) => setTimeout(r, 2000));
const report = await pc.getStats();
const inbound = [...report.values()].find(
(s) => s.type === 'inbound-rtp' && s.trackIdentifier === track.id
);
if (inbound) {
console.log(`Track ${track.kind}: ${inbound.packetsReceived} Pakete, ${inbound.packetsLost} verloren`);
}
});
Periodisches Monitoring pro Video-Element
// Zuordnung Track-ID → Video-Element
const videoByTrackId = new Map();
pc.addEventListener('track', ({ track, streams }) => {
if (track.kind !== 'video') return;
const video = document.createElement('video');
video.autoplay = true;
video.srcObject = streams[0] ?? new MediaStream([track]);
document.body.append(video);
videoByTrackId.set(track.id, video);
});
setInterval(async () => {
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type !== 'inbound-rtp' || s.kind !== 'video') continue;
const video = videoByTrackId.get(s.trackIdentifier);
if (video) video.title = `${s.framesPerSecond ?? 0} fps, Jitter ${s.jitter?.toFixed(3)} s`;
}
}, 1000);
// Wichtig · Fallstricke
- Der Wert ist die lokale ID des empfangenden Tracks. Er stimmt in der Regel nicht mit der Track-ID des Senders oder der
msidim SDP überein. Verwende ihn deshalb nicht, um Tracks über beide Seiten hinweg abzugleichen. - Ein
"inbound-rtp"-Eintrag erscheint häufig erst, wenn tatsächlich RTP-Pakete empfangen wurden. Direkt nach demtrack-Ereignis kann er noch fehlen. - Ältere Browser liefern statt
trackIdentifierdas veraltetetrackId, das auf eine"track"-Statistik verweist. Prüfe in diesem Fall beide Varianten, z. B. mits.trackIdentifier ?? s.trackId. - Bei Simulcast oder wenn ein Receiver per
replaceTrackbzw. neuer Aushandlung wiederverwendet wird, kann derselbe Track über die Zeit zu verschiedenen RTP-Streams (SSRC) gehören. Werte die Statistik bei Bedarf zusätzlich nachssrcaus. - Der Aufruf von
getStats()ist vergleichsweise teuer. Frage die Statistik nicht öfter als etwa einmal pro Sekunde ab.