我正在尝试分析浏览器的音频输出,但是我不希望出现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方法时,这不是一件容易的事情,也不是普遍可行的任务。

10-08 07:24