Javascript Web音频API getFloatFrequencyData函数将Float32Array参数数据设置为无穷大值数组

Javascript Web音频API getFloatFrequencyData函数将Float32Array参数数据设置为无穷大值数组,javascript,audio,filereader,web-audio-api,Javascript,Audio,Filereader,Web Audio Api,我目前正在使用Chrome(60.0.3112.90)中的Web音频API,可能通过FilerReader、AudioContext、createScriptProcessor和CreateAnalyzer构建给定文件的声波。我有以下代码: const visualize = analyser => { analyser.fftSize = 256; let bufferLength = analyser.frequencyBinCount; let dataArray = n

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

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);
}
加载一个文件后,我会一直到analyzer.getFloatFrequencyData(data)。阅读Web audio API文档时,表示参数为:

The Float32Array that the frequency domain data will be copied to. 
For any sample which is silent, the value is -Infinity.
在我的例子中,我使用一个mp3和wav文件来测试这一点,在调用
analyzer.getFloatFrequency(data)
之后,这两个文件最终都给了我
数据
,它变成了一个“无限”值的数组


这可能是因为我不了解Web Audio的API,但我的问题是,为什么这两个文件都包含响亮的音频,给了我一个表示静默样本的数组?

Web Audio AnalyzerNode仅设计为实时工作。(它过去被称为RealtimeAnalyzer。)网络音频不具备对缓冲区进行分析的能力;看看另一个库,如。

Web音频分析器节点仅设计用于实时工作。(它过去被称为RealtimeAnalyzer。)网络音频不具备对缓冲区进行分析的能力;查看另一个库,例如。

,而不是:

soundSource.connect(analyser);
soundSource.connect(audioCtx.destination);
尝试:

意识到我应该做一个源==>分析==>>目标链解决了我遇到的这个问题。

而不是:

soundSource.connect(analyser);
soundSource.connect(audioCtx.destination);
尝试:


意识到我应该做一个source==>Anllalsyser==>>目标链解决了我遇到的这个问题。

你在使用Chrome吗?不完全清楚你想做什么-但我看不到你实际上在audiobuffersource上调用start(),除非它在iHateMyselfForThis.recordAudio(audioCtx,Analyzer)中。@RaymondToy是,我已经用这个更新了我的问题information@cwilso我已经修改了代码,在有状态react组件中使用时省略了设置上下文。如您所见,我没有调用start()。我试图在不播放文件本身的情况下获得频率(如果可能的话。如果你不启动供给分析仪的源,你认为分析仪将如何对非零样本进行分析?你使用的是Chrome吗?不完全清楚你想做什么-但我看不到你实际调用start()在audiobuffersource上,除非它在iHateMyselfForThis.recordAudio(audioCtx,Analyzer)中?@RaymondToy是的,我已经用它更新了我的问题information@cwilso我修改了代码,在有状态的react组件中使用时省略了设置上下文.我试图在不播放文件的情况下获得频率(如果可能的话。如果你没有实际启动供给分析仪的源,你认为分析仪将如何分析非零样本?鉴于歌曲文件本身,没有任何方法可以使用Web Audio api来构建整首歌曲的声波表示法?我见过多个项目,例如似乎已经掌握了某种技术的项目一种允许以可视方式呈现声音文件声波的技术。不,您完全可以使用Web音频通过OfflineAudioContext构建整个文件的表示,但不能在其上使用分析器。鉴于歌曲文件本身,没有任何方法可以使用Web音频api构建整个歌曲的声波表示?我看过多个项目,例如,它们似乎已经掌握了某种技术,可以直观地呈现声音文件的声波。不,您完全可以使用Web音频通过OfflineAudioContext构建整个文件的表示,但不能在其上使用分析器。