我在尝试使用Web Audio API并寻找一种导入mp3文件的方法(因此仅适用于Chrome),并在画布上生成其波形。我可以实时完成这个过程,但我的目标是要比实时更快地完成。
我能找到的所有示例都涉及从分析器对象中读取频率数据,在附加到onaudioprocess事件的函数内部进行:
processor = context.createJavascriptNode(2048,1,1);
processor.onaudioprocess = processAudio;
...
function processAudio{
var freqByteData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(freqByteData);
//calculate magnitude & render to canvas
}
看起来,analyser.frequencyBinCount
仅在声音播放时才会填充(大概是缓冲区被填满了的原因)。
我想要的是能够手动/编程快速地遍历文件,以生成画布图像。
到目前为止,我已经得到了以下代码:
$("#files").on('change',function(e){
var FileList = e.target.files,
Reader = new FileReader();
var File = FileList[0];
Reader.onload = (function(theFile){
return function(e){
context.decodeAudioData(e.target.result,function(buffer){
source.buffer = buffer;
source.connect(analyser);
analyser.connect(jsNode);
var freqData = new Uint8Array(buffer.getChannelData(0));
console.dir(analyser);
console.dir(jsNode);
jsNode.connect(context.destination);
//source.noteOn(0);
});
};
})(File);
Reader.readAsArrayBuffer(File);
});
但是getChannelData()始终返回一个空的类型数组。
非常感谢任何建议 - 即使最终发现这无法完成。 我想我是互联网上唯一一个不想实时处理数据的人了。
谢谢。
Uint8Array
的方法不正确。可以在这里查看一个可行的解决方案:https://github.com/katspaugh/wavesurfer.js/blob/master/src/webaudio.js。 - katspaugh