Javascript 使用WebRTC如何选择麦克风和摄像头?

Javascript 使用WebRTC如何选择麦克风和摄像头?,javascript,webrtc,simplewebrtc,Javascript,Webrtc,Simplewebrtc,使用API navigator.mediaDevices.enumerateDevices()我获得了计算机中可用设备的ID,但我不知道如何告诉navigator我要切换相机或麦克风。论坛中有很多例子,但没有一个是明确的,因为webRTC多次更改API及其引用。web上只有一个例子,由webRTC提出,但我不能真正理解它,或者至少我在它的代码中找不到我需要的东西 我没有尝试太多,因为我是webRTC的新手 if(!navigator.mediaDevices || !navigator.medi

使用API navigator.mediaDevices.enumerateDevices()我获得了计算机中可用设备的ID,但我不知道如何告诉navigator我要切换相机或麦克风。论坛中有很多例子,但没有一个是明确的,因为webRTC多次更改API及其引用。web上只有一个例子,由webRTC提出,但我不能真正理解它,或者至少我在它的代码中找不到我需要的东西

我没有尝试太多,因为我是webRTC的新手

if(!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) console.log('Enumerate Media Devices from getUserMedia is not supported');
navigator.mediaDevices.enumerateDevices()
    .then(function(devices) {
        devices.forEach(function(device) {
            if (device.kind == 'audioinput' || device.kind == 'audiooutput') $scope.devicesAudio.push(device);
            else if (device.kind == 'videoinput' || device.kind == 'videooutput') $scope.devicesVideo.push(device);
            else $scope.devices.push(device);
        });
    })
    .catch(function(err) {
        console.log(err.name + ':' + err.message);
    });




$scope.selectDevice = function(device) {

    if(device.kind == 'videooutput' || device.kind == 'videoinput') {
        console.log('video Device selected' + ' DEVICE_ID: ' + device.deviceId);
    }
    else if(device.kind == 'audioinput' || device.kind == 'videooutput') {
        console.log('Audio device selected' + ' DEVICE_ID: ' + device.deviceId);
    };
};

我希望我的应用程序可以选择更改摄像头和麦克风…

使用
设备ID
约束。 我已经更新到提到它

$scope.selectDevice = function(device) {
  let constraints, oldtrack;
  if (device.kind == 'videoinput') {
    constraints = {video: { deviceId: {exact: device.deviceId}}};
    oldtrack = (video.srcObject || []).getVideoTracks()[0];
  } else {
    constraints = {audio: { deviceId: {exact: device.deviceId}}};
    oldtrack = (video.srcObject || []).getAudioTracks()[0];
  }
  // Most phones only handle one camera open at a time, so stop old device first.
  if (oldtrack) {
    oldtrack.stop();
  }
  return navigator.mediaDevices.getUserMedia(constraints) 
    .then(stream => video.srcObject = stream);
    .catch(err => console.log(err.name + ':' + err.message));
}
使用
exact
关键字防止退回到其他设备,因为这是一个选择器

您可以忽略“音频输出”,因为这些是扬声器,而不是麦克风。也没有像
“videooutput”
这样的东西。这是一个无效的值。我想这些应该是显示,但那些不是由
enumerateDevices()
枚举的

以上仅用于说明API是如何工作的。因为我们要处理硬件,所以制作一个健壮的选择器是留给读者的一个练习

例如:大多数手机只能同时打开一个摄像头。也可能存在其他冲突,例如,从使用中的摄像机以外的摄像机获取麦克风。比较
device.groupId
属性,了解摄像头和麦克风是否在同一硬件上。例如,如果它们匹配的话,最好是同时更换相机和麦克风


如果您怀疑硬件问题,请在系统上尝试。

我使用SimpleWebRTC,但它不起作用,我所做的是从HTML中传递设备id和类型(音频或视频),这样我可以更改相机,但它会与microphone@lucasemanuelhimelfarb这是电话吗?听起来像是硬件限制,而不是API问题。我已经更新了这个示例来处理电话。不,我正在使用simplewebRTC库,特别是我遇到的冲突是,当我更换麦克风时,我删除了视频…@lucasemanuelhimelfarb好吧,我相信我已经回答了你的问题。我希望你能解决你的具体问题。我把这个案子抛在脑后,继续做其他事情,今天我必须回到主题上来。我注意到的一个问题是:如何开始重新谈判?更改相机时,其他人看不到生成的新流。。。提前谢谢!