2

我正在尝试分析浏览器的音频输出,但我不希望出现 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 的所有文档,但找不到。感谢任何可以提供帮助的人!

4

1 回答 1

1

有多种方法可以获取源自 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方法时,这不是一项简单且普遍可行的任务。

于 2018-02-19T09:08:34.440 回答