6

我已经构建了一个应用程序,旨在播放每个声音,因为第一个声音是通过使用“结束”事件完成的。

在我的初始版本中,每个声音都有自己的音频元素,结果如下:

   function play_next_audio(){
        speaker = $('audio#' + sounds[i++]).get(0);
        speaker.addEventListener('ended',play_next_audio);
        speaker.play();
   }

这适用于所有桌面浏览器,包括 Safari,但不会超出 iOS 上的第一个字母。

我还尝试了一种不同的方法——一个单独的音频元素依次加载每个声音。在那里,我尝试绑定“结束”事件以及首先加载并绑定“canplaythrough”事件。在这两种情况下,即使在桌面 Safari 上它也无法正常工作——这次成功地播放了前两个字母。

这是孤立的测试:

http://dev.connectfu.com:42001/app/test-sounds.html

请注意,audio.load() 被注释掉了几个地方 - 将其输入或输出似乎没有任何区别。

我究竟做错了什么?如何在 iOS 上播放一系列声音?非常感谢你的帮助!

4

2 回答 2

15

更新截至 2017 年,在多种情况下,在 iOS 上的 Safari(或 Chrome)上不会触发 end 事件。更多信息可以在这里找到:快到 2017 年了,iOS 上的 HTML5 音频仍然有问题


我已经构建了一个 HTML5 音频播放器(Chavah Messianic Radio),它可以在 iOS 上的 Safari 上“工作”。

我所说的“有效”是指,它在 Apple 残缺的 iOS <audio> 实现中发挥了最大的作用。在撰写本文时,这包括 iOS 5。我已经在 iPhone 3 及更高版本以及 iPad 原版、iPad 2 和 iPad 3 上进行了测试。

以下是我的发现:

  • 在用户交互之前,Apple 不允许您在任何音频上调用 .play。对我来说,这意味着检测 iOS,然后将音乐显示为暂停,直到用户单击播放。他们的理由是这会消耗数据和电池;但在实践中,它只会削弱网络应用程序并扼杀网络的发展。
  • 如果要播放连续的声音(一个接一个),请使用单个元素。当需要播放下一个声音时,设置 existingAudio.src,然后调用 existingAudio.load(),然后调用 existingAudio.play()。这将允许您播放连续的声音。
  • 如果 Safari 在后台,则不会触发音频事件。. 如果用户切换到不同的应用程序,音频将继续播放,但不会触发 .ended 事件。这意味着几乎不可能构建音乐播放器应用程序。

希望这可以帮助。

<咆哮>

同时:Apple,拜托,拜托,请在 iOS Safari 中给我们更好的 HTML5 支持。这是你的行动项目,Apple:

  1. 让 HTML5 音频在后台工作。
  2. 支持OGG。
  3. 支持预加载音频。
  4. 支持并发音频。
  5. 让我们在没有用户交互的情况下播放音频。

做这些事情,Apple,你将成为移动 HTML5 音频的行业领导者,每个人都会效仿你,你将再次引领潮流,Web 应用程序将在你的平台上完美运行,而在其他移动平台上则瘫痪. 是的,这些功能将使用数据和电池,但本机应用程序已经这样做了。停止破坏网络应用程序并成为领导者。让 HTML5 <audio> 成为 iOS 上的一等公民。

</rant>

于 2012-06-12T14:47:57.167 回答
0

我不相信 iOS 中的音频或视频支持 .play() 方法。Apple 不喜欢在访问页面时自动播放视频或音频的想法。

这是有关跨平台 HTML5 音频支持状态的有用阅读:http ://www.phoboslab.org/log/2011/03/the-state-of-html5-audio

于 2012-06-12T03:45:12.373 回答