我目前正在 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/