HTML5本地存储音频元素源——是否可行?

29

最近我一直在尝试使用html5的音频和本地存储功能,但遇到了一个难题。

我想将音频元素的源文件缓存或本地存储,以便更快速和离线播放。问题是我不知道如何在当前实现下实现这一点。

我已经尝试了以下方法,使用WebKit:

  1. 创建一个清单文件来设置本地缓存,但是音频文件似乎不可缓存,可能是由于流式传输等原因

  2. 我也试图使用javascript将音频对象放入本地存储中,但由于内存问题(我认为),mp3文件的大小使得这个操作不可能。

  3. 我尝试使用数据URI和base64作为可以缓存的音频传输方式,但文件大小使它变得难以实现。而且,在WebKit中,音频元素好像不喜欢这种方式(在Mozilla中工作良好)

  4. 我尝试了几种方法将数据放入本地数据库存储中。但仍然面临着与其他情况相同的问题。

如果有任何其他想法,希望能听到大家对于使用WebKit中的缓存/本地存储实现离线播放的目标的建议。


我也一直在想这是否可能,并且想到了许多相同的方法。 - Jonathan
你有一些你已经尝试过的例子吗? - robertc
这个问题有什么进展吗?我也在尝试同样的事情,使用无法通过清单缓存的音频,因为它是在服务器上动态生成的(但不是流式传输)。 - Don Werve
6个回答

7

我一直在尝试在iOS(iPhone / iPad)上实现这个功能,但即使在缓存清单中,它也拒绝离线缓存音频文件。

它不会出错,但是如果通过JavaScript调用而没有控件,则会假装已经播放了音频元素。如果它嵌入了一个控件,则显示一个替代控件,上面写着“无法播放音频文件”。如果应用程序能够在线使用,则可以正常工作。

似乎它不会缓存音频,播放另一个声音资源似乎会导致它从内存中清除先前的资源 - 即使在线时这也是毫无价值的功能。

我尝试过将音频以base64编码为数据URI。这在桌面版Safari中有效(至少对于我使用的约20-30k的相当短的样本),但似乎在iOS上根本不被支持 - 它会静默地什么都不做,这非常让人恼火。

我不知道其他供应商 - Google Chrome曾经不支持音频数据URI,但也许他们已经修复了... - 看起来目前还不可能。

更新:与iPhone OS 3.x(已测试3.1.2)存在轻微差异:如果在离线Web应用程序中指定了音频元素但没有控件,则会显示一个非交互式控件,上面有一个非动画旋转器(它绝对不应该这样做)。我认为在iOS 4.x中已经修复了这个问题(下周应该会发布)。


是的,我测试了一些范围内包括非常小的声音文件,以防有特殊规则。我缓存的最大文件是180 KB,另一个是135 KB,还有一些25-35 KB的图像,这些都在我的缓存清单中指定,并且在我的iPad和iPhone上离线工作(包括打开飞行模式),所以我不确定15 KB限制来自哪里。 - Iain Collins
我对15 KB限制进行了快速阅读 - 看起来它是指浏览器在正常浏览期间缓存的内容,但似乎并不适用于具有缓存清单的离线Web应用程序,至少就我所知。 - Iain Collins

7
很久以前我问过这个问题,现在我想分享一下我们是如何解决的。基本上,我们使用了类似于这个的技术将数据编码成PNG格式,然后使用HTML5本地存储在移动设备上缓存图片,并在需要时访问它。虽然PNG文件很大,但这种方法对我们有效。

1
糟糕!我真的需要一个类似的解决方案,但这个网站已经挂了。 - clem
2
我真的很想了解更多关于这个技巧的信息。网站仍然无法访问..有没有其他来源可以获取这些信息?唉!我的好奇心快要害死我了! - micha
执行摘要:使用PNG中的R、G、B字节来存储您想要传输的任何数据的字节,然后在客户端加载它到img标签中,将其绘制到2D <canvas>中,然后使用canvas API将已绘制的内容转换为r、g、b、a颜色字节的数组。嘿,就这样!而PNG带有内置压缩!(gzip或其他什么?我忘了) - Blixxy
http://web.archive.org/web/20101213163349/http://audioscene.org/scene-files/yury/pngencoding/sample.html - Markus Johnsson

5

我花了一些时间尝试为我正在制作的游戏做这件事,由于据我所知浏览器(Firefox和Chrome)仍不支持音频元素的缓存,因此我想分享我找到的解决方案。

这里有一个解决方法:http://dougx.net/plunder/index.php#code

我可以确认它运行得相当不错,但可能更适合较小的文件。正如他在这里所描述的那样 (http://dougx.net/plunder/GameSounds.txt),您将音频编码为base64字符串,并为其添加data:audio/ogg;base64(或任何兼容的音频格式)头,然后HTML5音频就可以读取它们。由于这只是一个字符串,浏览器会将其缓存。


2

我觉得让清单方式起作用会更好,因为这似乎是本地缓存文件的最相关机制。

如果更改音频文件的HTTP头,例如Content-TypeExpires,会发生什么?如果更改文件扩展名,浏览器是否会有不同的行为?


Premasagar,感谢您的回答,但不幸的是,这两种方法似乎都没有任何效果:( - andrewdotcom
嗯,似乎一定有办法解决这个问题。请务必发布您找到的任何解决方案,因为这将是有用的知识。 - Prem

2

谢谢你的建议 - 我会去HTML5 Doctor看看他们有什么。 - andrewdotcom

1

将视频和音频文件添加到本地存储与iOS 4.3兼容。

我刚刚将一个视频和一个音频文件添加到清单中,它们都被下载到iPad的离线存储中。


请您详细说明您所做的事情?我已将 .mp3 文件添加到清单中,但它们没有被缓存,每次都需要下载。 - SondreB
我已经有一段时间没有在那上面工作了。我将文件添加到清单中,并在Apache配置文件中设置了过期标志。我不确定后者是否起作用了。 - matejk

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