2010-07-17 166 views
66

我最近一直在使用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 DEV)和Firefox测试(4测试版1),这两者似乎乐于忽略我的请求循环。有任何想法吗?

UPDATE:在所有主流浏览器中,循环属性现为supported

+1

不确定Chrome,但Firefox不支持循环。 – luiscubal 2010-07-17 22:42:43

+1

一旦结束就开始它:myAudio.addEventListener(“ended”,function(e){myAudio.play();},false); – mattbasta 2010-07-17 22:47:54

+0

不工作! – gravitation 2011-03-10 07:28:24

回答

95

虽然被指定loop,它不是在实现我知道火狐的任何浏览器[感谢阿努拉格指出了这一点]。下面是应该在HTML5兼容的浏览器工作循环的另一种方法:

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

嗯......有趣。以前我没有太多运气,但是我没有设置当前时间。当我尝试这个,但是我得到:“未捕获的错误:INDEX_SIZE_ERR:DOM异常1”在行“this.currentTime = 0” – Toji 2010-07-17 22:54:25

+1

@Toji 这里是[INDEX_SIZR_ERR错误](http:// www .whatwg.org /规格/网络应用/电流工作/多页/ video.html#偏移 - 到 - 在媒体资源)。这意味着歌曲的开头超出了浏览器可以搜索的范围。如果浏览器认为它是流媒体,或者如果服务器缺少某些功能(我忘记了这种特定功能是什么,但我会尽力追踪它),有时会发生这种情况。 您也可以使用'this.startTime'返回到最早的可用时间。 – kingjeffrey 2010-07-17 23:19:07

+0

@Toji“.currentTime”的原因需要与规范如何处理歌曲结尾有关。浏览器应该暂停播放歌曲。因此,在歌曲结尾重新开始播放。播放头必须重置。 – kingjeffrey 2010-07-17 23:21:13

14

您的代码对我的作品在Chrome(5.0.375)和Safari(5.0)。不在Firefox上循环(3.6)。

See example.

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

+1非常酷。我不知道'循环'是在webkit中实现的。 – kingjeffrey 2010-07-17 23:24:13

+10

+1,你也可以检测是否支持'loop',例如通过:'typeof new Audio()。loop =='boolean';' – CMS 2010-07-18 02:36:55

+0

@CMS避免使用'=='并使用'===',它对初学者来说是一个更好的操作符,并且性能更好。 – Hydro 2016-02-25 22:32:38

56

要多补充一些建议结合@kingjeffrey和@CMS的建议:你可以用loop地方可用,依傍kingjeffrey的事件处理程序时,它不是。有一个很好的理由,你为什么要使用loop,而不是编写自己的事件处理程序:正如Mozilla bug report中所讨论的那样,虽然loop目前不会在我知道的任何浏览器中无缝循环(没有间隙),但它肯定有可能并可能在未来成为标准。你自己的事件处理程序永远不会在任何浏览器中无缝连接(因为它必须通过JavaScript事件循环抽取)。因此,尽可能使用loop而不是编写自己的事件。正如CMS在对Anurag的回答发表评论时指出的那样,您可以通过查询loop变量来检测对loop的支持 - 如果支持它将是布尔值(false),否则它将不确定,因为它目前在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(); 
+0

+1因为我在寻找这个代码! – 2011-12-06 00:19:04

+0

Thx。这对Opera,Firefox,Chrome ...非常合适,所以我们如何为Safari添加更多声音(mp3)....?增加更多的变量可能会导致重复的Chrome(它支持ogg和mp3)... – pixelass 2012-01-01 22:29:37

+0

@pixelass我不完全知道如何在代码中做到这一点。在HTML中,您可以将

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> 

,它看起来像这样

enter image description here

0

这工作,这是一个更容易切换的方法上面:

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

打开循环ing by $(audio_element).attr('data-loop','1'); 将环路关闭$(audio_element).removeAttr('data-loop');

0

如果您知道声音的确切长度,那么您可以尝试setInterval。您可以让setInterval每隔x秒播放一次声音。 X会是你声音的长度。

+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 – 2015-03-11 09:10:07

+4

@AlexChar我不同意。这至少是试图回答这个问题。它可以从一些扩展中受益,以准确显示代码的样子,它可能不是解决问题的最佳方法,但它不是“不是答案”。 – 2015-03-11 09:39:42

+0

这样做会得到经验麻烦。 – Hydro 2016-03-04 10:55:47

3
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 eventlistener中设置loop = true即可。

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