Start · Sprachen · JavaScript · Referenz · MediaStreamAudioSourceNode.mediaStream

MediaStreamAudioSourceNode.mediaStream

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>MediaStream</code> zurückgibt, aus dessen Audiospur der <code>MediaStreamAudioSourceNode</code> sein Signal bezieht.

seit JavaScript Baseline: alle modernen Browser (seit 2021) Kategorie: webapi

Signatur

MediaStreamAudioSourceNode.mediaStream

Beschreibung

Die Eigenschaft mediaStream eines MediaStreamAudioSourceNode verweist auf genau das MediaStream-Objekt, das beim Erzeugen des Knotens übergeben wurde, entweder über AudioContext.createMediaStreamSource(stream) oder über den Konstruktor new MediaStreamAudioSourceNode(context, { mediaStream }). Der Wert ist schreibgeschützt und kann später nicht mehr geändert werden.

Praktisch ist die Eigenschaft vor allem dann, wenn nur der Audioknoten weitergereicht wird, man aber später wieder an den ursprünglichen Stream kommen muss. Typische Fälle sind das Beenden des Mikrofonzugriffs mit track.stop(), das Abfragen der Spur-Einstellungen mit getSettings() oder das Auslesen des Gerätenamens über track.label.

Wichtig: Der Knoten liest nur eine Audiospur des Streams. Enthält der Stream mehrere Audiospuren, nimmt der Browser die Spur, deren id in lexikografischer Sortierung zuerst kommt. Über mediaStream bekommt man zwar den ganzen Stream zurück, aber nicht die Information, welche Spur tatsächlich verwendet wird. Soll eine bestimmte Spur verarbeitet werden, ist MediaStreamTrackAudioSourceNode die passende Wahl.

Rückgabewert

Typ
MediaStream
Beschreibung
Das MediaStream-Objekt, das beim Erzeugen des Knotens übergeben wurde. Es ist dieselbe Objektreferenz, keine Kopie.

Beispiele

Stream-Referenz prüfen

const main = async () => {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const ctx = new AudioContext();
  const source = ctx.createMediaStreamSource(stream);

  // Es wird dasselbe Objekt zurückgegeben
  console.log(source.mediaStream === stream);
  console.log(source.mediaStream.getAudioTracks().length);
};

main();
true 1

Mikrofon über den Knoten sauber beenden

const startMic = async (ctx) => {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const source = new MediaStreamAudioSourceNode(ctx, { mediaStream: stream });
  const analyser = ctx.createAnalyser();
  source.connect(analyser);
  return source; // nur der Knoten wird weitergegeben
};

const stopMic = (source) => {
  source.disconnect();
  // Den ursprünglichen Stream über die Eigenschaft holen und Spuren stoppen
  source.mediaStream.getTracks().forEach((track) => track.stop());
  console.log('Mikrofon freigegeben');
};

const ctx = new AudioContext();
const source = await startMic(ctx);
setTimeout(() => stopMic(source), 5000);
Mikrofon freigegeben

Informationen zum Eingabegerät anzeigen

const showInputInfo = (source) => {
  const [track] = source.mediaStream.getAudioTracks();
  if (!track) {
    console.log('Keine Audiospur vorhanden');
    return;
  }
  const { sampleRate, channelCount, echoCancellation } = track.getSettings();
  console.log(`Gerät: ${track.label}`);
  console.log(`Abtastrate: ${sampleRate} Hz, Kanäle: ${channelCount}`);
  console.log(`Echounterdrückung: ${echoCancellation}`);
};

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const ctx = new AudioContext();
showInputInfo(ctx.createMediaStreamSource(stream));
Gerät: Standard – Internes Mikrofon Abtastrate: 48000 Hz, Kanäle: 1 Echounterdrückung: true

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an source.mediaStream wird ohne Fehlermeldung ignoriert, im Strict Mode löst sie einen TypeError aus. Für einen anderen Stream muss ein neuer Knoten erzeugt werden.
  • Spurauswahl: Nur eine Audiospur wird verarbeitet, nämlich die mit der lexikografisch kleinsten id. Werden später Spuren zum Stream hinzugefügt oder daraus entfernt, wechselt der Knoten nicht auf eine andere Spur.
  • Stream ohne Audiospur: Hat der Stream beim Erzeugen keine Audiospur, wirft der Konstruktor bzw. createMediaStreamSource() einen InvalidStateError.
  • Ressourcen: disconnect() oder das Schließen des AudioContext gibt das Mikrofon nicht frei. Dafür müssen die Spuren mit track.stop() beendet werden.
  • Datenschutz: getUserMedia() funktioniert nur in sicheren Kontexten (HTTPS oder localhost) und erst nach Zustimmung des Nutzers.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt (Chrome, Edge, Firefox, Safari). Der Konstruktor new MediaStreamAudioSourceNode() kam in Safari erst später hinzu. Für ältere Versionen ist createMediaStreamSource() die sicherere Variante.