0

Il est trivial d'obtenir ce genre de code au travail:Étiquettes de caméra et de micro MediaStream avant l'autorisation?

const videoTracks = this.localStream.getVideoTracks(); 
const audioTracks = this.localStream.getAudioTracks(); 
if (videoTracks.length > 0) 
    this.trace('Using video device: ' + videoTracks[0].label); 
if (audioTracks.length > 0) 
    this.trace('Using audio device: ' + audioTracks[0].label); 

Que diriez-vous avant que les appareils sont choisis?

navigator.mediaDevices 
    .enumerateDevices() 
    .then(this.gotDevices.bind(this)) 
    .catch(this.alertsService.add.bind(this.alertsService)); 
} 

gotDevices(deviceInfos: MediaDeviceInfo[]) { 
    this.mediaDeviceInfos = deviceInfos; 
    this.mediaDeviceInfos.forEach(device => { 
     if (device.kind === 'audioinput') 
      this.mics.push(device); 
     else if (device.kind === 'videoinput') 
      this.cams.push(device); 
     else 
      console.warn(`Unexpected: ${JSON.stringify(device)}`); 
    }); 
} 

this.mediaDeviceInfos.some(dev => dev.label) est false. Je dois donc utiliser dev.deviceId dans mon entrée, ce qui est laid:

camera choice screen

J'ai besoin du dispositif spécifique choisi ici parce que je l'utilise comme si, pour supporter de multiples cames et micros:

const constraints: MediaStreamConstraints = { 
    audio: { advanced: [{ deviceId: mic.deviceId, groupId: mic.groupId }] }, 
    video: { advanced: [{ deviceId: cam.deviceId, groupId: cam.groupId }] } 
}; 

Comment obtenir des étiquettes pour mon appareil photo et mon micro, afin que l'utilisateur puisse les choisir dans le thème?

+0

N'obtenez-vous pas l'objet ayant la propriété '" label "' 'this.mediaDeviceInfos = deviceInfos;'? – guest271314

+0

Oui, mais label est toujours '" "' sur Firefox 57.0b6 & 57.0b7 (64 bits). Accrochez-vous, il suffit de cocher Chrome et cela fonctionne. Hmm ... –

+0

Confirmé '' "' 'label sur Firefox 56.0.1 (64-bit) aussi –

Répondre

0

Vous pouvez appeler navigator.mediaDevices.enumerateDevices() au sein de .then() chaîné à navigator.mediaDevices.getUserMedia(). Lorsque le protocole est https: et que la permission est accordée au périphérique ou aux périphériques, la propriété MediaDeviceInfo objet "label" doit être définie sur le périphérique de support disponible.

navigator.mediaDevices.getUserMedia(/* {video:true, audio:true} */) 
.then(stream => 
    navigator.mediaDevices 
    .enumerateDevices() 
    .then(devices => { 
     return devices 
    }) 
    .catch(err => {throw err}) 
) 
.then(devices => { 
    console.log(devices); 
    for (const mediaDeviceInfo of devices) { 
    const {deviceId, kind, label} = mediaDeviceInfo; 
     console.log(deviceId, kind, label); 
    } 
}) 
.catch(err => console.error(err)) 
+1

Firefox ne demande pas (encore) le protocole https, mais oui, par mesure de sécurité (pour éviter les empreintes digitales), vous devez être accordé à l'utilisateur permission avant de pouvoir obtenir le 'label' et en fait le demander via gUM est nécessaire (btw, votre fonction pourrait fermer la requête gUM après avoir accédé aux étiquettes, je l'ai écrit alors que je ne comprends toujours pas ta réponse qui fait presque même: https://jsfiddle.net/cg2110zj/ – Kaiido

+0

@ guest271314 et @Kaiido: Merci, mais cela ne fonctionnera pas, ['getUserMedia' a des options' advanced'] (https://github.com/Microsoft/TypeScript/ blob/a6555921f4b1d51281b1241c69e91e5b82d2f07e/lib/lib.dom.d.ts # L283) permettant la spécification de 'groupId',' deviceId' & etc au lieu de simplement un 'booléen' .Comme l'utilisateur ajoute deux + caméras et micros, il est logique de montrez-les dans la vue rendue plutôt que dans le navigateur issions popup. Donc, je suppose que c'est possible sur Chrome et non sur Firefox? : \ –

+2

@SamuelMarks Vous pouvez également utiliser 'deviceId' dans FF, vous pouvez même accéder à la liste de tous les périphériques disponibles. Ce que vous ne pouvez pas faire, c'est d'obtenir leur «étiquette» (c'est-à-dire le nom du fabricant), et ceci afin d'éviter un site Web aléatoire pour vous identifier à travers ces informations personnelles. Pour obtenir ces informations, dans FF, vous devez obtenir l'approbation de l'utilisateur pour utiliser au moins un de ces périphériques. Donc, si vous voulez vraiment afficher ces étiquettes, vous pouvez faire une première requête, uniquement destinée à accéder aux étiquettes des périphériques. https://jsfiddle.net/cg2110zj/1/ Ou vous pouvez toujours utiliser des noms génériques: https://jsfiddle.net/cg2110zj/2/ – Kaiido