You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:10:22