Html5 Audio在我的Javascript代码中只播放一次

时间:2010-04-23 22:29:21

标签: javascript audio html5

我有一个仪表板网络应用程序,如果连接有问题,我想发出警报声。该站点的ajax代码将轮询数据,并在无法连接时降低其刷新率。服务器恢复后,该站点将继续工作。

同时我希望每次无法连接时播放声音(所以我知道检查服务器)。这是代码。这段代码有效。

var error_audio = new Audio("audio/"+settings.refresh.error_audio);
error_audio.load();

//this gets called when there is a connection error.
function onConnectionError() {
   error_audio.play();
}

然而第二次通过该功能音频不播放。在Chrome的调试器中挖掘,audio元素中的'playing'属性设置为true。将其设置为false没有结果。有什么想法吗?

6 个答案:

答案 0 :(得分:3)

我今天遇到这个问题,经过多次搜索后,我发现你必须再次在audio元素上设置source属性才能让它重新启动。不用担心,不会发生网络活动,并且操作得到了大量优化。

var error_audio = new Audio("audio/"+settings.refresh.error_audio);
error_audio.load();

//this gets called when there is a connection error.
function onConnectionError() {
   error_audio.src = "audio/"+settings.refresh.error_audio;
   error_audio.play();
}

此行为以chrome 21表示.FF似乎并不介意将src设置两次!

答案 1 :(得分:1)

在播放之前尝试将error_audio.currentTime设置为0。也许它不会自动回到起点

答案 2 :(得分:1)

问:我得到了一个AUDIOBUFFERSOURCENODE,我只能用NOTEON()播放,我想再次播放,但是却没有做任何事情!帮助!

答:一旦源节点播放完毕,它就无法播放更多内容。要再次回放底层缓冲区,您应该创建一个新的AudioBufferSourceNode并调用noteOn()。

虽然重新创建源节点可能感觉效率低下,但源节点已针对此模式进行了大量优化。另外,如果您保留AudioBuffer的句柄,则无需再次向资源发出请求以再次播放相同的声音。如果您发现自己需要重复此模式,请使用简单的辅助函数(如playSound(缓冲区))封装播放。

问:什么时候播放一个声音,你为什么每次都需要做一个新的来源?

答:这种架构的想法是将音频资产与播放状态分离。以录音机类比,缓冲器类似于记录和播放头的源。由于许多应用程序涉及同时缓冲的多个版本同时播放,因此这种模式至关重要。

源:

http://updates.html5rocks.com/2012/01/Web-Audio-FAQ

答案 3 :(得分:1)

您需要在音频结束前暂停音频并将当前播放时间更改为零,然后播放。 Javascript/Jquery to control HTML5 audio elements - 点击此链接 - 解释How to handle/control the HTML5 audio elements?。它可能对你有帮助!

答案 4 :(得分:0)

您需要实施Content-Range响应标头,因为Chrome会通过Range HTTP标头以多个部分请求文件。

见这里:HTML5 <audio> Safari live broadcast vs not

实施后,play()功能和设置currentTime属性都应该有效。

答案 5 :(得分:0)

Chrome / Safari已在较新版本的浏览器中解决了此问题,上述代码现在可以正常运行。我不确定它的确切版本。