草庐IT

ios - 移动版 Safari : Audio + cache manifest

coder 2023-09-23 原文

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

在阅读了这里和其他地方关于 HTML5 音频在移动 Safari 上的这种情况下的几个“缺点”并尝试了一些“黑客”和技巧之后,我陷入了 Safari 看起来很简单的情况(因为缺少更好的词)坏了:

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

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

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

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

有没有人设法让这样的东西以某种方式工作?(— 看到 Apple 如何处理某些事情后,我不希望有太多回应,尽管......)


更新 1:

此答案中的示例会产生相同的效果:How to synthesize audio using HTML5/Javascript on iPad


更新 2:

更新 iOS(以及 Safari)似乎解决了音频错误。不过,缓存 list 似乎不会影响音频文件。这些文件根本不可用。

删除缓存 list 后,应用程序运行正常,但将其添加到“主屏幕”并重新加载它也会阻止音频播放。

最佳答案

我希望我能告诉你有一个神奇的公式可以让你所有的 html5 媒体完美地工作,但没有。目前对 HTML5 音频/视频的移动支持非常差;远远落后于其桌面前辈。更糟糕的是,每个不同的平台都以不同的方式处理它,并且大多数平台仅在半新版本中支持它。

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


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

根据我的经验,浏览器一次只会加载一个文件。如果你播放一个文件,去播放另一个,然后回来,它会重新加载那个文件。而且,尽管我自己没有尝试过,但我认为缓存 list 不会对您有所帮助。

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

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

Apple 在其 HTML5 媒体标签技术中内置了限制,即这些轨道只会在响应用户点击事件时加载和播放。这样,开发人员就无法在您访问他们的网站时自动播放烦人的轨道。

当我使用音频/视频标签时,我试图制作一个富媒体广告。因此,当您单击横幅并展开广告时,我将我的音频/轨道加载到横幅单击事件中。

我建议您应该做的是弹出一个小的灯箱弹出窗口,询问用户是否要打开/关闭声音。您可以将加载函数附加到该弹出框的点击事件,无论用户是打开还是关闭声音。

就我个人而言,我在使用 load() 函数时运气不佳。我会运行该函数来加载音频,然后单击播放,它会再次加载它。可能一直是我没有做对,所以请随时证明我错了并让它发挥作用。我所做的是让轨道播放,这样它就会开始加载,然后我会使用 setInterval 来查看当前播放时间是否只增加了几毫秒。一旦我注意到它开始播放轨道,我就会立即暂停它。

3) 音频/视频标签仅在 iOS 4.0 及更高版本中支持

没有什么技巧可以解决这个问题。这只是事实。


当我使用音频/视频标签进行开发时,这里有一些网站对我有帮助:

http://www.w3.org/wiki/HTML/Elements/video
http://dev.w3.org/html5/spec-author-view/video.html#media-elements

祝你好运!

关于ios - 移动版 Safari : Audio + cache manifest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862391/

有关ios - 移动版 Safari : Audio + cache manifest的更多相关文章

  1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐