【问题标题】:Rails: Paperclip produces different results for similar videosRails:Paperclip 为相似的视频产生不同的结果
【发布时间】:2016-11-25 21:13:13
【问题描述】:

我正在使用Paperclip Gem 在我的 Rails 应用程序上处理视频上传。我已经按照一些other stackoverflow questions 和外部教程中的说明进行视频上传。但是,目前系统有一个奇怪的故障,我不明白。

当上传两个不同的视频时,该应用将能够显示缩略图,其中一个不显示视频,另一个不显示缩略图但视频。

两个视频使用相同的编解码器,长度大致相同,但尺寸和文件大小略有不同。

当我上传它们时,test1 有一个缩略图,但我的浏览器不会加载视频文件。它存在于我的文件系统中,但 Chrome 不会播放它。

test2 的情况正好相反。它在我的文件系统中的缩略图是零字节,但视频在我的浏览器中加载正常。

这是我的对象的回形针上传参数:

has_attached_file :video, :styles => {
    :medium => { :format => 'mp4' },
    :thumb => { :geometry => "500x500#", :format => 'jpg', :time => 10 }
  }, :processors => [:transcoder]
validates_attachment_presence :video
validates_attachment :video, content_type: { content_type: ["video/mp4", "video/mov", "video/wav", "video/wmv"] }

I've created a Github repo with an example app that reproduces the issue, at least on my system.

【问题讨论】:

标签: ruby-on-rails video ffmpeg paperclip


【解决方案1】:

问题出在::time => 10参数

改成::time => 1

此更改意味着:在1st 秒而不是10th 秒创建屏幕截图。因为第二部电影只有 10 秒的长度,所以在第一部电影中有 12 秒的长度。因此第一部电影有截图,第二部电影没有截图,而是使用了之前的截图。

希望对您有所帮助!

【讨论】:

  • 感谢您的评论。您的解决方案完美运行,但它只解决了我的问题的一半。你知道为什么第一个视频没有加载吗?
  • @Polyov 它加载得很好。您可以通过在文件中添加p video.attachment.path 来检查它并运行它gist.github.com/itsNikolay/9eeb4b7217cd894c24c825fa6a2c8dba
  • video.attachment.path 返回正确的路径,但视频仍然无法在我的浏览器中播放,即使我导航到该路径。
  • @Polyov 在您计算机上的视频播放器(不是浏览器)中播放效果是否良好
  • 好的,感谢您的帮助。那么,这一定是我的系统特有的问题。
【解决方案2】:

我能够在多个浏览器中毫无问题地播放这两个文件。

但是,test1.mp4 可能(似乎)不起作用的原因是:

  1. test1.mp4 在文件末尾有 moov 原子:

    AtomicParsley test1.mp4 -T
    Atom ftyp @ 0 of size: 32, ends @ 32
    Atom free @ 32 of size: 8, ends @ 40
    Atom mdat @ 40 of size: 1310866, ends @ 1310906
    Atom moov @ 1310906 of size: 9926, ends @ 1320832
    

    这意味着浏览器必须完全下载文件才能播放。如果您的连接速度较慢,则可能需要一段时间并且看起来好像无法正常工作。

    test2.mp4 在文件开头有 moov 原子,这意味着它可以在下载完成之前播放:

     AtomicParsley test2.mp4 -T
     Atom ftyp @ 0 of size: 32, ends @ 32
     Atom moov @ 32 of size: 7464, ends @ 7496
    

    您可以使用ffmpeg movflags faststart 选项或qt-faststart 工具将moov 原子移动到文件的开头。

    如果您使用的是本地文件系统,这应该不是问题,请参见下文。

  2. test1.mp4 使用Main H.264 配置文件,而test2.mp4 使用Constrained Baseline 配置文件。这在某些移动设备上可能是一个问题,因为Baseline 配置文件拥有最多的支持。但是,对于较新的设备,这应该不是问题。

    您可以尝试使用 Baseline 配置文件重新编码,看看是否是问题所在。

【讨论】:

  • 感谢您的洞察力。使用我上面的 Dropbox 链接的视频都可以在浏览器中播放。当我尝试使用 rails 提供的链接在我的文件系统上观看file1.mp4 时,问题就出现了。其次,我尝试使用 Handbrake 重新编码 test1.mp4 以使用 Baseline,当我使用我的应用上传它时没有区别。
【解决方案3】:

请点击此链接https://github.com/thoughtbot/paperclip/wiki/Thumbnail-Generation

我认为可以通过这种方式对视频进行验证:

validates_attachment :video, :presence => true

而不是在没有它的情况下再做一次。

对于我关注的图片:

validates_attachment :attachment, content_type: { content_type: ["image/jpeg", "image/gif", "image/png"] }

希望这对你有用:-)

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2014-10-18
    • 2019-06-16
    • 2018-10-31
    相关资源
    最近更新 更多