Я играю с API Web Audio и пытаюсь найти способ импортировать 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 () всегда возвращает пустой типизированный массив.
Любое понимание ценится - даже если оказывается, что это невозможно. Я думаю, что я единственный, кто в Интернете не хочет делать вещи в режиме реального времени.
Спасибо.