当前位置:  开发笔记 > 后端 > 正文

通过rails到Ipad提供mp4文件的正确方法是什么?

如何解决《通过rails到Ipad提供mp4文件的正确方法是什么?》经验,为你挑选了1个好方法。

我们在使用默认的rails 3应用程序在ipad上播放mp4时遇到问题.在Chrome和桌面上的其他浏览器中查看路径时,可以正确提供mp4.

这是我们的代码:

file_path = File.join(Rails.root, 'test.mp4')
send_file(file_path, :disposition => "inline", :type => "video/mp4")

我们点击0.0.0.0:3000/video/test.mp4观看视频,并在ipad上显示无法播放图标.我们已经尝试修改各种标题"Content-Length","Content-Range"等,但它们似乎不会影响最终结果.

我们也尝试过在某种程度上使用send_data

File.open(file_path, "r") do |f|
    send_data f.read, :type => "video/mp4"
end 

在Ipad上查看时,同一视频在公共文件夹中正常运行.

通过rails到Ipad提供mp4文件的正确方法是什么?



1> Colin Wagner..:

问题似乎是rails不处理ios流mp4所需的http范围请求.

这是我们的开发解决方案(使用thin作为我们的服务器):

  if(request.headers["HTTP_RANGE"]) && Rails.env.development?

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

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

    send_data IO.binread(file_path,length, offset), :type => "video/mp4", :stream => true,  :disposition => 'inline',
              :file_name => file_name

  else
    send_file(file_path, :disposition => 'inline', :stream => true, :file_name => file_name)
  end

最终,我们将使用nginx XSendfile来为我们的生产环境中的资产提供服务,因为上述解决方案比我们需要的要慢得多.


我认为代码中存在fencepost错误.我相信长度应该是`bytes.end - bytes.begin + 1` - 如果字节范围是从字节10到12,那应该是3个字节.另外,如果由于某种原因使用`send_data`,请务必在响应头中设置`Content-Length`.
推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有