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
此更改意味着:在1
st 秒而不是10
th 秒创建屏幕截图。因为第二部电影只有 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 完成后不保存