Android浏览器在每次播放()后卸载HTML5音频元素,导致延迟

问题描述:

我有一个简单的应用程序,它通过调用JavaScript中的音频元素的play()方法来重复播放短音。它适用于桌面浏览器,ipad,iphones等。在运行Android 2.3.3的移动设备上,第一次播放声音时,我在调用play()方法后立即听到它,但在随后的调用中,有一个明显的和可变的延迟。Android浏览器在每次播放()后卸载HTML5音频元素,导致延迟

我已经做了一些调查,发现设备每次调用play()方法时都会从服务器获取音频文件。我可以在音频元素上调用load()方法在每次播放后重新加载它,从而将它排队等待下一次播放,但这种创可贴有许多问题。我真的希望让浏览器只是将音频元素永久加载,而不是在它完成播放后立即卸载它。有谁知道这是可能的吗?

编辑:我做了一些更多的调查,我发现播放声音后,音频元素的readystate保持在HAVE_ENOUGH_DATA,即使浏览器不会再次播放该声音而无需重新获取它从服务器。我相信这是一个错误。我希望使用readystate来检测播放后卸载的浏览器,并且只在必要时才显式加载,但这不起作用。

我做的实验越多,我在Android 2.3.3的HTML5音频标签实现中发现的边缘越粗糙。至少在我用来测试的Droid X手机上存在很多问题。

迄今为止我所提出的最好的是在我原来的问题中提到的创可贴:只要play()的调用完成,就调用load()方法,为下一次播放做准备( ):

if (navigator.userAgent.toLowerCase().indexOf("android") > -1) 
    audElt.addEventListener('ended', function() { 
    var t = setTimeout(function() { audElt.load(); }, 1000); 
    }, false); 

我不得不的变通限制到Android用户代理,因为简单地调用所述负载()方法创建在Chrome问题,并产生不必要的前往非Android系统服务器。

我不得不添加一个1秒的延迟,因为如果我只是从“结束”处理程序调用load(),它会中断播放,显然,它还没有真正“结束”。

当然,它仍然从服务器反复提取声音,所以如果您尝试连续多次播放声音,事情会迅速南下。

我找到的最佳解决方案。另一种选择是只使用视频标签,但也有一些问题。似乎没有什么工作可以实施。

幸运的是即时通讯使用手机差距,所以我会给他们的音频方法一枪。

您可以在updatetimepause()之间绑定播放,每秒播放一次,然后再播放,然后到达音频结尾。那么Android不会刷新音频。