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

如何使用仅返回Promise的processOffline函数实现多音源同步播放?

解决processOffline返回Promise的同步播放问题

因为processOffline是异步离线音频处理函数,它的返回值是Promise——离线处理需要时间完成,所以必须等待所有Promise执行完毕、拿到处理后的音频数据后,才能实现三个音源的同步播放。具体处理方案如下:

1. 收集所有离线处理的Promise

如果已经将三个Promise存入FX.processors,先把它们提取出来:

// 假设你的三个音源标识符为id1、id2、id3
const allProcessorPromises = [
  FX.processors.id1,
  FX.processors.id2,
  FX.processors.id3
];

2. 等待所有处理完成并同步播放

使用Promise.all等待所有离线处理任务结束,拿到所有处理好的音频数据后,创建音频源节点并统一调度播放:

// 获取或创建常规音频上下文
const audioCtx = new AudioContext();

Promise.all(allProcessorPromises)
  .then((processedAudioBuffers) => {
    // 为每个处理好的音频buffer创建源节点
    processedAudioBuffers.forEach(buffer => {
      const sourceNode = audioCtx.createBufferSource();
      sourceNode.buffer = buffer;
      sourceNode.connect(audioCtx.destination);
      // 指定同一个播放起始时间,确保三个音源同步播放
      sourceNode.start(audioCtx.currentTime);
    });
  })
  .catch(error => {
    console.error('离线音频处理失败:', error);
  });

补充:初始化时同步存储并收集Promise

如果是在调用processOffline的阶段就存储Promise,可以同时收集,避免后续重复提取:

// 定义三个音源的配置参数
const audioOptions = {
  id1: { /* 音源1的配置 */ },
  id2: { /* 音源2的配置 */ },
  id3: { /* 音源3的配置 */ }
};

// 存储Promise到全局对象,并同时收集所有Promise
const allProcessorPromises = Object.keys(audioOptions).map(identifier => {
  const promise = processOffline(audioOptions[identifier]);
  FX.processors[identifier] = promise;
  return promise;
});

// 后续执行等待和播放逻辑(代码同步骤2)

内容的提问来源于stack exchange,提问作者Mike Johnson Jr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.07 20:12:31