p5.js音频可视化画布残留轨迹求助:基于Meyda ZCR调整图形尺寸
问题解决
1. 画布残留旧轨迹的解决
draw函数会以60帧/秒持续执行,每次绘制新图形前未清除画布,导致旧图形残留。只需在draw函数开头添加背景绘制代码:
function draw() { background(180); // 清除画布,覆盖上一帧内容 rectMode(RADIUS); rect(80,300, 80, rectH); console.log(rectH); }
2. ZCR值变化但图形无明显刷新的解决
原因分析
- ZCR(过零率)的取值范围是
0到bufferSize/2(你的bufferSize设为512,最大值为256),直接作为矩形高度的话,变化幅度在画布上可能不明显; - 可能未启动Meyda分析器,导致ZCR值一直为初始的0。
修复步骤
步骤1:映射ZCR值到合适高度范围
用p5的map()函数将ZCR值映射到画布可见的高度区间(比如0到300),让变化更直观:
function draw() { background(180); rectMode(RADIUS); // 将ZCR值从[0,256]映射到[0,300]的高度范围 let displayHeight = map(rectH, 0, 256, 0, 300); rect(80, 300, 80, displayHeight); console.log(rectH); }
步骤2:确保Meyda分析器正确启停
在playStopSound函数中添加分析器的启停逻辑,保证音频播放时才计算ZCR:
function playStopSound() { if (mySound.isPlaying()) { mySound.stop(); analyzer.stop(); // 停止音频分析 playStopButton.html('play'); } else { mySound.play(); analyzer.start(); // 启动ZCR分析 playStopButton.html('stop'); } }
步骤3:补充音频加载逻辑(如果缺失)
确保音频文件已提前加载,添加preload函数:
function preload() { mySound = loadSound('your-audio-file.mp3'); // 替换为你的音频文件路径 }
完整修改后的代码示例
let mySound; let playStopButton; let analyzer; let rectH = 0; function preload() { mySound = loadSound('your-audio-file.mp3'); } function setup() { createCanvas(800,600); background(180); playStopButton = createButton('play'); playStopButton.position(20, 20); playStopButton.mousePressed(playStopSound); if (typeof Meyda === "undefined"){ console.log("meyda could not be found"); } else { analyzer = Meyda.createMeydaAnalyzer({ "audioContext": getAudioContext(), "source": mySound, "bufferSize": 512, "featureExtractors": ["zcr"], "callback": features => { rectH = features.zcr; } }); } } function draw() { background(180); rectMode(RADIUS); let displayHeight = map(rectH, 0, 256, 0, 300); rect(80, 300, 80, displayHeight); } function playStopSound() { if (mySound.isPlaying()) { mySound.stop(); analyzer.stop(); playStopButton.html('play'); } else { mySound.play(); analyzer.start(); playStopButton.html('stop'); } }
内容的提问来源于stack exchange,提问作者JieudenCuben
相关产品推荐
相关产品推荐

