在连接到内部麦克风时,活动的媒体流(语音)navigator.mediaDevices.getUserMedia
工作正常,一旦我切换到蓝牙设备并重新运行相同的API以获取最新的媒体流,就会收到错误{{ 1}}
我浏览了很多论坛,很多人暗示,当多个标签试图访问麦克风或摄像头时,此错误通常发生在Firefox,Mac OS中。
我确保在Firefox浏览器中仅打开单个选项卡,仍然看到相同的错误。
对此表示感谢的任何线索。
下面是代码段
"NotReadableError: Concurrent mic process limit."
返回以下错误消息
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);
});
注意:在Chrome和Edge中正常工作
浏览器:Firefox 70.0.1(64位)
OS:MacOS Mojave
答案 0 :(得分:0)
这意味着您现在不能在 Firefox 中为每个进程一次打开多个麦克风。此限制是 Mozilla 正在努力修复的 known bug。
实际上,这意味着您不能从您的站点打开多个麦克风(同源标签通常共享相同的过程)。使用麦克风后,请务必拨打 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。
虽然回退到其他设备通常是好的,但当用户尝试选择特定设备时则不然。