我一直在尝试让WebAudio在iOS8的Safari中工作(我已经成功地使其在Windows和Android设备上工作)。

据我了解,您无法通过iOS上的Safari自动播放网络音频,而是必须通过用户操作(例如,按下按钮)来触发第一个网络音频通话。然后,一旦完成第一个用户驱动的操作,WebAudio便会正常工作。

所以我有一个像这样设置按钮(使用JQM):

<a href="#" onclick="PlayDing('Silent');" data-icon="info" data-role="button" data-mini="false" data-theme="b" data-corners="false">Enable Audio</a><hr />

“PlayDing”是一个看起来像这样的函数:
function PlayDing(DingType) {
var sound = new Audio('../../UI/Audio/' + DingType + '.mp3').play();
}

这个想法是,通过单击“启用音频”按钮,这将触发用户交互以播放mp3文件(仅静音1秒),然后随后的音频事件将起作用。

有什么想法为什么不能在iOS8 / Safari上运行吗?

编辑:

如果我更改JQM按钮以播放适当的叮叮声,则可以正常工作,并且我的iPad可以播放叮叮声。

编辑2:

这与播放iPad音乐库中的音频文件无关。这与播放网站中的文件/资源​​有关。

最佳答案

“据我了解,您不能通过iOS上的Safari自动播放网络音频,而是必须通过用户操作(例如,按下按钮)来触发第一个WebAudio call 。然后,一旦完成第一个用户驱动的操作,WebAudio就可以工作……显然。”

您对演奏的处理完全正确。为了避免播放不必要的声音或将声音不必要地下载到用户设备上(可能会用完每月数据),必须在与用户的触摸/点击相同的堆栈中调用声音播放。

要确保所有用户都能可靠播放声音,您需要处理很多事情。一件事是在播放之前必须先下载它。为此,我们使用一种称为预加载的技术。

您还必须考虑到并非所有用户都支持相同的音频格式。

您的HTML和Javascript的示例如下:

Javascript:

function PlayDing(DingType) {
     //Get a reference to the audio element
     var sound = document.getElementById(DingType);
     //Play it
     sound.play();
}

HTML:
<body>
     <!--Declare the sounds in as many formats as possible and let the user's browser handling what sound to play & caching -->
     <audio id="Silent" preload="auto">
          <source src="'../../UI/Audio/silent.ogg" type="audio/ogg">
          <source src="'../../UI/Audio/silent.wav" type="audio/wav">
          <source src="'../../UI/Audio/silent.aac" type="audio/mpeg">
     </audio>

     <a href="#" onclick="PlayDing('Silent');" data-icon="info" data-role="button" data-mini="false" data-theme="b" data-corners="false">Enable Audio</a>
     <hr />
</body>

07-24 09:44
查看更多