рендеринге кода крайне неэффективен, поскольку она будет оказывать 44100 пикселей для каждую секунду аудио. Вы хотите, в лучшем случае, увеличить ширину видового экрана с уменьшенным набором данных.
Диапазон выборки на пиксель, необходимый для соответствия форме сигнала в окне просмотра, может быть рассчитан с помощью audioDurationSeconds * samplerate/viewPortWidthPx. Таким образом, для видового экрана 1000 пикселей и аудиофайла в 2 секунды при 44100 сэмплерируйте выборки на пиксель = (2 * 44100)/1000 = ~ 88. Для каждого пикселя на экране вы берете минимальное и максимальное значение из этого диапазона выборки, вы используете эти данные для рисования формы волны.
Вот пример алгоритма, который делает это, но позволяет вам давать образцы на пиксель в качестве аргумента, а также позицию прокрутки, чтобы разрешить виртуальную прокрутку и масштабирование. Она включает в себя параметр разрешения можно настроить для работы, это указывает на то, сколько образцов она должна принимать в пределах выборки пикселей: Drawing zoomable audio waveform timeline in Javascript
Метод Жеребьевка есть схожие с вашими, чтобы сгладить его, вы должны использовать LineTo вместо of fillRect.Это отличие не должно быть настолько огромным, я думаю, вы можете забыть установить атрибуты width и height на холсте. Установка этого параметра в css вызывает размытие рисунка, вам нужно установить атрибуты.
let drawWaveform = function(canvas, drawData, width, height) {
let ctx = canvas.getContext('2d');
let drawHeight = height/2;
// clear canvas incase there is already something drawn
ctx.clearRect(0, 0, width, height);
ctx.beginPath();
ctx.moveTo(0, drawHeight);
for(let i = 0; i < width; i++) {
// transform data points to pixel height and move to centre
let minPixel = drawData[i][0] * drawHeigth + drawHeight;
ctx.lineTo(i, minPixel);
}
ctx.lineTo(width, drawHeight);
ctx.moveTo(0, drawHeight);
for(let i = 0; i < width; i++) {
// transform data points to pixel height and move to centre
let maxPixel = drawData[i][1] * drawHeigth + drawHeight;
ctx.lineTo(i, maxPixel);
}
ctx.lineTo(width, drawHeight);
ctx.closePath();
ctx.fill(); // can do ctx.stroke() for an outline of the waveform
}
Возможно, это отправная точка: http://www.storiesinflight.com/jsfft/visualizer/index.html – Mika
@ Мика, он звонит в далекий демо-звонок. – katspaugh
Это по теме: http://softwarerecs.stackexchange.com/ – kenorb