Почему getUserMedia бросает [объект NavigatorUserMediaError], когда я нажимаю "Разрешить" в Chrome?

В последнее время я начал получать ошибки при попытке получить доступ к микрофону клиента через мой веб-сайт. Когда Chrome спрашивает, разрешить ли сайту доступ к пользовательскому микрофону, создается [object NavigatorUserMediaError], если они нажимают "разрешить" или "отрицать". Это происходило независимо от того, действительно ли микрофон подключен к компьютеру (на котором работает Ubuntu 12.04).

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

var getVideo = false, getAudio = true;

navigator.getUserMedia || (navigator.getUserMedia = navigator.mozGetUserMedia ||
        navigator.webkitGetUserMedia || navigator.msGetUserMedia);

function init() {
    if(navigator.getUserMedia) {
        navigator.getUserMedia({video:getVideo, audio:getAudio}, onSuccess, onError);
    } else {
        alert('getUserMedia failed.');
    }
}

function onSuccess() {
    console.log("Yay");
}

function onError(err) {
    console.log("Noo " + err);
}

Это довольно озадачительно, так как он отлично работал до тех пор, пока я не вышел из системы, а затем снова зашел в систему и попытался проверить его снова.

Я размещаю веб-код локально, через Jetty и Eclipse. Я обращаюсь к нему, набрав localhost:8080/my-program в веб-браузере.

Изменить: После появления ошибки значок камеры появляется в хромированной адресной строке, говоря, что Chrome обращается к моему микрофону и перечисляет два возможных микрофона: "По умолчанию" и "Встроенный аналоговый стереозвук".

Изменить 2: Эта ошибка также возникает на других веб-сайтах, которые пытаются получить доступ к моему микрофону через webrtc. Традиционная реализация Flash все еще работает.

Кажется, что Chrome периодически выводит сообщение об ошибке через открытый промежуток времени.

[361:362:0725/095320:ERROR:audio_output_device.cc(186)] 
Not implemented reached in virtual void
media::AudioOutputDevice::OnStateChanged(media::AudioOutputIPCDelegate::State)

Изменить 3: Я смог уточнить сообщение об ошибке немного больше

NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}

Ответ 1

Один браузер за раз

Я столкнулся с этой ситуацией, когда тестирую несколько открываемых браузеров. Похоже, что только один браузер может одновременно получать доступ к медиа.

т.е. когда у меня открыта страница в Chrome, и видео/аудио работает, Firefox не будет работать, и когда я буду работать в Firefox, Chrome не работает.

Ответ 2

Это может произойти в двух ситуациях, и я испытал как в Ubuntu 12.04:

  • Один раз щелкнул "Запретить", а затем браузер сохранил эту настройку, всегда возвращая ошибку при запросе на доступ к медиа на этой странице. (Это не похоже на ваш случай, поскольку вы получаете вопрос из браузера, но вам просто нужно пойти в адресную строку, щелкнуть значок камеры и изменить вариант, чтобы спросить снова).

  • Ваш браузер не имеет доступа к мультимедийным устройствам и как на любом компьютере без камер или микрофонов, даже если вы нажмете "Разрешить", вы получите сообщение об ошибке, так как оно не может дать вам никаких потоков. Попробуйте проверить настройки браузера, чтобы узнать, можно ли выбрать выбранную камеру. Я испытал это, и список был пуст. Чтобы решить эту проблему, мне пришлось перезагрузить компьютер, и Chrome снова начал показывать список устройств.

Ответ 3

NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}

Это означает, что ваши настройки браузера не позволяют вам получить доступ к камере. Перейдите в настройки браузера → в настройках веб-сайта вы найдете список веб-страниц, которые вы заблокировали от доступа к вашему устройству.

Ответ 4

getUserMedia работает только на https; исключение для localhost (i.e http://localhost). Safari также никогда не может позволить getUserMedia изнутри iFrame. Я всегда получаю "Попытка вызвать getUserMedia из документа с другой безопасностью, чем ошибка верхнего уровня". Это делает невозможным использование таких сайтов, как codepen и jsfiddle.

Больше detials https://webrtchacks.com/safari-webrtc/