Signatur
Beschreibung
Die schreibgeschützte Eigenschaft rid eines RTCOutboundRtpStreamStats-Objekts enthält die RTP Stream ID (RID) des ausgehenden RTP-Streams. Die RID wird über die RTP-Header-Erweiterung urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id übertragen. Festgelegt wird sie beim Senden, meist über sendEncodings in RTCPeerConnection.addTransceiver().
Wirklich gebraucht wird die Eigenschaft vor allem bei Simulcast. Dabei schickt ein einzelner RTCRtpSender mehrere Kodierungen desselben Videos mit unterschiedlicher Auflösung oder Bitrate, zum Beispiel "q", "h" und "f". Jede Kodierung erscheint im Statistikbericht als eigener outbound-rtp-Eintrag. Mit rid ordnest du diese Einträge der jeweiligen Kodierung aus RTCRtpSender.getParameters().encodings zu.
Die Eigenschaft ist nur vorhanden, wenn für die Kodierung eine RID gesetzt wurde. Ohne Simulcast fehlt sie normalerweise ganz, der Wert ist dann undefined.
Rückgabewert
"h". undefined, wenn keine RID festgelegt ist.Beispiele
Simulcast einrichten und RIDs in den Statistiken auslesen
const pc = new RTCPeerConnection();
const stream = await navigator.mediaDevices.getUserMedia({ video: true });
const [track] = stream.getVideoTracks();
const transceiver = pc.addTransceiver(track, {
direction: 'sendonly',
sendEncodings: [
{ rid: 'q', scaleResolutionDownBy: 4 },
{ rid: 'h', scaleResolutionDownBy: 2 },
{ rid: 'f' }
]
});
// ... Signalisierung (Offer/Answer) mit der Gegenstelle ...
const report = await transceiver.sender.getStats();
report.forEach((stats) => {
if (stats.type === 'outbound-rtp') {
console.log(`RID ${stats.rid}: ${stats.frameWidth}x${stats.frameHeight}`);
}
});
Bitrate pro Simulcast-Layer überwachen
const previous = new Map();
const logBitrates = async (sender) => {
const report = await sender.getStats();
for (const stats of report.values()) {
if (stats.type !== 'outbound-rtp' || stats.kind !== 'video') continue;
const key = stats.rid ?? 'default';
const prev = previous.get(key);
if (prev) {
const bits = (stats.bytesSent - prev.bytesSent) * 8;
const seconds = (stats.timestamp - prev.timestamp) / 1000;
console.log(`${key}: ${Math.round(bits / seconds / 1000)} kbit/s`);
}
previous.set(key, stats);
}
};
// const sender = pc.getSenders().find((s) => s.track?.kind === 'video');
// setInterval(() => logBitrates(sender), 1000);
Statistik-Eintrag der passenden Kodierung zuordnen
const findStatsForEncoding = async (sender, rid) => {
const report = await sender.getStats();
return [...report.values()].find(
(s) => s.type === 'outbound-rtp' && s.rid === rid
);
};
// const { encodings } = sender.getParameters();
// for (const enc of encodings) {
// const stats = await findStatsForEncoding(sender, enc.rid);
// console.log(enc.rid, enc.active, stats?.framesPerSecond);
// }
// Wichtig · Fallstricke
- Ohne Simulcast fehlt
ridmeistens. Frag deshalb mitstats.rid ?? 'default'oder Optional Chaining ab und verlass dich nicht darauf, dass ein String kommt. - Nach RFC 8851 darf eine RID nur alphanumerische Zeichen enthalten und höchstens 255 Zeichen lang sein. Ungültige Werte in
sendEncodingsführen zu einemTypeError. - Die RID gilt nur innerhalb eines Transceivers. Mehrere Sender können dieselbe RID verwenden. Für eine eindeutige Zuordnung nimmst du deshalb zusätzlich
id,ssrcodermiddes Statistik-Eintrags. - Bei inaktiven Layern (
active: false) oder bevor die Verbindung ausgehandelt ist, können Einträge fehlen oder veraltete Zähler haben. - Unterstützung: Chrome/Edge, Firefox und Safari (ab 14.1) liefern die Eigenschaft. In älteren Browsern fehlt sie teilweise, auch wenn Simulcast aktiv ist.