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

Alp*_*ver 3 audio html5 android delay

我有一个简单的应用程序,它通过在JavaScript中调用音频元素上的play()方法重复播放短音.它适用于桌面浏览器,ipads,iphone等.在运行Android 2.3.3的移动设备上,我第一次播放声音时,我会在调用play()方法后立即听到它,但是在后续的调用中,有明显且可变的延迟.

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

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

Alp*_*ver 5

我做的实验越多,我在Android 2.3.3的HTML5音频标签实现中找到的边缘越粗糙.那里有很多破坏,至少在我用于测试的Droid X手机上.

到目前为止我提出的最好的是在我原来的问题中提到的创可贴:一旦play()的调用完成,就调用load()方法,为下一个play()做准备:

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

我不得不将解决方法限制为Android用户代理,因为简单地调用load()方法会在Chrome上产生问题,并在非Android系统上生成不必要的服务器访问.

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

当然,它仍然会反复从服务器中取出声音,所以如果你试图快速连续多次播放声音,事情会很快发生.