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

如何在Next.js v12(Pages路由)的Tone.js中停止所有音频并重置时间线时钟?

在Tone.js中停止所有音频组件并重置时钟的实现方案

Tone.js没有提供单一命令直接完成“停止所有音频组件+重置时间线时钟”的操作,但可以通过组合几个核心API实现需求,适配Next.js v12 Pages路由的动态导入场景:

核心实现步骤

  • 停止并重置时间线传输器:
    • Tone.Transport.stop():立即停止时间线调度
    • Tone.Transport.cancel():取消所有已调度的未来事件
    • Tone.Transport.position = 0:将时间线位置重置为0
  • 终止所有活跃音频源:
    通过音频上下文获取所有活跃的音频源(振荡器、播放器等)并逐一停止:
    Tone.context.activeSources.forEach(source => {
      if (source.stop) source.stop();
    });
    
  • 同步重置音频上下文时钟:
    确保音频上下文的时间与Tone.js时间线对齐:
    await Tone.context.resume();
    Tone.context.currentTime = 0;
    

完整重置函数示例

const resetToneAudio = async () => {
  // 停止并重置Transport
  Tone.Transport.stop();
  Tone.Transport.cancel();
  Tone.Transport.position = 0;

  // 停止所有活跃音频源
  Tone.context.activeSources.forEach(source => {
    if (typeof source.stop === 'function') {
      source.stop();
    }
  });

  // 重置音频上下文时间
  await Tone.context.resume();
  Tone.context.currentTime = 0;
};

Next.js动态导入适配注意事项

在Pages路由中动态导入Tone.js时,需关闭SSR确保仅在客户端加载:

import dynamic from 'next/dynamic';

const Tone = dynamic(() => import('tone'), {
  ssr: false,
  loading: () => null,
});

调用重置函数前,要确保Tone已完成初始化(可在useEffect中执行初始化逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:57:51