没有getUserMedia的声音分析

时间:2018-02-19 08:33:09

标签: javascript audio web-audio-api mediastream audio-analysis

我正在尝试分析浏览器的音频输出,但我不希望出现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);
  });
})

我在浏览器中获得了可用设备的列表,包括'audiooutput'。 那么,有没有办法在媒体流中路由音频输出,然后可以在'createMediaStreamSource'函数中使用? 我已经检查了音频API的所有文档,但找不到它。 感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分: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方法时,这不是一项简单易行,也不是普遍可行的任务。