1

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

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

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()在尝试切换音频设备之前运行,我通过调用switchAudioInputSource()ant_webtc_adaptor.js 文件来执行此操作:

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上试用它。

4

0 回答 0