Web Audio API getFloatFrequencyData 函数将 Float32Array 参数数据设置为 -Infinity 值数组

Web Audio API getFloatFrequencyData function setting Float32Array argument data to array of -Infinity values

我目前正在使用 Chrome (60.0.3112.90) 中的网络音频 API,可能会通过 FilerReader、AudioContext、createScriptProcessor 和 createAnalyser 构建给定文件的声波.我有以下代码:

const visualize = analyser => {
  analyser.fftSize = 256;
  let bufferLength = analyser.frequencyBinCount;
  let dataArray = new Float32Array(bufferLength);
  analyser.getFloatFrequencyData(dataArray);
}    

loadAudio(file){
  // creating FileReader to convert audio file to an ArrayBuffer
  const fileReader = new FileReader();

  navigator.getUserMedia = (navigator.getUserMedia ||
                      navigator.webkitGetUserMedia ||
                      navigator.mozGetUserMedia ||
                      navigator.msGetUserMedia);

  fileReader.addEventListener('loadend', () => {
    const fileArrayBuffer = fileReader.result;

    let audioCtx = new (window.AudioContext || window.webkitAudioContext)();
    let processor = audioCtx.createScriptProcessor(4096, 1, 1);
    let analyser = audioCtx.createAnalyser();

    analyser.connect(processor);
    let data = new Float32Array(analyser.frequencyBinCount);

    let soundBuffer;
    let soundSource = audioCtx.createBufferSource();

    // loading audio track into buffer
    audioCtx.decodeAudioData( 
      fileArrayBuffer, 
      buffer => {
        soundBuffer = buffer;
        soundSource.buffer = soundBuffer;

        soundSource.connect(analyser);
        soundSource.connect(audioCtx.destination);

        processor.onaudioprocess = () => {
          // data becomes array of -Infinity values after call below
          analyser.getFloatFrequencyData(data);
        };

        visuaulize(analyser);
      },
      error => 'error with decoding audio data: ' + error.err
    );
  });

  fileReader.readAsArrayBuffer(file);
}

加载文件后,我一直到 analyser.getFloatFrequencyData(data)。在阅读网络音频 API 文档时,它说参数是:

The Float32Array that the frequency domain data will be copied to. 
For any sample which is silent, the value is -Infinity.

在我的例子中,我有一个 mp3 和 wav 文件,我用它来测试这个,在调用 analyser.getFloatFrequency(data) 之后,这两个文件最终都给了我 data,它变成了一个数组-Infinity 的值。

这可能是由于我对 Web Audio 的无知 API,但我的问题是为什么这两个包含响亮音频的文件都给我一个代表无声样本的数组?

Web Audio AnalyserNode 仅设计用于实时工作。 (它曾经被称为 RealtimeAnalyser。)Web Audio 没有对缓冲区进行分析的能力;看看另一个库,比如 DSP.js.

而不是:

soundSource.connect(analyser);
soundSource.connect(audioCtx.destination);

尝试:

soundSource.connect(analyser);
analyser.connect(audioCtx.destination);

意识到我会做一个源==>分析器==>>当我遇到这个问题时,目标链解决了这个问题。