出于本示例的目的,我使用来自 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上试用它。