Signatur
Beschreibung
Die Eigenschaft kind eines MediaDeviceInfo-Objekts gibt an, um welche Art von Mediengerät es sich handelt. Solche Objekte liefert navigator.mediaDevices.enumerateDevices(). Mögliche Werte sind:
"videoinput": Videoeingang, z. B. Webcam oder virtuelle Kamera"audioinput": Audioeingang, z. B. Mikrofon oder Headset-Mikrofon"audiooutput": Audioausgang, z. B. Lautsprecher oder Kopfhörer
Am häufigsten braucht man kind, um die Geräteliste zu filtern. So lassen sich getrennte Auswahllisten für Kamera, Mikrofon und Lautsprecher bauen, etwa in einer Videokonferenz-App. Mit der deviceId des gewählten Geräts ruft man dann gezielt getUserMedia() auf oder legt über HTMLMediaElement.setSinkId() den Audioausgang fest.
Die Eigenschaft ist schreibgeschützt. Der Wert steht fest, sobald der Browser die Geräte aufzählt. Bei Eingabegeräten ist das Objekt eine Instanz von InputDeviceInfo, einer Unterklasse von MediaDeviceInfo.
Rückgabewert
Beispiele
Alle Geräte mit ihrer Art auflisten
const listDevices = async () => {
const devices = await navigator.mediaDevices.enumerateDevices();
devices.forEach(({ kind, label, deviceId }) => {
console.log(`${kind}: ${label || '(kein Label)'} [${deviceId.slice(0, 8)}]`);
});
};
listDevices();
Geräte nach Art gruppieren
const groupByKind = async () => {
// Erst Berechtigung einholen, damit die Labels befüllt sind
const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
stream.getTracks().forEach((t) => t.stop());
const devices = await navigator.mediaDevices.enumerateDevices();
const grouped = Object.groupBy(devices, (d) => d.kind);
console.log('Kameras:', grouped.videoinput?.length ?? 0);
console.log('Mikrofone:', grouped.audioinput?.length ?? 0);
console.log('Lautsprecher:', grouped.audiooutput?.length ?? 0);
return grouped;
};
groupByKind();
Auswahlliste für Kameras befüllen und Stream starten
const select = document.querySelector('#camera-select');
const video = document.querySelector('video');
const fillCameras = async () => {
const devices = await navigator.mediaDevices.enumerateDevices();
const cameras = devices.filter((d) => d.kind === 'videoinput');
select.replaceChildren(
...cameras.map((cam, i) => new Option(cam.label || `Kamera ${i + 1}`, cam.deviceId))
);
};
select.addEventListener('change', async () => {
video.srcObject?.getTracks().forEach((t) => t.stop());
video.srcObject = await navigator.mediaDevices.getUserMedia({
video: { deviceId: { exact: select.value } }
});
});
fillCameras();
navigator.mediaDevices.addEventListener('devicechange', fillCameras);
// Wichtig · Fallstricke
- Datenschutz: Ohne erteilte Medienberechtigung liefern Browser oft nur ein Gerät pro
kind, und zwar mit leeremlabelund leererdeviceId. Die Werte vonkindselbst sind aber auch dann verfügbar. audiooutput: Firefox zeigt Ausgabegeräte nur an, wennmedia.setsinkid.enabledaktiv ist oder vorherselectAudioOutput()aufgerufen wurde. Safari listet in der Regel keineaudiooutput-Geräte auf. Eine Oberfläche für die Lautsprecherwahl sollte deshalb mit einer leeren Liste umgehen können.- Sicherer Kontext:
navigator.mediaDevicesgibt es nur über HTTPS oder auflocalhost. - Vergleiche immer mit dem exakten, klein geschriebenen String, zum Beispiel
d.kind === 'videoinput'. Andere Werte sind nicht festgelegt. Object.groupByaus Beispiel 2 gibt es erst ab ES2024. In älteren Umgebungen nimmst du stattdessenreduce().