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

标签 javascript audio filereader web-audio-api

我目前正在 Chrome (60.0.3112.90) 中使用 Web Audio 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);
}

加载文件后,我会一直到达analysisr.getFloatFrequencyData(data)。阅读Web音频API文档后,它说参数是:

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

就我而言,我有一个 mp3 和 wav 文件来测试它,在调用 analysisr.getFloatFrequency(data) 后,这两个文件最终都会给我data 成为“-Infinity”值的数组。

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

最佳答案

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

关于javascript - Web Audio API getFloatFrequencyData 函数将 Float32Array 参数数据设置为 -Infinity 值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45697898/

相关文章:

javascript - FileReader 无法正确读取文件

java - java中跳过空格

html - 降低使用 recorderjs 创建的 WAV 文件的比特率

音频/摄像头驱动程序 - FriendlyARM Mini2440 - s3c2440

javascript - jQuery 音频播放器

javascript - 从三个数组创建对象

python - python读取多个文件

javascript - 在javascript中,如何在没有JQuery的情况下以编程方式单击链接,以防href ="javascript:someMethod()"

javascript - Webgl 将颜色变量传递给着色器

java - 有没有办法获取浏览器生成的 HTML 和 CSS