Rails 4 - 如何提供视频?

时间:2015-12-07 22:36:28

标签: ruby-on-rails ruby-on-rails-4 video video-streaming html5-video

我正在将Rails 4用于我的Web应用程序,而我正在使用VideoJS来显示它,例如:

<video id="video1" class="video-js" controls preload="auto" width="640" height="264" poster="{{pCtrl.video.poster}}"  src="<%= @video.file %>">
        <source src="<%= @video.file %>" type="video/<%= @video.file.file.filename.last(3) %>">
</video>

我总是从VideoJS收到此错误:

VIDEOJS: ERROR: (CODE:3 MEDIA_ERR_DECODE) The video playback was aborted due to a corruption problem or because the video used features your browser did not support.

当我打开Chrome的开发工具时,我看到视频(340Mb .mp4文件)的下载状态为206(部分内容),仅为2.8 Mb。

我认为这是VideoJS的问题,但后来我尝试直接访问,例如“http://localhost:3000/uploads/video/file/glrbfmso1449450792.mp4

视频会播放几秒钟然后冻结,除非我刷新页面,否则它将无法播放。我认为它只能播放2.8 Mb。所以我认为它与WEBrick有关。

问题不在于视频文件,因为它在VLC上正常播放,而且在我使用Glassfish(用Java编程)时。

我的问题是:我应该在Rails或WEBrick中配置一些东西吗?我应该编辑哪些设置?或者这就是我经历的异常?

1 个答案:

答案 0 :(得分:6)

不要使用rails来提供视频文件。虽然像独角兽这样的服务器支持流媒体视频文件,但有几个原因可以解释它。这里有很多不同的联系。 rails应用程序通常应该花费不超过200毫秒来返回响应。当您的流式视频时,连接保持打开的时间不会太长。

为什么重要?考虑一下rails web服务器设计用于运行ruby代码并生成基于文本的输出。为了尽快做到这一点,非常聪明的人在编写诸如puma和raptor等服务器时会做出一些决定。在猛禽的情况下,我知道他们从未在运行时分配新对象,因为它太昂贵了。相反,它们维护一个对象池来处理传入的请求。请求将被移交,然后池中的对象被释放。对于短期请求来说这很好但是如果你的池中只有5个对象怎么办?只要有5个人在您的网站上观看视频,您的服务器就会很快耗尽连接。在发生这种情况时,您的网站将覆盖世界其他地区。有关猛禽如何工作的详细信息,请参阅http://www.rubyraptor.org/how-we-made-raptor-up-to-4x-faster-than-unicorn-and-up-to-2x-faster-than-puma-torquebox/

另一个原因是内存使用。与nginx相比,rails服务器正在进行更复杂和更高级别的处理。它具有智能,如连接数据库和处理会话。这些东西不是免费的,并且会在您的服务器上花费内存。前端服务器(如nginx)没有任何此类开销,可以完全相同的方式提供视频文件。

理想情况下,rails甚至不应该提供静态资产,例如JS和CSS。您可以更好地配置前向Web服务器,以直接对客户端执行此操作。您将减少开销。视频是另外一个问题。我建议看看为托管视频而构建的外部托管服务。亚马逊有S3,我相信还有其他一些。

同样的论点适用于WEBRick。它是一个甚至没有编译好处的开发服务器。它是纯粹的红宝石,所以它会比猛禽或美洲豹更糟糕。