HTML5音频循环


80

我最近一直在使用HTML5音频进行播放,尽管我可以播放HTML5音频,但只能播放一次。无论我尝试什么(设置属性,事件处理程序等),我似乎都无法使其循环。

这是我正在使用的基本代码:

//myAudio is declared at a global scope, so it doesn't get garbage collected.
myAudio = new Audio('someSound.ogg');
myAudio.loop = true;
myAudio.play();

我正在使用Chrome(6.0.466.0开发人员)和Firefox(4 beta 1)进行测试,这两者似乎都很乐意忽略我的循环请求。有任何想法吗?

更新:现在,所有主流浏览器都支持loop属性。


1
不确定Chrome,但Firefox不支持循环。
luiscubal

1
结束后只需启动即可:myAudio.addEventListener(“ ended”,function(e){myAudio.play();},false);
mattbasta

@布兰登,我想知道为什么这行不通?此代码与接受的答案之间的唯一区别是,在接受的答案中,currentTime在调用之前将其设置为0 play。那有必要吗?
mgiuca 2011年

2
@Brandon是的,请参阅kingjeffrey对他自己的回答的第二条评论。您确实需要设置currentTime
mgiuca 2011年

这确实很好(至少今天是这样)
dvlden

Answers:


118

虽然loop已指定,但未在我知道的任何浏览器 Firefox [感谢Anurag指出了这一点]。这是应该在支持HTML5的浏览器中运行的另一种循环方式:

var myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
myAudio.play();

1
嗯...有趣。以前我对这种方法不太幸运,但是我没有设置当前时间。当我尝试这样做时,却得到:“ this.currentTime = 0”行上的“ Uncaught Error:INDEX_SIZE_ERR:DOM Exception 1”
Toji 2010年

1
@Toji这是INDEX_SIZR_ERR错误的文档。这意味着歌曲的开头不在浏览器可以搜索的范围内。如果浏览器认为它是流媒体,或者服务器缺乏某些功能,则有时会发生这种情况(我暂时忘了这个特定功能是什么,但我会尝试对其进行跟踪)。您还可以使用this.startTime来返回最早的可用时间。
kingjeffrey

@Toji.currentTime需要的原因与规范如何处理歌曲的结尾有关。浏览器应该只是暂停歌曲。因此在歌曲的结尾重新开始播放。播放头必须重设。
kingjeffrey

@Toji如果您无法.currentTime工作,这是另一个想法。在回调函数中,您可以简单地重新声明myAudio相同的文件并再次播放。重新声明它还应该将播放头重置为歌曲的开头。
kingjeffrey

将其设置为this.startTime会给我同样的错误,尽管现在我开始怀疑这是否是服务器问题。我正在从本地django服务器(这不是django最强大的功能)提供静态文件。将其与Anurag的确有效的事实配对,我认为可能只是我一个。我会再加上一点,让您知道结果。
Toji

61

要结合@kingjeffrey和@CMS的建议添加更多建议:您可以使用loop可用的地方,并在不可用时使用kingjeffrey的事件处理程序。有一个很好的理由要使用loop而不编写自己的事件处理程序:正如Mozilla错误报告中所讨论的那样,尽管loop当前在我所知的任何浏览器中都无法无缝循环(没有间隙),但肯定有可能成为未来的标准。您自己的事件处理程序在任何浏览器中都将是无缝的(因为它必须在JavaScript事件循环中循环运行)。因此,最好尽可能使用loop而不是编写自己的事件。CMS在对Anurag答案的评论中指出,looploop 变量-如果支持,则为布尔值(false),否则为undefined,与Firefox当前相同。

将这些放在一起:

myAudio = new Audio('someSound.ogg'); 
if (typeof myAudio.loop == 'boolean')
{
    myAudio.loop = true;
}
else
{
    myAudio.addEventListener('ended', function() {
        this.currentTime = 0;
        this.play();
    }, false);
}
myAudio.play();

谢谢。???这对于Opera,Firefox,Chrome来说非常合适...所以我们如何为Safari添加更多声音(mp3)...。添加更多的变量可能会导致Chrome重复(支持ogg和mp3)...

@pixelass我不完全确定如何在代码中做到这一点。在HTML中,您可以将<audio>标记相互嵌套,浏览器将选择最匹配的一个。我不知道您是否可以在程序化Audio对象中进行嵌套。但是您当然可以自己编程:检查Audio.canPlayType方法。
mgiuca 2012年

我知道html方法。我可能会尝试使用Audio.canPlayType方法。现在我正在使用2个变量,因此在chrome 2中会播放文件。实际上,这并不重要,因为这只是我制作的一些海浪循环。...但是简单地添加2个来源会更好。 如果您愿意的话,pixelass.com

19

您的代码在Chrome(5.0.375)和Safari(5.0)上对我有效。不会在Firefox(3.6)上循环播放。

参见示例。

var song = new Audio("file");
song.loop = true;
document.body.appendChild(song);​

+1非常酷。我不知道loop在webkit中实现了该功能。
kingjeffrey

10
+1,您还可以检测是否loop支持,例如:typeof new Audio().loop == 'boolean';
Christian C.Salvadó2010年

@CMS避免使用==和使用===,对于初学者来说是更好的运算符,并且对性能也更好。
Hydroper

这与Firefox 80兼容吗?
Mostafiz Rahman

4
var audio = new Audio("http://rho.nu/pub/Game%20Of%20Thrones%20-%20Main%20Theme%20-%20Soundtrack.mp3");

audio.addEventListener('canplaythrough', function() {
    this.currentTime = this.duration - 10;
    this.loop = true;
    this.play();
});

只需在canplaythrough事件监听器中将loop设置为true即可。

http://jsbin.com/ciforiwano/1/edit?html,css,js,输出


4

最简单的方法是:

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();

2

尝试将jQuery用于事件侦听器,然后它将在Firefox中运行。

myAudio = new Audio('someSound.ogg');

$(myAudio).bind('ended', function()  {
    myAudio.currentTime = 0;
    myAudio.play();
});

myAudio.play();

这样的事情。


1

我是这样做的

<audio controls="controls" loop="loop">
<source src="someSound.ogg" type="audio/ogg" />
</audio>

它看起来像这样

在此处输入图片说明


0

这可行,切换上面的方法要容易得多:

使用内联: onended="if($(this).attr('data-loop')){ this.currentTime = 0; this.play(); }"

通过$(audio_element).attr('data-loop','1'); 打开循环通过关闭通过循环$(audio_element).removeAttr('data-loop');


0

如果您知道声音的确切长度,则可以尝试使用setInterval。您可以让setInterval每x秒播放一次声音。X将是您声音的长度。


这不能为问题提供答案。要批评或要求作者澄清,请在其帖子下方留下评论-您可以随时对自己的帖子发表评论,一旦拥有足够的声誉,您就可以在任何帖子中发表评论
Alex Char

4
@AlexChar我不同意。这至少是试图回答这个问题的尝试。它可以通过扩展以准确显示代码的外观而受益,它可能不是解决问题的最佳方法,但这不是“没有答案”。
安东尼·格里斯

这样做会遇到麻烦。
Hydroper
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.