navigator.mediaDevices.enumerateDevices() не отображает метку устройства в Firefox

Я работаю над функциями управления мультимедиа. Я показываю имя устройства, чтобы выбрать из выпадающего списка, и он работает нормально на Chrome, но на Firefox он не будет получать метку или имя устройства.

4 ответа

Решение

navigator.mediaDevices.enumerateDevices() вернет пустое значение атрибута метки в информации устройства мультимедиа, если соответствующие разрешения не предоставлены.

Чтобы она работала, я поместил эту функцию после того, как были предоставлены все медиа-разрешения, поэтому она также возвращает значение атрибута метки.

Чтобы дополнить ответы, в Firefox метки устройств, полученные из, также будут установлены на пустую строку в случае, если больше нет активных, даже если приложение было ранее временно авторизовано для доступа к устройствам путем вызова.

В приведенном ниже коде сначала будут отображаться метки (поскольку разрешение было предоставлено от):

      let stream = null

navigator.mediaDevices.getUserMedia({audio: true, video: false})
.then(s => {
  stream = s
  navigator.mediaDevices.enumerateDevices().then(devices => {
    devices.forEach(device => {
      console.log('device.label :', device.label)
    })
  })
})
.catch(error => {
  console.log('Error :', error)
})

Но если очистить следы созданного MediaStream, звоню navigator.mediaDevices.enumerateDevices() снова приведет к тому, что метки будут пустыми:

      stream.getTracks().forEach(track => {
  track.stop()
})

// No more active MediaStream => empty labels
navigator.mediaDevices.enumerateDevices().then(devices => { 
  devices.forEach(device => {
    console.log('device.label :', device.label)
  })
})

И вам действительно нужно позвонить navigator.mediaDevices.getUserMedia() снова для временного разрешения на доступ к устройствам:

      navigator.mediaDevices.getUserMedia({audio: true, video: false})
.then(s => {
  navigator.mediaDevices.enumerateDevices().then(devices => {
    devices.forEach(device => {
      console.log('device.label :', device.label)
    })
  })
})
.catch(error => {
    console.log('Error :', error)
})

Пример здесь: https://codesandbox.io/s/rivate-hawking-hswzi

Ссылка:https://developer.mozilla.org/en-US/docs/Web/API/MediaDeviceInfo/label

navigator.mediaDevices.enumerateDevices() возвращает обещание, которое выполняется с массивом экземпляров MediaDeviceInfo.

У меня это работало в Firefox 56.0 (64-битная версия).

Вы можете сделать что-то вроде этого:

navigator.mediaDevices.enumerateDevices()
.then((data) => {
  console.log('data', data);
})
.catch((err) => {
  console.log('error getting MediaDeviceInfo list', err);
});

где data - массив, содержащий список всех экземпляров MediaDeviceInfo.

более подробная информация здесь: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices

Сначала вам нужно предоставить разрешения. попробуйте этот код

if (navigator.mediaDevices.getUserMedia) {
            console.log('getUserMedia supported.');

            const constraints = {audio: true};
            let chunks = [];

            let onSuccess = function (stream) {

                if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
                    console.log("enumerateDevices() not supported.");
                    return false;
                }

                //List microphones.
                navigator.mediaDevices.enumerateDevices().then(function (devices) {
                    devices.forEach(function (device) {

                        if (device.kind === "audioinput") {
                            console.log(device.label);//Other parameters device.kind/device.deviceId
                        }

                    });
                }).catch(function (err) {
                    console.log(err.name + ": " + err.message);
                });

            }

            let onError = function (err) {
                console.log('The following error occured: ' + err);
            }

            navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);

        } else {
            console.log('getUserMedia not supported on your browser!');
        }
Другие вопросы по тегам