【发布时间】:2011-11-10 02:00:14
【问题描述】:
我正在使用 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() 总是返回一个空类型数组。
感谢任何见解 - 即使事实证明它无法完成。我想我是互联网上唯一不想要实时做事的人。
谢谢。
【问题讨论】:
-
ya - 比实时更快。如,如果轨道的持续时间是 5 分钟,我不想等待 5 分钟来生成波形。我想尽快处理它(希望是几秒钟)
-
@Pickle,你填错了
Uint8Array。查看工作解决方案here。
标签: javascript html webkit web-audio-api