首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AudioWorkletProcessor进行低延迟音频调度?

使用AudioWorkletProcessor进行低延迟音频调度?
EN

Stack Overflow用户
提问于 2020-06-21 22:47:27
回答 1查看 539关注 0票数 1

我有一个交互式音乐排序应用程序,使用以下设置:

  1. 用户在UI中进行更改,以操作音频节点图。
  2. 一个简单的WebWorker负责保持时间。它在一个固定的间隔内向主线程发送一个“刻度”消息。
  3. 主线程中的侦听器接收消息并执行歌曲中的下一步(使用AudioBufferSourceNode.start播放示例、调整卷参数等)。

在WebWorker中使用计时器比只使用setInterval更可靠,但是在主线程处理消息之前仍然会有延迟,从而导致音频故障。

似乎理想的解决方案是在WebWorker中执行第3步,但在工人不支持AudioContext中执行。因此,这使得AudioWorklet成为唯一的低延迟网络音频API。但是它是图中的一个节点,而我正在寻找一种管理整个事情的方法。除了重写整个系统以在AudioWorkletProcessor中运行(大量的工作)之外,是否有一种方法可以使用处理器进行精确的调度,但保留现有的图形结构?

EN

回答 1

Stack Overflow用户

发布于 2020-06-22 03:34:43

AudioContext有自己的时钟,使用它。

代码语言:javascript
复制
node1.start( ctx.currentTime + 1 ); // in one second
node2.start( ctx.currentTime + 2 ); // in two seconds
node3.start( ctx.currentTime + 3 ); // in three seconds
  • 如果要对前面的“缓冲区源”的结尾做出反应,请使用它的onended事件侦听器:
代码语言:javascript
复制
node.onended = (evt) => startANewNode();
  • 如果您想要一个并行计时器,可以使用一个setTimeout循环来纠正可能的漂移:
代码语言:javascript
复制
const duration = 1000;
let expected = ctx.currentTime + duration;
function loop() {
  const drift = expected - ctx.currentTime;
  startANewNode();
  setTimeout( loop, duration - drift );
}
setTimeout( loop, duration );

当然,你甚至可以结合所有这些点,一起创建你自己的计时器,完全基于AudioContext的时钟。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62505257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档