移动Safari:音频+缓存清单



我有一个小的web应用程序,在点击几个按钮时播放非常短的声音位。它明确针对iOS (iPad)上的移动Safari。

在阅读了这里和其他地方关于HTML5音频在移动Safari环境中的几个"缺点",并尝试了一些"技巧"和技巧后,我陷入了Safari似乎只是(因为缺乏更好的词)崩溃的情况:

我可以在点击按钮A时播放声音A(它需要很长时间才能开始-我假设它正在下载[再次]?)然后点击按钮B将立即再次播放声音A。c键也一样。在某些情况下,它会播放不同的声音,有时甚至是正确的声音。但主要是声音a。使用的格式是。aiff,现在是。m4a。

在我自己写了几个小版本之后,我决定用Buzz库来处理声音加载/播放等。

有趣的是,他们的演示包含一个游戏,它几乎完全符合我的需要触发相同的错误行为。我甚至遇到了这样一种情况:移动Safari中的任何音频播放器都会在任何标签中播放Buzz演示游戏中的特定声音(!)。

我希望缓存清单可以帮助克服苹果的预加载限制,并强制应用程序在离线模式下按下按钮后播放声音。但在确认整个应用程序已被缓存后,我无法在离线模式下播放/听到任何声音。

有没有人设法让这样的工作?(-看到苹果处理某些事情的方式,我不期望有太多回应…)


更新1:

在这个答案中的例子导致同样的效果:如何在iPad上使用HTML5/Javascript合成音频


更新2:

更新iOS(以及Safari)似乎可以解决音频问题。不过,缓存清单似乎对音频文件没有影响。这些文件根本就不可用。

删除缓存清单后,应用程序可以正常工作,但将其添加到"主屏幕"并重新加载它会阻止音频播放。

我希望我能告诉你有一个神奇的公式,让你所有的html5媒体工作完美,但没有。现在手机对HTML5音频/视频的支持还很差;远远落后于它的桌面前辈。更糟糕的是,每个不同的平台对它的处理方式不同,而且大多数平台只在半最新的版本中支持它。

但是,有一些技巧可以让媒体文件在移动Safari中正常工作。为了解释它们,你需要了解它的一些缺点。


1)不能加载多个音频/视频文件

根据我的经验,浏览器一次只加载一个文件。如果你播放一个文件,去播放另一个,然后回来,它会重新加载那个文件。而且,虽然我自己没有尝试过,但我不相信缓存清单会在这里帮助您。

我要做的就是把我所有的音频文件合并成一个大的音频文件。然后,根据请求的音轨,我将播放位置移动到适当的起始位置并播放该音轨。然后,我将使用setInterval每隔几毫秒检查一次播放,以确定当前播放位置是否达到了音轨的末尾。一旦开始,我就暂停了。另外,我在每首歌之间给了自己几秒钟(2-3)的时间,以防手机的CPU负载太大,检查提要有点太晚。

2)你不能自动播放音频/视频文件

苹果在他们的HTML5媒体标签技术中内置了一个限制,即这些曲目只能在响应用户点击事件时加载和播放。这样,开发者就不会在你访问他们的网站时自动播放烦人的歌曲。

当我使用音频/视频标签时,我试图构建一个富媒体广告。所以我将音频/音轨加载与横幅点击事件挂钩,当你点击横幅并展开广告时。

我建议你应该做的是有一个小灯箱弹出,询问用户是否想要打开/关闭声音。你可以把你的加载函数附加到弹出框的点击事件上,不管用户是打开还是关闭声音。

就我个人而言,我使用load()函数的运气不太好。我会运行那个函数来加载音频,然后点击播放,它会再次加载。可能一直都是我做得不对,所以你可以证明我错了,让它正常工作。我告诉轨道播放,这样它就会开始加载,然后我使用setInterval来查看当前播放时间是否增加了几毫秒。一旦我注意到它开始播放曲目,我就会立即暂停它。

3) Audio/Video标签仅支持iOS 4.0及更高版本

没有技巧可以绕过这个。这就是事实。


当我在开发音频/视频标签时,这里有一些帮助我的网站:

http://www.w3.org/wiki/HTML/Elements/video
http://dev.w3.org/html5/spec-author-view/video.html媒体元素

祝你好运!

最新更新