Dlaczego getUserMedia rzuca [obiekt NavigatorUserMediaError] po kliknięciu „Zezwalaj” w Chrome?
Niedawno zacząłem otrzymywać błędy podczas próby uzyskania dostępu do mikrofonu klienta za pośrednictwem mojej strony internetowej. Gdy Chrome zapyta, czy zezwolić witrynie na dostęp do mikrofonu użytkownika,[object NavigatorUserMediaError]
jest produkowane niezależnie od tego, czy klikną „zezwól”, czy „odmów”. Dzieje się tak niezależnie od tego, czy mikrofon jest rzeczywiście podłączony do komputera (na którym działa Ubuntu 12.04).
Dalsze testy w Firefoksie wykazały, że nie jest to specyficzne dla Chrome. Problem zaczął się dopiero po tym, jak zrobiłem demo na żywo, a następnie wylogowałem się z komputera. Próbowałem nagrać demo dostępu do mikrofonu i napotkał ten sam problem.
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);
}
Jest to dość zagadkowe, ponieważ działało idealnie aż do momentu, kiedy wylogowałem się, a następnie zalogowałem i próbowałem ponownie przetestować.
Hostuję kod internetowy lokalnie, za pośrednictwem Jetty i Eclipse. Uzyskuję dostęp, wpisująclocalhost:8080/my-program
do przeglądarki internetowej.
Edycja: Po wystąpieniu błędu ikona kamery pojawia się w pasku adresu chrom, mówiąc, że Chrome uzyskuje dostęp do mojego mikrofonu i wyświetla dwa możliwe mikrofony, „Domyślny” i „Wbudowany analogowy stereo audio”.
Edytuj 2: Ten błąd występuje również na innych stronach internetowych, które próbują uzyskać dostęp do mojego mikrofonu przez Webrtc. Tradycyjna implementacja Flash nadal działa.
Wydaje się, że Chrome wyrzuca komunikat o błędzie w regularnych odstępach czasu, gdy jest otwarty.
[361:362:0725/095320:ERROR:audio_output_device.cc(186)]
Not implemented reached in virtual void
media::AudioOutputDevice::OnStateChanged(media::AudioOutputIPCDelegate::State)
Edytuj 3: Udało mi się nieco wyjaśnić komunikat o błędzie
NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}