在运行AudioContext脚本处理器时如何更改WebRTC发布流的音频设备?

问题描述

就本示例而言,我正在使用来自Ant Media Server应用程序的基本发布HTML / js代码(请参见https://github.com/ant-media/StreamApp/blob/master/src/main/webapp/index.html)。 (注意-我实际上是在WebRTC中使用企业版)

在该代码之上,我正在创建一个脚本处理器以在AudioContext上运行,以显示麦克风级别的VU表(简化发布的代码):

function startVUMeters() {
  navigator.mediaDevices.getUserMedia({audio: true,video: true}).then(function (stream) {
    window.vuMeteraudioContext = new AudioContext();
    window.vuMeteranalyser = vuMeteraudioContext.createAnalyser();
    window.vuMeterMicrophone = vuMeteraudioContext.createmediastreamsource(stream);
    window.vuMeteraudioscriptprocessor = vuMeteraudioContext.createscriptprocessor(2048,1,1);
  
    window.vuMeterMicrophone.connect(vuMeteranalyser);
    window.vuMeteranalyser.connect(vuMeteraudioscriptprocessor);
    window.vuMeteraudioscriptprocessor.connect(vuMeteraudioContext.destination);
    window.vuMeteraudioscriptprocessor.onaudioprocess = function () {
        // Calculate the microphone levels and update the meter
    };
  });
}

function stopVUMeters() {
  window.vuMeterMicrophone.disconnect();
  window.vuMeteranalyser.disconnect();
  window.vuMeteraudioscriptprocessor.disconnect();
  window.vuMeteraudioContext.close();
  window.vuMeterMicrophone = null;
  window.vuMeteranalyser = null;
  window.vuMeteraudioscriptprocessor = null;
  window.vuMeteraudioContext = null;
}

用户尝试切换设备时,我先运行stopVUMeters(),然后再尝试切换音频设备,这是通过从ant_webtc_adaptor.js文件调用switchAudioInputSource()进行的:

this.switchAudioInputSource = function(streamId,deviceid) {
    //stop the track because in some android devices need to close the current camera stream
    var audioTrack = thiz.localStream.getAudioTracks()[0];
    if (audioTrack) {
        audioTrack.stop();
    }
    else {
       console.warn("There is no audio track in local stream");
    }

    if (typeof deviceid != "undefined" ) {
        thiz.mediaConstraints.audio = { "deviceid": deviceid };
    }
    thiz.setAudioInputSource(streamId,thiz.mediaConstraints,null,true,deviceid);
}

但是,当我进行切换时,它无法告诉我另一台设备正在使用麦克风。

如果我根本不启动VU表,那么它工作正常,所以我认为问题在于我的AudioContext没有释放它在音频上的控制权,但是我不知道如何解决这个问题。我需要在iOS上支持Safari,所以还不能使用audioworklets。

如何清洁释放音频,以便可以切换音频设备?另外,是否有一种方法可以从WebRTC流中获取麦克风活动,而无需首先创建新的AudioContext?

编辑

我一直在尝试更多。在Firefox(Mac)中会发生此问题。在Chrome(Mac)上,我可以切换设备,但是Audiocontext保留在认(我认为)设备上(或者设备切换无法正常工作,我也要检查一下)。在Safari中可以正常使用。我还不能在PC上尝试它。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)