Signatur
Beschreibung
Die schreibgeschützte Eigenschaft mid eines RTCOutboundRtpStreamStats-Objekts (Statistik-Typ "outbound-rtp") enthält die Media-Stream-Identification: den Wert des SDP-Attributs a=mid: der Medienbeschreibung (m=-Zeile), zu der der ausgehende Stream gehört. Es ist derselbe Wert, den auch RTCRtpTransceiver.mid liefert.
Nützlich ist mid vor allem, wenn du Statistikeinträge einem bestimmten Transceiver zuordnen willst. Das gilt besonders dann, wenn über eine RTCPeerConnection mehrere Audio- und Video-Spuren laufen oder Simulcast aktiv ist. Bei Simulcast gibt es pro Layer (rid) einen eigenen outbound-rtp-Eintrag, und alle haben dieselbe mid.
Die MID steht erst nach abgeschlossener Aushandlung fest, also sobald setLocalDescription() bzw. setRemoteDescription() gelaufen ist. Wurde der Transceiver noch nicht ausgehandelt oder ist er gestoppt, fehlt die Eigenschaft im Statistikobjekt.
Rückgabewert
"0" oder "video". Ist noch nichts ausgehandelt, fehlt die Eigenschaft (undefined).Beispiele
MID aller ausgehenden Streams auflisten
const logOutboundMids = async (pc) => {
const report = await pc.getStats();
report.forEach((stats) => {
if (stats.type === 'outbound-rtp') {
console.log(`${stats.kind}: mid=${stats.mid}, ssrc=${stats.ssrc}`);
}
});
};
// Nach erfolgreicher Aushandlung aufrufen
await logOutboundMids(peerConnection);
Statistiken einem Transceiver zuordnen
const statsForTransceiver = async (pc, transceiver) => {
const report = await pc.getStats();
return [...report.values()].filter(
(s) => s.type === 'outbound-rtp' && s.mid === transceiver.mid
);
};
const [videoTransceiver] = peerConnection
.getTransceivers()
.filter((t) => t.sender.track?.kind === 'video');
const entries = await statsForTransceiver(peerConnection, videoTransceiver);
entries.forEach((s) =>
console.log(`rid=${s.rid ?? '-'} bytesSent=${s.bytesSent}`)
);
Gesendete Bytes pro MID summieren (Simulcast)
const bytesPerMid = async (pc) => {
const totals = new Map();
const report = await pc.getStats();
for (const s of report.values()) {
if (s.type !== 'outbound-rtp' || s.mid === undefined) continue;
totals.set(s.mid, (totals.get(s.mid) ?? 0) + s.bytesSent);
}
return Object.fromEntries(totals);
};
console.log(await bytesPerMid(peerConnection));
// Wichtig · Fallstricke
- Erst nach der Aushandlung verfügbar: Vor
setLocalDescription()/setRemoteDescription()fehltmid. Prüfe den Wert deshalb immer aufundefined. - Nicht eindeutig pro Eintrag: Bei Simulcast haben mehrere
outbound-rtp-Einträge dieselbemid. Eindeutig ist ein Eintrag erst überidoder über die Kombination ausmidundrid. - Kein fester Wert: Die MID ist ein beliebiger String, der im SDP-Angebot festgelegt wird (oft
"0","1"…). Verlass dich nicht auf eine bestimmte Nummerierung und zieh daraus keine Schlüsse auf die Medienart. Dafür gibt eskind. - Browser-Unterstützung: Chromium-Browser liefern
midschon länger. In Firefox und Safari ist die Eigenschaft erst in neueren Versionen verfügbar. Ältere Browser lassen sie weg, dann ordnest du Einträge ersatzweise überssrcodermediaSourceIdzu.