使用
deviceId
约束。
我已经更新了
MDN
提到它。
$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));
}
</code>
使用
exact
用于防止回退到其他设备的关键字,因为这是一个选择器。
你可以忽略
“audiooutput”
,因为那些是扬声器,而不是麦克风。也没有这样的事情
“videooutput”
。这是一个无效的价值。那些将是我想的显示,但这些都没有列举
enumerateDevices()
。
以上仅用于说明,以说明API的工作原理。由于我们正在处理硬件,因此制作一个强大的选择器是一个留给读者的练习。
例如:大多数手机只能同时打开一个相机。例如,还可能存在其他冲突,例如使用来自相机之外的相机的麦克风。相比
device.groupId
用于了解相机和麦克风是否位于同一硬件上的属性。如果它们匹配,例如,更换相机和麦克风可能会更好。
如果您怀疑硬件问题,请尝试使用
WebRTC示例演示
在你的系统上。