我试图在safari上播放一个wav文件。几乎与此相同的问题:playing a WAV file on iOS Safari
但接受的答案并不奏效。我使用带有apache和phusion乘客的rails服务器。音频文件可以在Chrome上播放,但不适用于任何游戏(桌面,移动和uiwebview)。
我使用
在rails中发送文件send_file filename, :type => "audio/x-wav", :disposition => "inline"
从其他堆栈溢出q& a,我尝试将Content-Range和Content-Length标头添加到响应中
size = File.size(filename)
response.header["Content-Range"] = "bytes 0-#{size-1}/#{size}"
response.header["Content-Length"] = "#{size}"
我收到的错误非常不明显"无法加载资源:插件已处理加载"
以下是回复标题
x-runtime 0.589797
Date Wed, 17 Aug 2016 16:38:49 GMT
X-Content-Type-Options nosniff
Server Apache/2.2.15 (CentOS)
X-Powered-By Phusion Passenger 5.0.7
Status 200 OK
Content-Type audio/x-wav
content-range bytes 0-3243/3244
Cache-Control private
Content-Transfer-Encoding binary
Content-Disposition inline; filename="eng-182-msg0026.wav"
Connection close
Content-Length 3244
X-XSS-Protection 1; mode=block
x-runtime 0.589797
答案 0 :(得分:1)
当请求直接链接到媒体文件时,这将起作用。但我是通过控制器请求这个。 Safari正在为特定范围制作多个http请求。服务器每次都响应整个文件,这就是它失败的原因。
令人讨厌的是,Safari网络检查员决定不显示"范围"网络请求中的标头。它会显示其他http标题,但在这种情况下不是最重要的标题...
无论如何,简短的回答,回复每个请求所需的正确字节范围。
答案 1 :(得分:0)
我遇到了同样的问题,在Safari上播放音频文件不起作用,但在Chrome和其他所有浏览器上,一切都按预期工作。
在响应标头中设置正确的Content-Range解决了我的问题。我使用了分叉的gem send_file_with_range,其中包含对Rails 5.1的修复。
我推荐这个gem,因为这个gem中的代码非常简单,而且这个解决方案看起来最简单,最快捷。
注意:此解决方案特定于Ruby on Rails开发人员,但一般解决方案是在响应标头中为每个请求设置正确的Content-Range。
我希望这会对某些人有所帮助。