我正在尝试使用Android Chrome浏览器让HTML5音频精灵在Nexus 7上运行。要更改正在播放的音频,我会更改音频播放器的来源,然后重新加载音频播放器。
然后我必须检测两个'timeupdate'事件以确保音频实际播放,因为HTML5 audio on Android can be a bit unreliable。
它是大页面的一部分,所以我无法发布所有内容,但设置归结为基本:
<body>
<audio id="myAudioPlayer" src="audio_1.wav">
<script type=javascript>
function changeAudio() {
var audioplayer = document.getElementByID("myAudioPlayer");
audioplayer.currentSrc = getNextAudioClip();
audioplayer.load();
audioplayer.play();
audioplayer.addEventListener('timeupdate', firstTimeUpdate, false);
}
function firstTimeUpdate() {
this.removeEventListener('timeupdate', firstTimeUpdate, false);
this.addEventListener('timeupdate', secondTimeUpdate, false);
this.play();
}
function secondTimeUpdate() {
this.removeEventListener('timeupdate', secondTimeUpdate, false);
this.addEventListener('timeupdate', timeSliderUpdate, false);
}
</script>
</body>
所以,前几次这个工作正常。音频被更改,'timeupdate'触发以使我们进入firstTimeUpdate(),然后音频开始播放,'timeupdate'再次触发以进入secondTimeUpdate()。
但是第6或第7次更改音频时,第二次'timeupdate'事件不会触发,因此永远不会触及secondTimeUpdate(),除非我将Nexus 7旋转90度然后再次将其旋转回来,随后音频开始播放,第二个'timeupdate'被触发,一切都开始重新开始。
这一直持续到我改变第12或第13次的音频,其中观察到同样的事情。 getNextAudioClip()函数工作正常(即它返回一个有效的音频文件)。
我很难过。任何人都可以猜测这里可能会发生什么,或者为什么旋转Nexus 7“修复”它?
编辑:好的,所以在花了更多时间玩这个之后,似乎问题与垃圾收集有关。旋转Nexus 7似乎会触发先前加载的音频精灵的垃圾收集,这允许新的精灵加载和播放。更改为其他选项卡然后再返回也可以执行此操作。因此,如果我能以某种方式自动获取此音频GC,我可以有一个解决方法。