【发布时间】:2016-02-18 02:20:36
【问题描述】:
我有一个 Rails 应用程序,我正在尝试使用以下标记播放 HTML5 视频:
不起作用:
<video controls poster="http://lvh.me:3000/assets/videos/myvideo.png">
<source src="http://lvh.me:3000/assets/images/videos/myvideo.mp4" type="video/mp4">
<source src="http://lvh.me:3000/assets/images/videos/myvideo.webm" type="video/webm">
<source src="http://lvh.me:3000/assets/images/videos/myvideo.ogv" type="video/ogg">
</video>
在 Safari 上,视频显示“正在加载...”,但从未播放,尽管它在 Chrome 和 Firefox 中按预期工作。起初我以为它可能是路径,但我尝试了绝对路径、相对路径和 Rails image_path 助手,但没有结果。
为了调试,我复制了这个 HTML5 视频标签示例,它在 Safari 中按预期播放(这里唯一的区别是源视频):
作品:外部托管的示例视频
<video controls poster="http://easyhtml5video.com/assets/video/Penguins_of_Madagascar.jpg">
<source src="http://easyhtml5video.com/assets/video/new/Penguins_of_Madagascar.mp4" type="video/mp4">
<source src="http://easyhtml5video.com/assets/video/new/Penguins_of_Madagascar.webm" type="video/webm">
<source src="http://easyhtml5video.com/assets/video/new/Penguins_of_Madagascar.ogv" type="video/ogg">
</video>
但是,当我采用完全相同的标记并在本地托管这些相同的文件时,视频在 Safari 中停止工作:
不起作用:本地托管的示例视频
<video controls poster="http://lvh.me:3000/assets/videos/Penguins_of_Madagascar.jpg">
<source src="http://lvh.me:3000/assets/videos/new/Penguins_of_Madagascar.mp4" type="video/mp4">
<source src="http://lvh.me:3000/assets/videos/new/Penguins_of_Madagascar.webm" type="video/webm">
<source src="http://lvh.me:3000/assets/videos/new/Penguins_of_Madagascar.ogv" type="video/ogg">
</video>
注意事项:
- Safari 控制台或 Rails 日志中没有出现错误;文件或任何内容上没有 404。
- 本地托管的视频可以在 Chrome 和 FF 中运行,所以我知道路径是正确的。
- 外部托管的视频在 Safari 中运行良好。
- 本地托管的视频可以在 Rails 应用程序之外的 Safari 中工作 - 我创建了一个静态页面并使用了上面的所有示例,效果很好。
基于所有这些,似乎 Safari 和 Rails 的某种组合阻止了视频加载。
【问题讨论】:
-
也许它与内容类型有关,您可以尝试将其添加到您的
mime_types.rbRack::Mime::MIME_TYPES.merge!( ".ogg" => "application/ogg", ".ogx" => "application/ogg", ".ogv" => "video/ogg", ".wemb" => "video/webm", ".mp4" => "video/mp4", ".m4v" => "video/mp4") -
@Chris 我添加了它并重新启动了 Rails,但没有运气。根据 curl 的说法,我确实看到 MIME 类型在没有此更改的情况下已经正确。如果您从某个重要的地方获取该列表,请注意其中有一个错字:
".wemb"。我在本地测试时将其更改为".webm"。 -
有趣的是,当我将应用程序部署到 Heroku 时,文件确实正确下载并开始播放。
-
好的,我在本地测试过,也有同样的问题。但是,当我将视频放在公共文件夹中时,它可以工作。您真的需要将视频放在资产内部吗?它可能适用于生产中的 heroku,因为你有
config.serve_static_files = false,这意味着文件由 nginx 或 apache 提供 -
@Chris 我按照 Heroku 的建议在生产中使用 rails_12factor gem。据我了解,这会强制设置
config.serve_static_assets = true。如果我真的需要它成为一种资产,这很难回答。有什么东西真的需要成为资产吗?据我了解,这样做的一个好处是我获得了资产摘要,允许在资产更改时自动缓存清除。这对我来说似乎是件好事。
标签: ruby-on-rails video safari html5-video