Используя WebRTC, как выбрать микрофон и камеру? - PullRequest
0 голосов
/ 11 февраля 2019

Используя API navigator.mediaDevices.enumerateDevices () Я получил идентификатор устройств, доступных на компьютере, но я не знаю, как сообщить навигатору, что я хочу переключить камеру или микрофон.На форумах есть много примеров, но ни один не ясен, так как webRTC много раз менял API и его ссылки.В сети есть только один пример, предложенный 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);
    };
};

Я надеюсь, что в моем приложении есть возможность сменить камеру и микрофон ...

1 Ответ

0 голосов
/ 11 февраля 2019

Используйте ограничение 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 в вашей системе.

...