Signatur
Beschreibung
Die Eigenschaft mid eines RTCRtpTransceiver gibt die Media Identification an. Das ist der Wert des Attributs a=mid: in der zugehörigen Medienbeschreibung (m=-Zeile) der SDP. Über diese Kennung werden lokale und entfernte Medienabschnitte einander zugeordnet. Sie kennzeichnet also eindeutig das Paar aus RTCRtpSender und RTCRtpReceiver innerhalb einer RTCPeerConnection.
Solange noch keine Verhandlung stattgefunden hat, ist der Wert null. Die mid wird erst gesetzt, wenn eine lokale oder entfernte Beschreibung angewendet wurde, die diesen Transceiver einem Medienabschnitt zuordnet, also nach setLocalDescription() oder setRemoteDescription(). Nach einem Rollback oder wenn der Transceiver gestoppt und die Beschreibung entfernt wird, kann sie wieder null werden.
In der Praxis braucht man mid vor allem, um Signalisierungsdaten zuzuordnen. Beispiele sind Metadaten wie „dieser Stream ist die Bildschirmfreigabe“, ICE-Kandidaten (RTCIceCandidate.sdpMid) oder SFU-Konfigurationen, die sich auf bestimmte Medienabschnitte beziehen. Auch bei der Fehlersuche in SDP-Texten hilft die mid, weil man Transceiver damit schnell den passenden m=-Zeilen zuordnen kann.
Rückgabewert
"0", "1" oder "audio"). Solange der Transceiver noch keinem Medienabschnitt in einer ausgehandelten Beschreibung zugeordnet ist, ist der Wert null.Beispiele
mid vor und nach der Verhandlung
const pc = new RTCPeerConnection();
const transceiver = pc.addTransceiver('video', { direction: 'sendrecv' });
console.log('Vorher:', transceiver.mid);
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
console.log('Nachher:', transceiver.mid);
Metadaten per Signalisierung über die mid zuordnen
// Sender: Rolle der Streams zusammen mit dem Angebot verschicken
const pc = new RTCPeerConnection();
const cam = await navigator.mediaDevices.getUserMedia({ video: true });
const screen = await navigator.mediaDevices.getDisplayMedia({ video: true });
const camTx = pc.addTransceiver(cam.getVideoTracks()[0], { direction: 'sendonly' });
const screenTx = pc.addTransceiver(screen.getVideoTracks()[0], { direction: 'sendonly' });
await pc.setLocalDescription(await pc.createOffer());
const meta = {
[camTx.mid]: 'kamera',
[screenTx.mid]: 'bildschirm'
};
// Ein beliebiger Signalisierungskanal, z. B. ein WebSocket
signaling.send(JSON.stringify({ sdp: pc.localDescription, meta }));
Empfänger: eingehende Tracks über die mid zuordnen
let streamMeta = {}; // wird aus der Signalisierung befüllt
pc.addEventListener('track', ({ transceiver, track }) => {
const rolle = streamMeta[transceiver.mid] ?? 'unbekannt';
console.log(`Track ${track.kind} mit mid=${transceiver.mid} ist: ${rolle}`);
const video = document.querySelector(`video[data-rolle="${rolle}"]`);
if (video) video.srcObject = new MediaStream([track]);
});
Transceiver zu einer mid finden
const findTransceiverByMid = (pc, mid) =>
pc.getTransceivers().find((t) => t.mid === mid) ?? null;
const tx = findTransceiverByMid(pc, '1');
if (tx) {
tx.direction = 'inactive'; // z. B. Bildschirmfreigabe pausieren
}
// Wichtig · Fallstricke
- Anfangs
null: Direkt nachaddTransceiver()oderaddTrack()istmidimmernull. Verwende den Wert erst nachsetLocalDescription()bzw.setRemoteDescription(), sonst werden Schlüssel wie\"null\"in Objekten erzeugt. - Format nicht garantiert: Browser vergeben meist
\"0\",\"1\"usw. Die Gegenseite kann aber beliebige Zeichenketten verwenden, etwa\"audio\"oder\"video\"bei älteren Implementierungen. Rechne also nicht damit, dass die Werte Zahlen sind oder fortlaufend vergeben werden. - Schreibgeschützt: Eine Zuweisung wird ignoriert bzw. wirft im Strict Mode einen
TypeError. Ändern lässt sich diemidnur über eine andere SDP, und eine SDP von Hand zu verändern ist fehleranfällig. - Wiederverwendung: Nach
stop()und erneuter Verhandlung kann ein Medienabschnitt von einem neuen Transceiver mit neuermidbelegt werden. Zuordnungen in der Signalisierung sollten deshalb nach jeder Neuverhandlung aktualisiert werden. - Kompatibilität: Setzt Unified Plan voraus. Beim veralteten Plan-B-Modus in alten Chrome-Versionen gab es keine Transceiver. In allen aktuellen Browsern ist die Eigenschaft verfügbar.