当网站上出现新消息时,我需要播放声音。它适用于Chrome和Safari,但我无法在Safari移动设备上运行。 我看到声音必须通过用户操作初始化,所以我尝试了:
var sound = new Audio('./path/to/my/sound.mp3');
var hasPlayed = false;
$('body').bind('click touchstart', function() {
sound.load();
});
sound.addEventListener('play', function() {
hasPlayed = true;
});
var playSound = function() {
if(hasPlayed) {
sound.currentTime = 0;
}
sound.play();
}
不幸的是,声音仍然无法播放。我也试过Buzz库,问题是一样的。
所以,问题是:如何在移动浏览器上以编程方式播放声音?
答案 0 :(得分:5)
首先:iOS(5.01,5.1)上的Mobile Safari中的HTML5音频支持为rather limited。但我已经设法在我的iPad 2网络应用程序中获得一些小的“事件类型”声音。由于您只讨论应用程序的一个声音文件,因此您不必依赖音频精灵技巧(即将多个MP3合并为一个MP3文件并根据您想要的声音更改合并文件中的播放位置)玩了。)
正如您所注意到的,您无法在Mobile Safari中自动播放音频,即用户无需单击某个元素。从技术上讲,音频必须与单击事件在同一个调用堆栈中播放(未加载)。但是,当Mobile Safari创建音频对象时,您可能会遇到0.5秒的延迟。这是这个'问题'的解决方案:
以下是一些快速JavaScript代码:
function initAudio() {
var audio = new Audio('./path/to/my/sound.mp3');
audio.addEventListener('play', function () {
// When the audio is ready to play, immediately pause.
audio.pause();
audio.removeEventListener('play', arguments.callee, false);
}, false);
document.addEventListener('click', function () {
// Start playing audio when the user clicks anywhere on the page,
// to force Mobile Safari to load the audio.
document.removeEventListener('click', arguments.callee, false);
audio.play();
}, false);
}
答案 1 :(得分:2)
对于那些遇到此问题并且Jeroen解决方案无效的人来说,这是一个有效的解决方案,可确保正确实施正确的范围。
确保在页面加载时调用initAudio。即在您的Init函数或document.ready中的jquery($(function(){});)
function initAudio(){
var audio = new Audio('./path/to/my/sound.mp3');
var self = this;
//not sure if you need this, but it's better to be safe
self.audio = audio;
var startAudio = function(){
self.audio.play();
document.removeEventListener("touchstart", self.startAudio, false);
}
self.startAudio = startAudio;
var pauseAudio = function(){
self.audio.pause();
self.audio.removeEventListener("play", self.pauseAudio, false);
}
self.pauseAudio = pauseAudio;
document.addEventListener("touchstart", self.startAudio, false);
self.audio.addEventListener("play", self.pauseAudio, false);
}