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

标签 android html audio delay

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

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

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

最佳答案

我做的实验越多,我在 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);

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

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

当然,它仍然反复从服务器获取声音,所以如果您尝试快速连续多次播放声音,事情就会变得很糟糕。

关于Android 浏览器在每次 play() 后卸载 HTML5 音频元素,导致延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615747/

相关文章:

android - Android Studio 中的特殊符号

java - 如何使用 CustomArrayAdapter 区分 ListFragment 中的 View ?

html - 在 div :hover 上更改 span 的不透明度

php - 在整个网站的一页中制作页脚

javascript - 扬声器输入的示波器在几秒钟后停止渲染

android - 用于在android中缓冲编码音频的数据结构

java - 在 android 中膨胀 fragment 时出错

java - 在android上实现离散小波变换

html - 背景图像的放置与内容不一致

ios - EZaudio在后台执行