Rails 4 - 如何投放视频?

Rails 4 - How to serve video?

我正在为我的 Web 应用程序使用 Rails 4,我正在使用 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.8Mb。

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

视频会播放几秒钟,然后停止播放,除非我刷新页面才能播放。我认为它只能播放加载的 2.8 Mb。所以我认为这与WEBrick有关。

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

那么我的问题是:我应该在 Rails 或 WEBrick 中配置什么吗?有什么我应该编辑的设置吗?或者这就是我正在经历的异常情况?

不要使用 rails 提供视频文件。尽管 unicorn 等服务器支持流式视频文件,但有几个原因表明它不是一个好主意。这里有截然不同的联系。 rails 应用通常不会超过 ~200 毫秒来 return 响应。当您的流媒体视频时,连接保持打开更长时间的情况并不少见。

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

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

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

同样的论点也适用于 WEBRick。它是一个开发服务器,甚至没有被编译的好处。它是纯粹的 ruby,所以它比说猛禽或美洲狮还要糟糕。