Web Audio Api : navigator.mediaDevices.getUserMedia ---> Error:NotReadableError: Concurrent mic process limit
Web Audio Api : navigator.mediaDevices.getUserMedia ---> Error:NotReadableError: Concurrent mic process limit
我正在开发一个 3D 环境,该环境在我的场景中连接两个具有特定几何形状的麦克风,并在本地运行。
我希望能够在正在使用的麦克风之间切换(当我按下 A 键时使用 mic1,当我按下 B 键时使用 mic 2)。
我得到的错误是:
Firefox ----> Error:NotReadableError: 并发麦克风进程限制。
Chrome -> 没有错误,它只是不切换设备
我该如何解决?我试图停止直播,但也许我做得不对,有什么建议吗?
async function openMic(nodein){
// inputDevices is an array with the deviceIds
await navigator.mediaDevices.getUserMedia ({audio: { deviceId: {exact:
inputDevices[nodein]}}, video: false})
.then(function(stream) {
console.log('THE DEVICE IS: '+ thisdev);
//soundNodesArray has objects that represent different sources
soundNodesArray[nodein].source=context.createMediaStreamSource(stream);
//making our source a stream connect source with Gain node
soundNodesArray[nodein].source.connect(soundNodesArray[nodein].volume);
//connect Gain node with Panner node
soundNodesArray[nodein].volume.connect(soundNodesArray[nodein].panner);
//connect the Panner Node with the Destination node
soundNodesArray[nodein].panner.connect(context.destination);
})
.catch(function(e){
alert('Error:'+e);
});
}
为了停止曲目,我首先调用了这个函数:
async function closeMic(nodeout) {
await navigator.mediaDevices.getUserMedia({audio: true, video: false})
.then(function(mediaStream) {
const tracks = mediaStream.getTracks();
tracks.forEach(function(track) {
track.stop();
console.log('STOPPED STREAM ?????????');
});
})
soundNodesArray[nodeout].source = null;
}
enter code here
在此处输入代码
await
... .then()
不正确。
要打开您的信息流,请执行以下操作。
let stream // keep the stream so you can stop it later.
async function openMic(nodein){
try {
// inputDevices is an array with the deviceIds
stream = await navigator.mediaDevices.getUserMedia (
{audio: { deviceId: {exact: inputDevices[nodein]}},
video: false})
//soundNodesArray has objects that represent different sources
soundNodesArray[nodein].source=context.createMediaStreamSource(stream)
...
} catch (e) {
alert('Error:' + e)
console.error(e)
}
}
后来,要停止流,停止所有曲目并忘记它的存在。不要使用 .getUserMedia()
试图让另一个流停止。而是停止你已经拥有的那个。
const tracks = stream.getTracks()
tracks.forEach(track => {track.stop()})
stream = undefined
我不熟悉 AudioContext 的东西;在开始新的流之前,您可能也必须停止那些东西。
最好先停止一个流,然后再使用 getUserMedia()
开始另一个流。某些浏览器允许您在停止另一个流之前启动一个流。其他人没有。
我正在开发一个 3D 环境,该环境在我的场景中连接两个具有特定几何形状的麦克风,并在本地运行。 我希望能够在正在使用的麦克风之间切换(当我按下 A 键时使用 mic1,当我按下 B 键时使用 mic 2)。 我得到的错误是: Firefox ----> Error:NotReadableError: 并发麦克风进程限制。 Chrome -> 没有错误,它只是不切换设备
我该如何解决?我试图停止直播,但也许我做得不对,有什么建议吗?
async function openMic(nodein){
// inputDevices is an array with the deviceIds
await navigator.mediaDevices.getUserMedia ({audio: { deviceId: {exact:
inputDevices[nodein]}}, video: false})
.then(function(stream) {
console.log('THE DEVICE IS: '+ thisdev);
//soundNodesArray has objects that represent different sources
soundNodesArray[nodein].source=context.createMediaStreamSource(stream);
//making our source a stream connect source with Gain node
soundNodesArray[nodein].source.connect(soundNodesArray[nodein].volume);
//connect Gain node with Panner node
soundNodesArray[nodein].volume.connect(soundNodesArray[nodein].panner);
//connect the Panner Node with the Destination node
soundNodesArray[nodein].panner.connect(context.destination);
})
.catch(function(e){
alert('Error:'+e);
});
}
为了停止曲目,我首先调用了这个函数:
async function closeMic(nodeout) {
await navigator.mediaDevices.getUserMedia({audio: true, video: false})
.then(function(mediaStream) {
const tracks = mediaStream.getTracks();
tracks.forEach(function(track) {
track.stop();
console.log('STOPPED STREAM ?????????');
});
})
soundNodesArray[nodeout].source = null;
}
enter code here
在此处输入代码
await
... .then()
不正确。
要打开您的信息流,请执行以下操作。
let stream // keep the stream so you can stop it later.
async function openMic(nodein){
try {
// inputDevices is an array with the deviceIds
stream = await navigator.mediaDevices.getUserMedia (
{audio: { deviceId: {exact: inputDevices[nodein]}},
video: false})
//soundNodesArray has objects that represent different sources
soundNodesArray[nodein].source=context.createMediaStreamSource(stream)
...
} catch (e) {
alert('Error:' + e)
console.error(e)
}
}
后来,要停止流,停止所有曲目并忘记它的存在。不要使用 .getUserMedia()
试图让另一个流停止。而是停止你已经拥有的那个。
const tracks = stream.getTracks()
tracks.forEach(track => {track.stop()})
stream = undefined
我不熟悉 AudioContext 的东西;在开始新的流之前,您可能也必须停止那些东西。
最好先停止一个流,然后再使用 getUserMedia()
开始另一个流。某些浏览器允许您在停止另一个流之前启动一个流。其他人没有。