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() 开始另一个流。某些浏览器允许您在停止另一个流之前启动一个流。其他人没有。