Rails + X-Sendfile为Ipad提供大型视频

sis*_*ssy 15 ruby-on-rails x-sendfile video-streaming ipad ruby-on-rails-4

我有一个应用程序服务大(几百MB)的视频文件,它在桌面浏览器上完美运行,在Apache上使用Rails + X-Sendfile.一个重要的要求是这些视频必须是私有的,并且只对已登录的用户可见,因此这就是我使用Rails为其提供服务的原因.

一切都与其他设备完美配合.我以这种方式提供视频:

response.headers["X-Sendfile"]=  filename
send_file filename, :disposition => :inline, :stream => true, :x_sendfile => true
Run Code Online (Sandbox Code Playgroud)

但是Ipad的请求需要字节范围头.解决方案(不能完美运行)是这样的:

size = File.size(filename)
bytes = Rack::Utils.byte_ranges(request.headers, size)[0]
offset = bytes.begin
length = bytes.end  - bytes.begin

response.header["Accept-Ranges"]=  "bytes"
response.header["Content-Range"] = "bytes #{bytes.begin}-#{bytes.end}/#{size}"

send_data IO.binread(filename,length, offset), :type => "video/mp4", :stream => true, :disposition => 'inline', :file_name => filename 
Run Code Online (Sandbox Code Playgroud)

有了这个解决方案,我遇到了大于50mb视频的问题,而且更重要的是,我给了rails一个不应该有的责任.通过x-sendfile模块处理流的繁重负载应该是apache.但我不知道如何.该send_data方法没有x-sendfile参数,涉及send_file方法的解决方案不起作用.

我发现这两个问题与我的相似,但它们不起作用:rails media file stream通过send_data或send_file方法接受字节范围请求,通过rails向Ipad提供mp4文件的正确方法是什么?

关于发生了什么的任何线索?我几周以来一直在努力,我需要让它发挥作用.欢迎其他可行的解决方案.

Noa*_*qua 1

这可能完全无关,因为我使用 nginx 作为服务器,但如果它仅不适用于 ios,请查看此博客文章。Apache 可能有类似的解决方案。

从某种意义上说,我必须添加一个在内部重定向到文件夹路径的代理标头。无论这看起来多么愚蠢,苹果公司都存在某种隐私问题,因此对于播放音频和视频文件来说这是必要的。再次不确定这是否是您的解决方案,但对于 nginx 来说,这确实创造了奇迹,治愈了我长达一个月的头痛。