bạn mã render là cực kỳ không hiệu quả bởi vì nó sẽ làm cho 44.100 pixel cho mỗi giây của âm thanh. Bạn muốn tốt nhất hiển thị tối đa chiều rộng khung nhìn với tập dữ liệu đã giảm.
Phạm vi mẫu trên mỗi pixel cần thiết để phù hợp với dạng sóng trong chế độ xem có thể được tính bằng audioDurationSeconds * samplerate/viewPortWidthPx. Vì vậy, đối với một khung nhìn 1000px và một tệp âm thanh của 2 giây tại 44100 lấy mẫu các mẫu trên mỗi pixel = (2 * 44100)/1000 = ~ 88. Đối với mỗi pixel trên màn hình, bạn lấy giá trị nhỏ nhất và tối đa từ phạm vi mẫu đó, bạn sử dụng dữ liệu này để vẽ dạng sóng.
Dưới đây là một thuật toán ví dụ thực hiện điều này nhưng cho phép bạn cung cấp mẫu cho mỗi pixel làm đối số cũng như vị trí cuộn để cho phép cuộn và thu phóng ảo. Nó bao gồm thông số phân giải mà bạn có thể tinh chỉnh cho hiệu suất, điều này cho biết số lượng mẫu cần lấy cho mỗi phạm vi mẫu pixel: Drawing zoomable audio waveform timeline in Javascript
Phương pháp vẽ tương tự như phương pháp vẽ của bạn, để làm mịn nó, bạn cần sử dụng lineTo của fillRect. Sự khác biệt này không thực sự lớn đến vậy, tôi nghĩ bạn có thể quên đặt thuộc tính chiều rộng và chiều cao trên canvas. Thiết lập điều này trong nguyên nhân css cho bản vẽ mờ, bạn cần phải thiết lập các thuộc tính.
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
}
Nguồn
2017-11-17 17:39:45
Có thể đây là điểm bắt đầu: http://www.storiesinflight.com/jsfft/visualizer/index.html – Mika
@Mika, nó đổ chuông báo ở xa. – katspaugh
Đây là chủ đề tại: http://softwarerecs.stackexchange.com/ – kenorb