为什么在Chrome中点击“允许”时,getUserMedia会抛出[object NavigatorUserMediaError]错误?

10

最近访问客户端麦克风时,我在网站上遇到了错误。当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本地托管Web代码。我通过在Web浏览器中键入localhost:8080/my-program访问它。

编辑: 错误发生后,Chrome地址栏中会出现相机图标,表示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}

这是我的系统问题,而不是我的网页代码问题。从其他计算机上访问,该网站按预期工作。 - Big Duck
4个回答

6

** 一次只能打开一个浏览器 **

当我同时测试多个浏览器时,我遇到了这种情况。似乎每次只有一个浏览器可以访问媒体。

例如,当我在Chrome中打开我的页面并且视频/音频正常工作时,Firefox将无法工作,当我在Firefox中成功播放时,Chrome将无法工作。


谢谢你的建议。 - Arun Prasad E S

3
这种情况有两种可能性,我在Ubuntu 12.04中都经历过:
  • 你曾经点击了“拒绝”并保存了这个设置,导致每次在该网页请求媒体访问权限时都会返回错误。(但是你的情况似乎不是这样,因为浏览器还是会询问你,你只需要在地址栏中点击相机图标并更改选项以重新询问即可)。

  • 你的浏览器无法访问媒体设备,就像没有摄像头和麦克风的电脑一样,即使你按允许,也会出现错误事件,因为它无法给你任何流。尝试检查浏览器设置,看看是否可以选择所需的摄像头。我也遇到过这种情况,列表为空。要解决这个问题,我不得不重新启动机器,然后Chrome又开始显示设备列表了。


Chrome看到两个麦克风选项,分别是默认和内置音频模拟立体声。这个错误在两个选项下都会出现。如果你所说的是真的,那么当我没有插入麦克风时,该网站是如何工作的呢? - Big Duck
第三种情况是在通过HTTP访问站点且该站点不是本地主机时,Chrome现在仅支持通过HTTPs播放音频。 - Peter

1

NavigatorUserMediaError {code: 1, PERMISSION_DENIED: 1}

这意味着您的浏览器设置不允许您访问摄像头。进入浏览器设置->在网站设置下,您将找到一份已被阻止访问设备的网页列表。


0

getUserMedia只能在https上工作; 对于localhost(即http://localhost),没有例外。 Safari似乎也永远不允许从iFrame内获取getUserMedia。 我总是会收到“尝试从与其顶级框架具有不同安全来源的文档中调用getUserMedia”错误。 这使得使用像codepen和jsfiddle这样的站点变得不可能。

更多详细信息https://webrtchacks.com/safari-webrtc/


1
如果我没记错的话,Chrome浏览器中localhost是有例外的。 - jamix
1
是的,现在Chrome中的本地主机也支持它。 - Ivy.Xie
1
我之前在本地主机上使用过WebRTC,一切都很正常。但最近由于浏览器的新更新,我遇到了这个错误:DevicesNotFoundError。请查看此链接:https://dev59.com/ShT7s4cB2Jgan1znbaj5。 - Akshay komarla
Safari现在允许您在localhost上进行开发:打开“开发”菜单/ WebRTC> 允许在不安全的网站上捕获媒体。 - PDD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接