【发布时间】:2013-10-29 09:30:40
【问题描述】:
我正在使用 HTML5 <audio> 元素开发音频播放器,并试图解决一些跨浏览器的问题。
此播放器配置为在单击不同曲目的链接时在音轨之间切换。在内部,它暂停<audio> 元素,将其currentTime 设置为0(如HTML5 audio not playing multiple times in Android 4.0.4 device Native Browser 中所述)并在使用指定的新源轨道创建新<audio> 元素之前将其从DOM 中删除。在元素上调用play() 方法以加载曲目并开始播放。
在桌面浏览器、iPhone 和 iPad 上,这可以正常工作。它也适用于同事的三星 Galaxy S3 Mini。然而,在另一部测试手机(全尺寸三星 Galaxy S3)上,后续曲目的播放失败 - 曲目甚至无法播放,并且在播放栏中显示为已播放完毕。我的摩托罗拉 Xoom 平板电脑上的 Android 4.1.2 浏览器也是这种情况。
页面加载时指定的第一个轨道总是可以正常工作。
在JavaScript代码中添加一些调试语句,特别是timeupdate回调函数后,我发现在播放失败的情况下,<audio>元素的duration的值为1 在引发timeupdate 的两种情况下。通常,持续时间报告为从 350 到刚刚超过 1000 的 3-4 分钟曲目。这就解释了为什么播放栏会立即将新加载的曲目显示为已完成播放。
我认为后续曲目没有正确加载;即使它之前已经加载并缓存在手机上,肯定它必须能够正确加载。所有曲目均为 MP3,可在各自的浏览器中播放。
我在这里缺少什么?知道问题出在哪里以及如何让它发挥作用吗?
非常感谢。
更多信息:
我已将其他事件连接到 <audio> 元素以跟踪可能发生的情况:
-
progress(带有缓冲范围的报告) loadedmetadatacanplayerror
在桌面(正常工作的地方)上,事件如下:
timeupdate(具有 NaN 持续时间),progress x3(0 个缓冲范围),loadedmetadata,canplay,timeupdate,持续时间为 121.172368,progress,具有 1 个缓冲范围 [0, 11.507715],然后是随着曲目继续播放,一系列timeupdate 和progress 事件。 iPhone 也有类似的事件序列。
在三星 S3 上,我收到以下事件:timeupdate,持续时间为 1,然后是 progress(0 个缓冲范围),loadedmetadata,canplay,最后是持续时间为 timeupdate仍然是 1。
这个页面在解释事件和数据结构方面非常有用:http://www.sitepoint.com/essential-audio-and-video-events-for-html5/
【问题讨论】:
-
为什么要使用播放时间等待删除元素,而不是使用声音播放完毕后触发的
ended事件? -
我不会在
timeupdate上切换曲目;我已经更新了问题以尝试澄清这一点。由于曲目长达几分钟,因此网站访问者很可能会通过单击适当的曲目链接在播放过程中在曲目之间切换。我已经连接了ended事件来处理这种情况,尽管在我所指的场景中不会出现这个事件。 -
我正在研究他们如何在 soundmanager2 中获得持续时间,但看起来他们也没有真正解决问题的方法:github.com/scottschiller/SoundManager2/blob/master/script/…
-
你能检查一下持续时间是否无效,然后通过ajax从服务器获取持续时间吗?
-
我的印象是
duration是根据 MP3 本身的loadedmetadata事件计算的。这似乎也取决于浏览器 - 相同的 3:24 长轨道在 iPhone 上的持续时间为 205.4008,但在 Galaxy S3 上为 946.4950。
标签: javascript android html html5-audio