【发布时间】:2020-08-24 01:20:35
【问题描述】:
我正在开发一个播放随机音符序列的音乐网络应用程序,但我遇到了这个问题:每当我要在页面加载后第一次按下播放时,序列就会在走上正轨之前“窒息”。我想这可能是因为当我第一次按下播放时资源尚未加载。我想我是对的,做了一些研究,发现了这个 preload = auto 的东西,这似乎解决了这个问题。至少,如果您第一次刷新或访问页面并立即按播放,它就可以正常工作。然而,如果你有一段时间什么都不做,比如 2/3 分钟,同样的事情也会发生。有一个延迟启动,好像它正在加载文件,然后它笨拙地加速,就像它试图赶上 setInterval 计时器一样。我写了这个非常简化的代码版本只是为了说明:
<button>Play</button>
<audio src="source1.mp3"></audio>
<audio src="source2.mp3"></audio>
<audio src="source3.mp3"></audio>
<script>
let notes = []
document.querySelectorAll("audio").forEach(function(note){
notes.push(note)
})
function play(){
let random_index = Math.floor(Math.random() * 3),
note = notes[random_index]
note.play()
setInterval(function(){
note.pause()
note.currentTime = 0
play()
}, 500)
}
let button = document.querySelector("button")
button.addEventListener("click", function(){
play()
})
</script>
所以我的问题是如何解决这个问题?有没有办法告诉函数保持直到它可以真正播放第一个文件?也许是在资源缓冲并准备好时触发的 DOM 事件?我觉得我不能让计时器开始,直到我有办法检查它,否则它会像往常一样发疯。任何想法将不胜感激!
【问题讨论】:
-
除了 onload.. 你知道有一个专门用于此目的的
canplay事件吗? -
canplay和canplaythrough我都试过了,都没有解决问题。如果我让页面闲置几分钟,然后按播放键,序列就会断断续续。我真的不知道我能做什么。
-
setInterval 设置
note.currentTime = 0每 500ms 会导致 -
所有文件都是5s长,但音符之间的时间由用户选择,所以我必须重新设置文件以确保它们每次都从头开始播放。我想不出更好的方法来做到这一点。此外,我只用一个音符进行了测试,没有 setInterval 或任何东西,但我仍然必须等待将近一秒钟才能开始播放音频。 “canplaythrough”或“playing”等事件将触发,但播放尚未开始。问题始终是第一次播放调用。我发现这篇文章描述了一个类似的问题,但不幸的是没有答案:
标签: javascript html dom dom-events