2017-10-11 20 views
0

이 일을 code의이 종류를 얻을 사소한 : 허락을 받기 전에 MediaStream 카메라 및 마이크 레이블이 필요합니까?

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); 

어떻게 장치를 선택하기 전에 어떻습니까?

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)false입니다.

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

은 내가 여러 캠과 마이크를 지원하기 위해, 그래서처럼 사용하기 때문에 특정 장치가 여기에 선택해야합니다 그래서 나는 추한 내 입력에 dev.deviceId을 사용해야합니다

내 카메라 및 마이크 용 레이블을 얻으려면 어떻게해야합니까? 사용자가 테마에서 선택할 수 있도록하려면 어떻게해야합니까?

+0

'this.mediaDeviceInfos = deviceInfos;'에 '라벨'속성이있는 객체를 가져 오지 않습니까? – guest271314

+0

예,하지만 Firefox 57.0b6 & 57.0b7 (64 비트)에서는 레이블이 항상 "" "'입니다. 잠깐만, 그냥 크롬을 확인하고 거기서 작동합니다. 흠 ... –

+0

파이어 폭스 56.0.1 (64 비트)의'' "레이블도 확인했습니다. –

답변

0

으로 연결되는 .then() 내에서 navigator.mediaDevices.enumerateDevices()으로 전화 할 수 있습니다. 프로토콜이 https:이고 장치 또는 장치에 대한 사용 권한이 부여 된 경우 MediaDeviceInfo 개체 "label" 속성을 사용 가능한 미디어 장치로 설정해야합니다.

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

파이어 폭스는 https 프로토콜을 요구하지 않지만, 보안을 위해 (핑거 프린팅을 피하기 위해) 사용자의 허가를 받아야합니다. 허락을 받기 전에 허락을 받고 실제로 gum을 통해 요청할 수 있어야합니다. (btw, 레이블에 접근 한 후에 함수가 gum 요청을 닫을 수 있습니다. https://jsfiddle.net/cg2110zj/ – Kaiido

+0

@ guest271314와 @Kaiido : 고맙지 만 작동하지 않을 것입니다. ['getUserMedia'에는'advanced' 옵션이 있습니다.] (https://github.com/Microsoft/TypeScript/ blob/a6555921f4b1d51281b1241c69e91e5b82d2f07e/lib/lib.dom.d.ts # L283)''boolean'' 대신에'groupId','deviceId' 등을 지정할 수 있습니다. 사용자가 + 카메라와 마이크를 2 개 추가하기 때문에, 브라우저가 아닌 랜더 뷰에서 보여줘야한다. 네이티브 give-perm 발행 팝업. 그래서 나는 Firefox가 아닌 Chrome에서 가능하다고 생각합니까? : \ –

+2

@SamuelMarks FF에서도 'deviceId'를 사용할 수 있습니다. 사용 가능한 모든 장치 목록에 액세스 할 수도 있습니다. 할 수없는 일은 자신의 '라벨'(즉, 제조업체 이름)을 가져 오는 것이며, 이렇게하면이 개인 정보를 통해 귀하를 식별 할 수있는 임의의 웹 사이트를 피할 수 있습니다. 이 정보를 얻으려면 FF에서 이러한 장치 중 적어도 하나를 사용하려면 사용자의 승인을 받아야합니다. 따라서 정말로이 레이블을 표시하려면 첫 번째 요청을 수행하면 장치 레이블에 액세스 할 수 있습니다. https://jsfiddle.net/cg2110zj/1/ 또는 일반 이름을 항상 사용할 수 있습니다. https://jsfiddle.net/cg2110zj/2/ – Kaiido