8

我目前正在为音乐家开发一个基于网络的协作录音平台,类似于移植到网络的基本 DAW(具有额外的社交/共享功能)。无论如何,我的目标是让它 100% 无闪存,所以我已经阅读了很多关于 HTML5 的内容,特别是 Web Audio API(本书帮助很大,顺便说一句)。

为了从用户的麦克风录制音频,我使用 getUserMedia() 制作了一个自定义版本的RecorderJS。简而言之,我将 getUserMedia() 的输出路由到 ScriptProcessorNode,该 ScriptProcessorNode 每隔 4096 个样本将 inputBuffer 的内容写入一个数组,该数组稍后会导出到一个 PCM WAV 文件。到目前为止,它工作正常。

问题是录制过程的开始涉及两件事:播放所有先前录制的音轨,因此音乐家有一个可以在其上播放的引用,以及开始实际录制(即,将缓冲区写入数组)。

虽然在用户录制时麦克风的声音没有可听的延迟或延迟,但当录制结束并播放所有音轨时,新录制的音轨会有轻微的延迟。

这可能是什么原因造成的?有哪些可能的解决方案?

我想我可以通过将播放发送到同一个处理器节点然后找出它们实际开始的时间来找到两个事件之间的时间差,以补偿任何延迟。为此,我需要让 ScriptProcessorNode 在通道 1 和 2 上接收例如 getUserMedia 内容,并在通道 3 和 4 上播放,但我无法完成这项工作。我尝试将这两个源路由到处理器节点,也尝试使用合并/拆分器,但似乎没有任何效果。它们都在通道 1 和 2 上到达处理器节点,而通道 3 和 4 则为空。

抱歉,如果这是题外话或不包含实际代码(如有必要,我很乐意提供),但在这方面没有做太多的事情,所以任何想法都会受到欢迎。

提前致谢!

4

2 回答 2

2

您可以查看Audacity 如何进行延迟校正并从中汲取灵感。

基本上,您输出一个声音(例如点击音轨)并同时录制它,以便查看播放和录制声音需要多少毫秒。

此时间量是您需要在播放时补偿的延迟。

换句话说,在您录制曲目后,您需要将曲目移动到您需要补偿的延迟量,以便它将与之前录制的曲目同步播放。

每个系统都有自己的延迟,因此您不能只测量一次。您需要在程序中添加一个功能,以允许用户以最简单的方式进行延迟校准。

现有软件延迟校准的两个示例:

于 2016-08-09T10:44:08.847 回答
0

我正在尝试做同样的事情 - HTML5 多轨录音机。启用 webkit 的东西还没有准备好迎接黄金时段。Recorder.js 非常有前途。http://carolwith.me是一个基于 Flash 的多轨录音机,它完全符合我的要求(除了我也想要 HTML5 而不是 Flash)。看看 - 它是令人难以置信的愚蠢!如果你玩它,它也不会真正同步。我也寻求了一种算法设置来进行计数(预卷),然后设置随后录制的曲目。我找到了一个人,他有一个可能的解决方案,但他放弃了它,然后关闭了他的网站。让我们继续努力!自 2010 年以来一直从事这项工作,我确信最难的部分(getusermedia)将成为标准。

于 2013-06-24T20:09:08.443 回答