我一直在尝试让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>