Javascript 使用WebRTC如何选择麦克风和摄像头?
使用API navigator.mediaDevices.enumerateDevices()我获得了计算机中可用设备的ID,但我不知道如何告诉navigator我要切换相机或麦克风。论坛中有很多例子,但没有一个是明确的,因为webRTC多次更改API及其引用。web上只有一个例子,由webRTC提出,但我不能真正理解它,或者至少我在它的代码中找不到我需要的东西 我没有尝试太多,因为我是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
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好吧,我相信我已经回答了你的问题。我希望你能解决你的具体问题。我把这个案子抛在脑后,继续做其他事情,今天我必须回到主题上来。我注意到的一个问题是:如何开始重新谈判?更改相机时,其他人看不到生成的新流。。。提前谢谢!