如何以绝对最小或*量化*延迟播放声音?

Posted

技术标签:

【中文标题】如何以绝对最小或*量化*延迟播放声音?【英文标题】:How can I play a sound with absolute minimal or *quantified* lag? 【发布时间】:2011-08-13 22:48:14 【问题描述】:

我正在用 jQuery 编写一个心理学应用程序。我的项目的一部分需要测量用户对声音的反应时间(用户按键)。因此,我需要在我调用(和时间戳)声音文件和它实际开始播放之间以最小的延迟播放声音文件。大多数声音插件都没有详细说明它们如何处理延迟。请告诉我最好的方法!

只有扎根于可靠 CS 的答案(不是“这个插件听起来很快”)对我有用。至少,我需要知道我正在使用的方法(用于计算置信区间)的可能滞后范围。

另一种实际上更可取的解决方案是量化滞后的方法。在那种情况下,延迟的长度并不重要,因为我可以轻松地纠正它。

我不知道我将使用哪些声音文件,但我认为它们会非常小。两个 .wav 文件 @ 每个 100kb 可能是一个安全的估计。

【问题讨论】:

您是在 JQuery 中编写此代码以在 Web 浏览器中运行吗?您是否要控制使用哪个浏览器以及用户可能安装了哪些可以处理播放 wav 文件的插件? 不,我无法控制这些变量。 那你有一个更大的问题,忘记滞后,我怎样才能普遍使用 html/javascript 播放声音。如何使用 javascript 与该 flash 元素或 HTML5 音频标签等进行交互。 重新思考...是的,我可以在有限的试验中控制这些变量,其中准确性非常重要。在那之后,我将把它开放给网络上的一般使用。在那个阶段,准确性只是“非常”重要。 是 HTML + Javascript (+ jQuery) 的要求吗?是否有其他控制声音的方法? 【参考方案1】:

在评论讨论之后,我将建议您使用 HTML5 音频标签来播放/控制声音。 [您链接到的 JQuery 插件使用“嵌入”标签来播放声音(这将调用客户端计算机上的插件,您将无法控制)。]

使用 HTML5,您将失去一些较旧的/移动浏览器,但这始终是 Web 编程的症结所在。

有关控制“音频”标签的教程,请参阅here。确保您preload 音频。

我认为除了 HTML5 之外唯一的选择是使用 flash 播放声音。您可以pretty easily 交互flash 和javascript。

【讨论】:

感谢您的意见。我会试一试并在这里发布结果。 嗯,这是准备好的蛋糕,我会给它。而且,正如另一个堆栈答案中提到的,它是“面向未来的”。如果<audio> 标记失败,我将使用它与闪存后备。我 1'upped,但不想将此标记为已回答,因为现在似乎没有一个好的解决方案(可量化的滞后)。谢谢大家。【参考方案2】:

我要做的第一件事是缓存声音文件(idk 你打算用什么来制作声音。HTML5 音频标签?)然后当你调用播放函数时,你可以运行类似

var counter = 0;
var timer = setInterval(function()counter++, 1);

在用户响应调用中

clearInterval(timer);

计时器将是响应的毫秒数(减去开始播放所需的时间)。

【讨论】:

我也不知道我用什么来播放声音:) 寻求建议。可能不是HTML5,我需要强跨浏览器。 @Tr3y 在那种情况下,我不知道你会使用什么。 :P 我从来没有真正在网页上过分关注声音。 我认为在开始和结束时使用 (+new Date()) 并比较差异会比使用 setInterval 更准确。【参考方案3】:

我遇到了同样的问题:我尝试了缓冲、音频事件甚至 AnalyserNode,但在解析声音数据和产生声音之间似乎存在硬件延迟:在我的测试中,它的范围在 50-200 毫秒之间.

然而,延迟可以通过捕捉声音来量化:

    播放声音(无论是否缓冲)并启动计时器 当声音捕捉捕捉到某些东西时停止计时器(观察麦克风附近的声音干扰)

阅读更多关于 javascript 声音捕捉的信息here。

【讨论】:

以上是关于如何以绝对最小或*量化*延迟播放声音?的主要内容,如果未能解决你的问题,请参考以下文章

JQuery 不播放多个声音文件或延迟事件

Pygame - 声音延迟

如何使用连接到 AVAudioEngine 混音器的节点同时播放缓冲区中的多个声音

Linux如何在RAM缓冲区中录制声音并以自定义延迟播放音频

如何在Objective C iphone编码中播放声音

如何延迟 For 循环直到声音在 Swift 中播放完毕