Angular web-app microphone switching causes error `NotReadableError: Concurrent mic process limit`

Angular web-app microphone switching causes error `NotReadableError: Concurrent mic process limit`

我正在尝试实现麦克风切换功能,在浏览器上进行实时通话时,我可以用新麦克风替换当前使用中的麦克风。

在选择了我想要更改的新麦克风后,我收到一条 NotReadableError: Concurrent mic process limit. 错误消息。此错误消息只能在 firefox 上复制,在 chromium 浏览器上不会显示任何错误,但是无法切换到另一个麦克风的问题仍然存在。

这是因为在添加新设备之前之前的设备不是 deactivated/destroyed,这可以从此处的权限图标中看到:

旧麦克风仍处于活动状态,因此在允许新设备时我收到并发麦克风进程限制错误。

我正在使用 replaceTrack() 切换到新选择的设备,并且在选择要激活的新麦克风时运行以下函数。

async onMicrophoneSelected(event: any) {

// selectedDeviceId holds the deviceId of the microphone i want to switch to

        const selectedDeviceId = event?.value;

        var newAudioTrack;
        var constraints;
        var mediaStream: MediaStream;
        var audioTrack: MediaStreamTrack;

// Looping through all available devices here 

        await navigator.mediaDevices.enumerateDevices().then((res) => {
            res.forEach((device) => {

                // Here checking if the available device is an audioinput and if its id matches the one which we want to swap to.

                if (device.kind === 'audioinput' && device.deviceId === selectedDeviceId) {
                    newAudioTrack = device;

                    // constraints specified here with new deviceId of microphone

                    constraints = {
                        video: { facingMode: 'user' },
                        audio: { deviceId: { exact: newAudioTrack['deviceId'] } },
                    };

                }
            });
        });     

        // Passing constraints into mediaStream

        mediaStream = await navigator.mediaDevices.getUserMedia(constraints);
        audioTrack = mediaStream.getVideoTracks()[0];

        // Custom replaceTrack() function here 

        this.localUsersService
            .getWebcamPublisher()
            .replaceTrack(audioTrack)
            .then(() => {
                this.publishAudio(true);
                this.hasAudioDevices = true;
            });
    }

如何才能在切换到新的麦克风和摄像头权限集之前完全停用之前的麦克风/摄像头?

正如您已经提到的,这是 Firefox 中的一个限制,目前正在处理中。

https://bugzilla.mozilla.org/show_bug.cgi?id=1238038

您可以在请求另一个流之前停止当前流,方法是在其所有曲目上调用停止。

mediaStream.getTracks().forEach((track) => track.stop());