【发布时间】:2015-02-10 07:22:15
【问题描述】:
这几天我一直在努力让它正确运行,但没有运气。
我创建了一个自定义音频播放器,它可以访问 S3 Amazon 服务器上的 MP3。音频播放器具有由 Javascript 启用的自定义控件,以及由 Web Audio API 实现的 Audio Visualizer。
现在我遇到的问题是:在 Chrome 上工作正常。 Safari 说它无法运行 Web Audio API,但音频仍会播放。在 Firefox 中,整个事情都关闭了。点击播放...什么都没有。我认为这是一个 CORS 问题,所以我们在服务器上设置了正确的标头,但仍然没有。但是...如果我停用 Web Audio API 可视化工具,那么我可以让播放器正常播放。
http://jsfiddle.net/murphy1976/yqqf7uL1/1/
这是我的 jFiddle。我已经用 cmets 将音频播放器控件脚本与 Visualizer 脚本分开了,这样您就可以看到它在 Firefox 中的工作方式,以及它在 Firefox 中的不工作方式。
我在某处读到,我遇到的这个问题可能是 Firefox 的一个错误。我只是想确定一下,这样我就可以停止为此敲打我的头骨了。
我可以在这里给 CORS 打电话吗?:
<source crossorigin="anonymous" src="audioFiles/35022797.mp3" id="srcMP3" type="audio/mp3">
【问题讨论】:
-
您的服务器是否使用
Access-Control-Allow-Origin: *响应标头提供音频资源?通常,脚本无法读取跨域资源,除非在提供资源时来自服务器的 CORS 响应标头允许。 (如果您没有提供 CORS 响应,Chrome 似乎在此处错误地允许您阅读资源。) -
@apsillers 我们已按照此处列出的正确步骤进行操作:docs.aws.amazon.com/AmazonS3/latest/dev/cors.html,但仍然无法获取该标头。我们只能得到一个错误:拒绝访问。我想我对为什么在 Chrome 或 Safari 中没有收到此错误感到困惑。
-
根据this bug,Firefox 似乎忽略了应该允许它读取跨域音频文件的 CORS 标头。似乎 Chrome 过于宽松(即使缺少 CORS 也可以播放),而 Firefox 过于严格(即使存在 CORS 也不播放)。是否可以在与播放器相同的来源上托管媒体?
-
很遗憾,由于我们业务的性质,这不是一个选项。如果它是一个错误,那么它就是一个错误,我们只需要等到它被解决或修复。再次感谢您的帮助。
-
Web Audio API 有一段路要走,才能看到广泛成熟的实现(该错误已存在一年多)。您现在可以实施的一个可能的解决方案是使用同源reverse proxy 来获取媒体(例如,
http://myorigin.com/fetch?path=http://otherorigin.com/song.mp3)。您需要设置一个服务器来获取媒体并在您的源上提供它。 (请注意,它不适用于受凭据保护的内容。)
标签: javascript html firefox audio cross-domain