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

问题描述:

我目前正在使用Chrome(60.0.3112.90)中的Web Audio API来通过FilerReader,AudioContext来构建给定文件的声音波,createScriptProcessor和createAnalyser。我有以下代码:Web Audio API getFloatFrequencyData函数将Float32Array参数数据设置为-Infinity值的数组

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的无知,但我的问题是为什么这两个包含大声音的文件都给我一个表示无声样本的数组?

+0

您使用的是Chrome吗? –

+0

不完全清楚你想做什么 - 但是我没有看到你真的调用了audiobuffersource的start(),除非它在iHateMyselfForThis.recordAudio(audioCtx,analyzer)中? – cwilso

+0

@RaymondToy是的,我已更新我的问题与该信息 – antihero989

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

+0

没有任何方法可以使用Web Audio API为歌曲文件本身创建整首歌曲的声波表示?我见过多个项目,例如https://wavesurfer-js.org/,它们似乎已经掌握了某种技术,可以在视觉上渲染声音文件的声波。 – antihero989

+0

不,你完全可以使用网络音频来建立整个文件的表示 - 通过OfflineAudioContext - 但你不能使用分析仪。 – cwilso