gpt4 book ai didi

javascript - 在 JS canvas 中绘制正弦波不执行任何操作

转载 作者:行者123 更新时间:2023-12-02 21:05:25 26 4
gpt4 key购买 nike

我编写了以下内容来从 AudioBuffer 绘制声波,但我得到的是带有水平直线的 Canvas :

const { audioContext, analyser } = this.getAudioContext();
const source = audioContext.createBufferSource();
source.buffer = audioBuffer;
source.connect(audioContext.destination);

const canvas = document.getElementById('canvas');
const canvasCtx = canvas.getContext("2d");

let sinewaveDataArray = new Uint8Array(analyser.fftSize);

const drawSinewave = function() {
analyser.getByteTimeDomainData(sinewaveDataArray);
requestAnimationFrame(drawSinewave);

canvasCtx.fillStyle = 'white';
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
canvasCtx.lineWidth = 2;
canvasCtx.strokeStyle = "black";
canvasCtx.beginPath();

const sliceWidth = canvas.width * 1.0 / analyser.fftSize;
let x = 0;

for(let i = 0; i < analyser.fftSize; i++) {
const v = sinewaveDataArray[i] / 128.0; // byte / 2 || 256 / 2
const y = v * canvas.height / 2;

if(i === 0) {
canvasCtx.moveTo(x, y);
} else {
canvasCtx.lineTo(x, y);
}
x += sliceWidth;
}

canvasCtx.lineTo(canvas.width, canvas.height / 2);
canvasCtx.stroke();
};

source.start();

drawSinewave();

getAudioContext = () => {
AudioContext = window.AudioContext || window.webkitAudioContext;
const audioContext = new AudioContext();
const analyser = audioContext.createAnalyser();

return { audioContext, analyser };
};

我正在寻找的最终结果类似于此处的第一个图像剪辑:https://meyda.js.org/

知道我缺少什么吗?

最佳答案

我认为需要进行两个小改变才能使其发挥作用。

source.start() 需要执行以响应用户事件。可以使用带有单击处理程序的简单按钮来实现此目的。这对于处理某些浏览器中存在的自动播放策略是必要的。

aReferenceToAButton.addEventListener('click', async () => {
await audioContext.resume();
source.start();
});

最后但并非最不重要的一点是,您需要通过 AnalyserNode 传输信号。

source
.connect(analyser)
.connect(audioContext.destination);

我希望这会有所帮助。

关于javascript - 在 JS canvas 中绘制正弦波不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61238244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com