Используйте ограничение 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));
}
Используйте ключевое слово exact
, чтобы предотвратить откат на другое устройство, так как это селектор.
Вы можете игнорировать "audiooutput"
, так как это динамики, а не микрофоны.Также нет такой вещи как "videooutput"
.Это неверное значение.Я полагаю, что это будут дисплеи, но они не перечислены enumerateDevices()
.
Выше приведен только для иллюстрации, чтобы показать, как работают API.Поскольку мы имеем дело с аппаратным обеспечением, создание надежного селектора - это упражнение, оставленное читателю.
Например: большинство телефонов работают только с одной открытой камерой одновременно.Также могут быть другие конфликты, такие как, например, использование микрофона с камеры, отличной от используемой камеры.Сравните свойства device.groupId
, чтобы узнать, установлены ли камера и микрофон на одном оборудовании.Если они совпадают, может лучше сработать, например, для смены камеры и микрофона.
Если вы подозреваете аппаратные проблемы, попробуйте демонстрационную версию WebRTC в вашей системе.