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

p5.SoundRecorder录制Tone.js音频生成无声文件问题求助

解决p5.SoundRecorder无法录制Tone.js音频的问题

问题核心在于p5.SoundRecorder默认仅监听p5.sound自身的音频上下文,而Tone.js默认使用独立的Web Audio上下文运行,导致两者的音频流不互通,最终录制出无声文件(时长正确是因为Recorder记录了时间轴,但没有捕获到音频数据)。

解决步骤:

  • 让Tone.js共享p5.sound的音频上下文,确保音频流能被p5.SoundRecorder捕获:
    在初始化Tone相关组件之前,添加一行代码:

    Tone.context = getAudioContext();
    

    这会强制Tone使用p5的音频上下文,所有Tone生成的音频都会流入p5的音频管道,被Recorder捕捉到。

  • 确保音频上下文被正确激活:
    浏览器有自动播放限制,需要用户交互(比如点击画布)才能启动音频上下文。可以在setup()里补充:

    function setup() {
      createCanvas(400, 400);
      // 激活p5音频上下文
      getAudioContext().resume();
      // 绑定点击事件确保上下文激活(可选但更稳妥)
      canvas.mousePressed(() => getAudioContext().resume());
      // 让Tone共享p5上下文
      Tone.context = getAudioContext();
      // 初始化Recorder和SoundFile
      recorder = new p5.SoundRecorder();
      soundFile = new p5.SoundFile();
    }
    
  • 启动与停止录制:
    在控制台执行recorder.record(soundFile);开始录制,完成后执行recorder.stop(); save(soundFile, 'soundASK.wav');即可得到带音频内容的文件。

替代方案(如果无法修改Tone初始化逻辑):

如果已经初始化了Tone,可以将Tone的主输出连接到p5音频上下文的目标节点:

Tone.Master.connect(getAudioContext().destination);

这种方式也能让Tone的音频流入p5的音频管道,被Recorder捕获。

内容的提问来源于stack exchange,提问作者ASKproduKtion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:17:15