I browser moderni consentono di selezionare dispositivi di input e output, tra cui videocamere, microfoni e altoparlanti.
Ad esempio:
- Su uno smartphone, seleziona la fotocamera anteriore o posteriore.
- Su un laptop, scegli gli altoparlanti interni o un altoparlante connesso tramite Bluetooth.
- Per una videochiamata, scegli un microfono o una videocamera interni o esterni.
Tutta questa funzionalità è esposta dall'oggetto MediaDevices, che viene restituito
entro il giorno navigator.mediaDevices
.
Mediadevices offre due metodi, entrambi implementati in Chrome 47 su computer e
Android: enumerateDevices()
e getUserMedia()
.
enumerateDevices()
Restituisce una promessa che dà accesso a un array di MediaDeviceInfo
oggetti per
tra i dispositivi disponibili.
Il metodo è simile a
MediaStreamTrack.getSources()
ma a differenza di quest'ultimo
(applicato solo in Chrome), sia conforme agli standard
include i dispositivi di output audio. Puoi fare una prova con le demo riportate di seguito.
Ecco del codice leggermente semplificato di una delle demo:
navigator.mediaDevices.enumerateDevices()
.then(gotDevices)
.catch(errorCallback);
...
function gotDevices(deviceInfos) {
...
for (var i = 0; i !== deviceInfos.length; ++i) {
var deviceInfo = deviceInfos[i];
var option = document.createElement('option');
option.value = deviceInfo.deviceId;
if (deviceInfo.kind === 'audioinput') {
option.text = deviceInfo.label ||
'Microphone ' + (audioInputSelect.length + 1);
audioInputSelect.appendChild(option);
} else if (deviceInfo.kind === 'audiooutput') {
option.text = deviceInfo.label || 'Speaker ' +
(audioOutputSelect.length + 1);
audioOutputSelect.appendChild(option);
} else if (deviceInfo.kind === 'videoinput') {
option.text = deviceInfo.label || 'Camera ' +
(videoSelect.length + 1);
videoSelect.appendChild(option);
}
...
}
Una volta recuperati gli ID dei dispositivi disponibili con enumerateDevices()
, puoi utilizzare setSinkId()
(definito nell'API Audio Output Devices) per modificare la destinazione dell'output audio per un elemento video o audio:
element.setSinkId(sinkId)
.then(function() {
console.log('Audio output device attached: ' + sinkId);
})
.catch(function(error) {
// ...
});
Questo metodo imposta il dispositivo di output per l'audio dall'elemento. Dopo aver chiamato setSinkId()
, puoi ottenere l'ID del dispositivo audio di output corrente per l'elemento con la proprietà sinkId
.
getUserMedia()
Questo sostituisce navigator.getUserMedia()
, ma invece di utilizzare un callback, restituisce
una promessa che concede l'accesso a un MediaStream
. Gli sviluppatori sono invitati a utilizzare
MediaDevices.getUserMedia()
, ma non è prevista la rimozione
navigator.getUserMedia()
: rimane parte della specifica.
È disponibile una demo sul sito di esempio WebRTC.
Ecco un frammento di codice della demo:
navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {
var videoTracks = stream.getVideoTracks();
console.log('Got stream with constraints:', constraints);
console.log('Using video device: ' + videoTracks[0].label);
stream.onended = function() {
console.log('Stream ended');
};
window.stream = stream; // make variable available to console
video.srcObject = stream;
})
.catch(function(error) {
// ...
}
Rinuncia alla bandiera
Il metodo enumerateDevices()
è "flagless" in Chrome, mentre per
MediaDevices.getUserMedia()
devi ancora attivare l'opzione Experimental Web
Funzionalità della piattaforma in chrome://flags o utilizza il seguente flag della riga di comando:
--enable-blink-features=GetUserMedia
Allo stesso modo per setSinkId()
: attiva le funzionalità sperimentali della piattaforma web o utilizza un flag:
--enable-blink-features=AudioOutputDevices
Di seguito puoi trovare ulteriori dettagli sul supporto dei browser.
Il futuro
Il gestore di eventi ondevicechange
proposto fa ciò che dice: l'evento devicechange
viene attivato quando l'insieme di
cambia i dispositivi disponibili; inoltre, in un gestore puoi chiamare enumerateDevices()
visualizzare il nuovo elenco di dispositivi. Questa impostazione non è stata implementata in nessun browser
.
La bozza di acquisizione schermo è un'estensione
all'API Media Capture che propone un metodo MediaDevices.getDisplayMedia()
che consente di utilizzare le regioni del display di un utente come fonte di un contenuto multimediale
flusso di dati. È disponibile anche una proposta di estensione di MediaDevices
per
getSupportedConstraints()
, che fornisce informazioni sui vincoli che è possibile utilizzare per un
Chiamata getUserMedia()
: funzionalità audio e video supportate dal browser.
Demo
- getUserMedia()
- enumerateDevices():
- shim MediaDevices
Scopri di più
- Rete di sviluppatori Mozilla: dispositivi multimediali
- Stato dell'implementazione
- Bozza dell'editor degli eventi multimediali e degli stream: MediaDevices
- API Audio Output Devices