繁体   English   中英

navigator.mediaDevices.getUserMedia API 因错误“NotReadableError:并发麦克风进程限制”而拒绝。

[英]navigator.mediaDevices.getUserMedia API rejecting with error "NotReadableError: Concurrent mic process limit."

在活动媒体流(语音)期间, navigator.mediaDevices.getUserMedia在连接到内部麦克风时工作正常,只要我切换到蓝牙设备并重新运行相同的 API 以获取最新的媒体流,我就会收到错误"NotReadableError: Concurrent mic process limit."

我浏览了很多论坛,正如许多人所建议的那样,当多个选项卡尝试访问麦克风或/和相机时,此错误通常发生在 Firefox、Mac OS 中。

我确保在 Firefox 浏览器中只打开了一个选项卡,仍然看到相同的错误。

任何有关这方面的线索都将不胜感激。

下面是代码片段

constraints = {
    "audio": {"deviceId": deviceId },
    "video": false
}

let temp;
navigator.mediaDevices.getUserMedia(constraints).then(function(stream){
    temp = stream;
}).catch(function(err) {
  console.log(err.name + ": " + err.message);
});

返回以下错误信息

NotReadableError: Concurrent mic process limit.

注意:在 Chrome 和 Edge 中工作正常

浏览器:Firefox 70.0.1(64 位)

操作系统:MacOS Mojave

NotReadableError:并发麦克风进程限制。

这意味着您现在不能在 Firefox 中一次打开多个麦克风,每个进程。 此限制是 Mozilla 正在修复的已知错误

实际上,这意味着您不能从您的站点打开多个麦克风(同源选项卡通常共享相同的过程)。 确保在使用track.stop()麦克风后调用track.stop()

设备切换时出现

很少有网站需要同时使用两个麦克风。 但是当从一个麦克风切换到另一个麦克风时,站点仍然会遇到这个错误,因为他们通常在关闭旧麦克风之前打开新麦克风。

解决方法

在尝试从不同的麦克风获取音轨之前,先在现有的麦克风音轨上调用track.stop()

这种策略类似于一次只能打开一个摄像头的移动设备。 最好的方法是后备策略:仅在必要时停止旧轨道(这样不会对其他浏览器产生影响):

async function getUserMedia(constraints, oldTrack) {
  try {
    return await navigator.mediaDevices.getUserMedia(constraints);
  } catch (e) {
    if (e.name != "NotReadableError") throw e;
    oldTrack.stop();
    return await navigator.mediaDevices.getUserMedia(constraints);
  }
}

完成所有这些,但仍然获得与以前相同的麦克风

切换设备时,使用deviceId: {exact: deviceId} IE

const constraints = {
    audio: {deviceId: {exact: deviceId}},
};

这告诉浏览器你想要这个特定的设备或失败,并避免最近在 Firefox 中的回归

虽然回退到其他设备通常是好的,但当用户尝试选择特定设备时则不然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM