HTML5 音频循环

IT技术 javascript html html5-audio
2021-02-12 06:31:24

我最近一直在玩 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 beta 1) 进行测试,它们似乎都乐于忽略我的循环请求。有任何想法吗?

更新所有主要浏览器现在都支持循环属性

6个回答

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

var myAudio = new Audio('someSound.ogg'); 
myAudio.addEventListener('ended', function() {
    this.currentTime = 0;
    this.play();
}, false);
myAudio.play();
@Toji.currentTime需要的原因与规范如何处理歌曲结尾有关。浏览器应该只是暂停这首歌。所以在歌曲的结尾重新开始播放。必须重置播放头。
2021-03-14 06:31:24
@Toji 这是INDEX_SIZR_ERR 错误的文档这意味着歌曲的开头在浏览器可以搜索的范围之外。如果浏览器认为它是流媒体,或者如果服务器缺乏某些功能(我暂时忘记了这个特定功能是什么,但我会尝试追踪它),有时会发生这种情况。您还可以使用this.startTime返回到最早的可用时间。
2021-03-16 06:31:24
@Toji 如果您无法.currentTime工作,这是另一个想法在回调函数中,您可以简单地myAudio使用相同的文件重新声明并再次播放。重新声明它也应该将播放头重置到歌曲的开头。
2021-03-28 06:31:24
将它设置为 this.startTime 给了我同样的错误,但现在我开始怀疑这是否是服务器问题。我正在从本地 django 服务器(这不是 django 最强大的功能)提供静态文件。将其与 Anurag 确实有效的事实相结合,我认为这可能只是我。我会多玩一点,让你知道结果。
2021-04-01 06:31:24
嗯……有意思。我以前用这种方法运气不佳,但我没有设置当前时间。但是,当我尝试此操作时,我在“this.currentTime = 0”行上得到:“未捕获的错误:INDEX_SIZE_ERR:DOM Exception 1”
2021-04-07 06:31:24

添加一些结合@kingjeffrey 和@CMS 的建议的更多建议:您可以loop在可用的地方使用它,并在它不可用时退回到kingjeffrey 的事件处理程序。您想要使用loop而不是编写自己的事件处理程序有一个很好的理由:正如Mozilla 错误报告中所讨论的,虽然loop目前在我所知道的任何浏览器中都不能无缝循环(没有间隙),但它肯定是可能的,并且可能会将来成为标准。您自己的事件处理程序在任何浏览器中都不会是无缝的(因为它必须在 JavaScript 事件循环中运行)。因此,最好尽可能使用loop而不是编写自己的事件。正如 CMS 在对 Anurag 回答的评论中指出的那样,looploop 变量——如果它被支持,它将是一个布尔值 (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();
@pixelass 我不完全确定如何在代码中做到这一点。在 HTML 中,您可以将 <audio> 标签相互嵌套,浏览器将选择匹配的最外层标签。我不知道您是否可以在程序化音频对象中进行嵌套。但是您当然可以自己编程:查看 Audio.canPlayType 方法。
2021-03-26 06:31:24
我知道 html 方法。我可能会尝试使用 Audio.canPlayType 方法。现在我使用 2 个变量,所以在 chrome 2 文件中播放。这实际上并不重要,因为它只是我制作的一些海浪循环。...但简单地添加 2 个源会更好,。 如果您关心,pixelass.com
2021-03-30 06:31:24
谢谢。这对 Opera、Firefox、Chrome 来说非常有效......那么我们如何为 Safari 添加更多声音(mp3)......?添加更多变量可能会导致 Chrome(支持 ogg 和 mp3)重复...
2021-04-06 06:31:24

您的代码适用于 Chrome (5.0.375) 和 Safari (5.0)。不在 Firefox (3.6) 上循环。

参见示例。

var song = new Audio("file");
song.loop = true;
document.body.appendChild(song);​
这与 Firefox 80 兼容吗?
2021-03-14 06:31:24
@CMS 避免使用==和 使用===,对初学者来说是一个更好的操作符,对性能更好。
2021-03-31 06:31:24
+1,您还可以检测是否loop支持,例如:typeof new Audio().loop == 'boolean';
2021-04-06 06:31:24
+1 很酷。我不知道loop是在 webkit 中实现的。
2021-04-07 06:31:24

最简单的方法是:

bgSound = new Audio("sounds/background.mp3");
bgSound.loop = true;
bgSound.play();
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,output