Start · Sprachen · JavaScript · Referenz · RTCIceCandidate.sdpMid

RTCIceCandidate.sdpMid

Eigenschaft

Schreibgeschützter String mit dem Media-Stream-Identifikator (<code>a=mid</code>) der SDP-Medienbeschreibung, zu der der ICE-Kandidat gehört, oder <code>null</code>.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

RTCIceCandidate.sdpMid

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

Typ
string | null
Beschreibung
Der MID-Wert des zugehörigen Medienabschnitts als String (z. B. "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());
MID: 0 Index: 0

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);
});
Füge Kandidat für MID 0 hinzu

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'}`);
};
Kandidat gehört zu: audio

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);
null

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung wie candidate.sdpMid = "1" wird ignoriert (im Strict Mode TypeError). Den Wert nur über den Konstruktor setzen.
  • Der Konstruktor wirft einen TypeError, wenn sowohl sdpMid als auch sdpMLineIndex null sind – 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 auf sdpMid prüfen. Ein Kandidat mit leerem candidate-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.