Rails:Paperclip 为相似的视频产生不同的结果

Posted

技术标签:

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

我正在使用Paperclip Gem 在我的 Rails 应用程序上处理视频上传。我已经按照一些other *** 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.

【问题讨论】:

你能把这两个样本上传到某个地方吗? @aergistal test1.mp4 和 test2.mp4 【参考方案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 可能(似乎)不起作用的原因是:

    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 原子移动到文件的开头。

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

    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"]

希望这对你有用:-)

【讨论】:

以上是关于Rails:Paperclip 为相似的视频产生不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Paperclip 不显示图像,而是在 rails 中显示带有 amazon s3 的标题?

在 Paperclip 和 Rails 4 中将 Jcrop 坐标转换为 convert_options

如何在不保存原始图像的情况下保存图像 URL 的裁剪图像? (在 Rails 中使用 Paperclip 或其他插件)

Rails 6,Paperclip,S3,s3_direct_upload @attachment.save 在 s3_direct_upload 完成后不保存

Rails 3 和 Paperclip:“'identify' 命令无法识别”

Rails:Amazon S3 + Paperclip 不在数据库中存储任何内容?