React中实时绘制音频波形时数据不连贯怎么办?
在用React和Web Audio API画音频波形时,上传文件后波形显示总是断断续续的,调整过bufferSize也不行。比如这段代码:
function Waveform({ file }) {
const canvasRef = useRef();
useEffect(() => {
const ctx = canvasRef.current.getContext('2d');
const audioCtx = new AudioContext();
const source = audioCtx.createMediaElementSource(file);
const analyser = audioCtx.createAnalyser();
source.connect(analyser).connect(audioCtx.destination);
analyser.fftSize = 2048;
function draw() {
const data = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteTimeDomainData(data);
ctx.clearRect(0, 0, 512, 200);
// 这里绘制逻辑可能有问题
requestAnimationFrame(draw);
}
draw();
}, [file]);
return ;
}
试过把fftSize改小反而更卡,而且波形在播放时会突然跳帧。是不是时间戳没同步?或者canvas绘制的频率设置不对?
你现在的代码里有几个地方需要调整。首先,
requestAnimationFrame确实适合做动画更新,但你要确保每次绘制时把波形数据正确映射到canvas上。其次,fftSize设置为2048是可以的,不用改得太小,这样能保证频率分辨率。关键是你的绘制逻辑。你可以试试下面的代码:
注意几个点:
1. 绘制时要根据
dataArray的值计算出正确的坐标。2. 每次清空canvas后重新绘制整个波形。
3. 最后记得在组件卸载时关闭
AudioContext,不然会有内存泄漏。按照这个写法,波形应该就能平滑显示了。如果还有问题,可能是浏览器性能或者音频文件本身的问题,那就得另当别论了。