Signatur
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
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();
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);
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));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
source.mediaStreamwird ohne Fehlermeldung ignoriert, im Strict Mode löst sie einenTypeErroraus. 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()einenInvalidStateError. - Ressourcen:
disconnect()oder das Schließen desAudioContextgibt das Mikrofon nicht frei. Dafür müssen die Spuren mittrack.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 istcreateMediaStreamSource()die sicherere Variante.