Signatur
Beschreibung
Die schreibgeschützte Eigenschaft sdpMid eines RTCIceCandidate gibt die Media Stream Identification (MID) der Medienkomponente zurück, mit der der Kandidat verknüpft ist. Dieser Wert entspricht dem Attribut a=mid:… im zugehörigen m=-Abschnitt der SDP-Beschreibung und bezeichnet so eindeutig einen Transceiver bzw. Medienabschnitt (Audio, Video oder Datenkanal).
Gebraucht wird sdpMid vor allem beim Signaling: Sammelt die lokale Seite einen ICE-Kandidaten (Ereignis icecandidate), schickt man neben dem Kandidaten-String auch sdpMid und sdpMLineIndex an die Gegenseite. Diese erzeugt daraus wieder einen RTCIceCandidate und übergibt ihn an RTCPeerConnection.addIceCandidate(), damit der Browser weiß, zu welchem Medienabschnitt der Kandidat gehört.
Ist sdpMid nicht null, hat es Vorrang vor sdpMLineIndex. Der Wert wird ausschließlich über den Konstruktor (new RTCIceCandidate({ sdpMid })) gesetzt; danach ist er unveränderlich. Bei Verwendung von BUNDLE (Standard in modernen Browsern) teilen sich zwar mehrere Medienabschnitte einen Transport, der Kandidat wird aber dennoch einem konkreten MID zugeordnet – meist dem ersten ("0").
Rückgabewert
"0", "1" oder "audio") oder null, wenn beim Erzeugen kein MID angegeben wurde.Beispiele
Kandidaten samt sdpMid an die Gegenseite senden
const pc = new RTCPeerConnection();
const signaling = new WebSocket('wss://example.com/signal');
pc.addEventListener('icecandidate', ({ candidate }) => {
if (!candidate) return; // Sammeln abgeschlossen
console.log('MID:', candidate.sdpMid, 'Index:', candidate.sdpMLineIndex);
signaling.send(JSON.stringify({
type: 'candidate',
candidate: candidate.candidate,
sdpMid: candidate.sdpMid,
sdpMLineIndex: candidate.sdpMLineIndex
}));
});
pc.addTransceiver('audio');
await pc.setLocalDescription(await pc.createOffer());
Empfangenen Kandidaten rekonstruieren und hinzufügen
signaling.addEventListener('message', async ({ data }) => {
const msg = JSON.parse(data);
if (msg.type !== 'candidate') return;
const candidate = new RTCIceCandidate({
candidate: msg.candidate,
sdpMid: msg.sdpMid,
sdpMLineIndex: msg.sdpMLineIndex
});
console.log('Füge Kandidat für MID', candidate.sdpMid, 'hinzu');
await pc.addIceCandidate(candidate);
});
sdpMid einem Transceiver zuordnen
const pc = new RTCPeerConnection();
pc.addTransceiver('audio');
pc.addTransceiver('video');
await pc.setLocalDescription(await pc.createOffer());
pc.onicecandidate = ({ candidate }) => {
if (!candidate) return;
const tr = pc.getTransceivers().find(t => t.mid === candidate.sdpMid);
console.log(`Kandidat gehört zu: ${tr?.receiver.track.kind ?? 'unbekannt'}`);
};
Direkt konstruierter Kandidat ohne MID
const c = new RTCIceCandidate({
candidate: 'candidate:1 1 udp 2122260223 192.0.2.10 54400 typ host',
sdpMLineIndex: 0
});
console.log(c.sdpMid);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
candidate.sdpMid = "1"wird ignoriert (im Strict ModeTypeError). Den Wert nur über den Konstruktor setzen. - Der Konstruktor wirft einen
TypeError, wenn sowohlsdpMidals auchsdpMLineIndexnullsind – daher beim Signaling immer beide Werte übertragen. - Der MID ist ein String, auch wenn er wie eine Zahl aussieht (
"0"). Vergleiche mit===gegen Zahlen schlagen fehl. - Das Ende-des-Sammelns-Ereignis liefert
candidate === null; vor dem Zugriff aufsdpMidprüfen. Ein Kandidat mit leeremcandidate-String signalisiert „end-of-candidates“ für den jeweiligen MID. addIceCandidate()scheitert, wenn noch keine Remote-Beschreibung gesetzt ist oder der MID in ihr nicht existiert – eingehende Kandidaten ggf. zwischenspeichern.- Kompatibilität: In allen aktuellen Browsern (Chrome, Firefox, Safari, Edge) verfügbar; nur in sicheren Kontexten (HTTPS) sinnvoll nutzbar.