移动版Safari自动播放音频

22

在我被喷死之前,我知道由于苹果担心自动下载音频文件,这目前不起作用。

但是,我的问题是:有人找到了一个狡猾的解决方法吗?我只是想在游戏启动时播放启动声音,目前必须等待用户在某处单击后才能播放音频。你们中的聪明人肯定已经解决了这个问题,对吧?


1
几周前,我也在寻找类似的东西,但是我的搜索毫无结果... - boz
我已经上过谷歌搜索这个问题了,但没有找到任何有用的信息。请 Stackoverflow,你是我的唯一希望... - Simple Simon
我已经找到了Firefox和Chrome使用AudioContext的解决方案,但是我没有在Safari上尝试过(如果您有Safari移动端,请确认它是否有效)。请参阅我的类似问题的答案https://dev59.com/31sW5IYBdhLWcg3wi32j#46485784 [让我们希望从现在开始@boz是最后一个无功而返的搜索者☺] - Xenos
https://gist.github.com/ufologist/50b4f2768126089c3e11 - Alex Ivasyuv
iOS 上的 Opera Mini 默认支持自动播放,而 Chrome、Firefox 和 Safari 则不支持,并且没有提供打开选项。 - anonymous
5个回答

19

在移动浏览器中无法使用自动播放功能。Android和iOS不允许它,我个人认为这是一个可行的限制!想象一下,每打开一个网站,就会播放出讨厌的声音!

但是,您可以进行一些小的修改,以便用户不会注意到他当前启动了您应用程序的音频:

  1. 您需要用户交互才能启动音频。因此,您的应用程序或游戏可能具有启动屏幕或欢迎按钮,需要单击才能进入主菜单或开始游戏。绑定用户事件(接受的事件是:“click”,“touchend”,“doubleclick”和“keydown”),并调用您的

  2. 绑定

  3. 我还建议您在移动客户端上使用音频精灵。iOS(和Android?)通过Singleton内部实现了音频支持。这意味着您不能像在桌面浏览器中那样拥有10个音频元素并同时播放不同的声音。您只能播放一个文件!因此,更改不同声音的源需要太多时间。使用音频精灵,可以在用户首次与您的网站或游戏进行交互时启动它们。暂停您的精灵,当您需要播放声音时,必须将currentTime设置为精灵的开头,并在您的文件的currentTime到达精灵结尾时暂停精灵。有一个timeupdate事件,您可以检查精灵的currentTime。

如果您更感兴趣,我可以为您准备Javascript音频应用程序播放器!!


感谢回答,不幸的是我们的游戏必须在没有额外用户交互的情况下开始,所以你的“黑客”对我们无效。我们已经使用音频精灵,这个方法基本上还可以!既然目前没有其他解决方案,我会给你正确的答案。 - Simple Simon
有一个使用AudioContext的机会;请参见我的答案https://dev59.com/31sW5IYBdhLWcg3wi32j#46485784 - Xenos
你知道当用户点击按钮时,我是否可以加载多个不同的音频元素吗? - maracuja-juice
@Marimba 这只适用于桌面端。就像我所写的那样:在 iOS 中,内部音频支持是作为单例实现的。因此,在这里没有欺骗的机会。 - Simon Franzen
1
@SimonFranzen 我发现这不是真的。在Safari上,你实际上可以加载多个音频元素。你需要播放它们,然后暂停并保存在其他地方以备后用。 - maracuja-juice
你的想法看起来很有前途。为什么不给我们一些代码示例呢?那将不胜感激。 - Cymro

4
到目前为止,我看到的唯一解决方案是创建一个壳应用程序,并将Web应用程序放在UIWebView中。
参考链接:http://flowz.com/2011/03/apple-disabled-audiovideo-playback-in-html5/
UIWebView.allowsInlineMediaPlayback = YES;
UIWebView.mediaPlaybackRequiresUserAction = NO;

我非常希望你能告诉我如何在普通的Web应用程序中实现这一点。

很不幸,我们制作HTML5版本的整个目的是使其设备无关。将其包装在UIWebView中意味着仅限于iOS :-( 不过还是谢谢你的回答... - Simple Simon

0

HowlerJS创建了一个解决方法。用户不需要允许自动播放就可以自动播放音频。

文档中对此解决方法的说明:

howler.js是现代Web的音频库。它默认使用Web Audio API,并回退到HTML5音频。这使得在JavaScript中处理音频易于跨所有平台进行可靠操作。


0
我有一个聊天机器人应用程序,它具有语音消息,并且我希望它们在需要时自动播放...所以这是在我的Angular应用程序中对我有效的方法:
只需将点击事件监听器附加到文档,并调用player.load(),之后每当你设置player.src = x;时,它将自动播放。 <audio id="voicePlayer" controls autoplay playsinline #voicePlayer></audio>
@ViewChild('voicePlayer', { read: ViewContainerRef }) voicePlayerRef: ViewContainerRef;

...

  ngAfterContentInit(): void {
    this.voicePlayer = this.voicePlayerRef.element.nativeElement;
    document.addEventListener('click', this._onDocumentClick.bind(this));
  }

  _onDocumentClick() {
    this.voicePlayer.load();
    document.removeEventListener('click', this._onDocumentClick);
  }

...


this.voicePlayer.src = 'x';

-1

我相信我刚刚为自己的应用程序解决了这个问题。

步骤如下:

控制器加载,

然后...在viewDidLoad中

让您的Web视图加载HTML:loadHTMLString:htmlFile baseURL:[self getBasePath]];

然后...设置mediaPlaybackRequiresUserAction = NO,适用于WebView。

如果您设置得太早,我认为HTML的加载会重置它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接