Su rendir código es extremadamente ineficiente, ya que hará que 44100 píxeles para cada segundo de audio. Desea representar de preferencia a lo sumo el ancho de la ventana gráfica con un conjunto reducido de datos.
El rango de muestra por píxel necesario para ajustar la forma de onda en la ventana gráfica se puede calcular con audioDurationSeconds * samplerate/viewPortWidthPx. Entonces para una ventana gráfica de 1000px y un archivo de audio de 2 segundos a 44100 samplerate las muestras por píxel = (2 * 44100)/1000 = ~ 88. Para cada píxel en la pantalla se toma el valor mínimo y máximo de ese rango de muestra, se usan estos datos para dibujar la forma de onda.
Aquí hay un algoritmo de ejemplo que hace esto pero que le permite dar las muestras por píxel como argumento, así como una posición de desplazamiento para permitir el desplazamiento y el acercamiento virtual. Incluye un parámetro de resolución se puede ajustar para el rendimiento, esto indica cuántas muestras se deben tomar muestrario de píxeles: Drawing zoomable audio waveform timeline in Javascript
El método de sorteo no es similar a la suya, con el fin de suavizarlo es necesario utilizar lineTo vez de fillRect.Esta diferencia en realidad no debería ser tan grande, creo que quizás te olvides de establecer los atributos de ancho y alto en el lienzo. Al establecer esto en css causa un dibujo borroso, debe establecer los atributos.
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
}
Quizás este es un punto de partida: http://www.storiesinflight.com/jsfft/visualizer/index.html – Mika
@Mika, suena una campana de demostración distante. – katspaugh
Esto está en el tema en: http://softwarerecs.stackexchange.com/ – kenorb