navigator.mediaDevices.getUserMedia API rejecting with error "NotReadableError: Concurrent mic process limit."
navigator.mediaDevices.getUserMedia API rejecting with error "NotReadableError: Concurrent mic process limit."
在活动媒体流(语音)期间 navigator.mediaDevices.getUserMedia
在连接到内部麦克风时工作正常,只要我切换到蓝牙设备并重新运行相同的 API 以获取最新的媒体流,我收到错误 "NotReadableError: Concurrent mic process limit."
我浏览了很多论坛,正如许多人所建议的那样,这个错误通常发生在 Firefox 中,Mac OS 当多个选项卡试图访问麦克风 or/and 摄像头时。
我确保在 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);
});
Return 下面的错误信息
NotReadableError: Concurrent mic process limit.
注意:在 Chrome 和 Edge
中工作正常
浏览器:Firefox 70.0.1(64 位)
OS : MacOS 莫哈韦
NotReadableError:并发麦克风进程限制。
这意味着您现在不能在 Firefox 的每个进程中一次打开多个麦克风。此限制是 known bug Mozilla 正在努力解决的问题。
实际上,这意味着您不能从您的站点打开多个麦克风(同源选项卡通常共享相同的进程)。确保在使用完麦克风后致电 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}
。即
const constraints = {
audio: {deviceId: {exact: deviceId}},
};
这会告诉浏览器你想要这个特定的设备或失败,并避免recent regression in Firefox。
虽然回退到其他设备通常很好,但当用户试图选择特定设备时就不是这样了。
在活动媒体流(语音)期间 navigator.mediaDevices.getUserMedia
在连接到内部麦克风时工作正常,只要我切换到蓝牙设备并重新运行相同的 API 以获取最新的媒体流,我收到错误 "NotReadableError: Concurrent mic process limit."
我浏览了很多论坛,正如许多人所建议的那样,这个错误通常发生在 Firefox 中,Mac OS 当多个选项卡试图访问麦克风 or/and 摄像头时。
我确保在 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);
});
Return 下面的错误信息
NotReadableError: Concurrent mic process limit.
注意:在 Chrome 和 Edge
中工作正常浏览器:Firefox 70.0.1(64 位)
OS : MacOS 莫哈韦
NotReadableError:并发麦克风进程限制。
这意味着您现在不能在 Firefox 的每个进程中一次打开多个麦克风。此限制是 known bug Mozilla 正在努力解决的问题。
实际上,这意味着您不能从您的站点打开多个麦克风(同源选项卡通常共享相同的进程)。确保在使用完麦克风后致电 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}
。即
const constraints = {
audio: {deviceId: {exact: deviceId}},
};
这会告诉浏览器你想要这个特定的设备或失败,并避免recent regression in Firefox。
虽然回退到其他设备通常很好,但当用户试图选择特定设备时就不是这样了。