我正在尝试分析浏览器的音频输出,但我不想出现 getUserMedia 提示(要求麦克风许可)。 声源是 SpeechSynthesis 和一个 Mp3 文件。 这是我的代码:
return navigator.mediaDevices.getUserMedia({
audio: true
})
.then(stream => new Promise(resolve => {
const track = stream.getAudioTracks()[0];
this.mediaStream_.addTrack(track);
this._source = this.audioContext.createMediaStreamSource(this.mediaStream_);
this._source.connect(this.analyser);
this.draw(this);
}));
此代码工作正常,但它正在请求使用麦克风的权限!我对麦克风一点都不感兴趣,我只需要测量音频输出。如果我检查所有可用设备:
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
});
})
我在浏览器中获得了可用设备的列表,包括“音频输出”。 那么,有没有办法在媒体流中路由音频输出,然后可以在“createMediaStreamSource”函数中使用? 我已经检查了音频 API 的所有文档,但找不到它。 感谢任何可以提供帮助的人!
最佳答案
有多种方法可以获取源自 gUM 的 MediaStream,但您无法捕获所有可能的音频输出...
但是,对于您的 mp3 文件,如果您通过 MediaElement(<audio>
或 <video>
)读取它,并且如果在不破坏 CORS 的情况下提供此文件,则您可以使用 MediaElement.captureStream
。
如果您从 WebAudioAPI 读取它,或者如果您的目标浏览器不支持 captureStream
,那么您可以使用 AudioContext.createMediaStreamDestination 。
对于 SpeechSynthesis,不幸的是你需要 gUM... 和一个虚拟音频设备:首先你必须将默认输出设置为 VAB_out,然后将你的 VAB_out 路由到 VAB_in 最后从 gUM 获取 VAB_in...
这不是一项简单且普遍可行的任务,而且当 IIRC SpeechSynthesis 没有任何 setSinkId 方法时。
关于javascript - 没有 getUserMedia 的声音分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862115/