Errno :: ENOENT:从S3中查找视频的持续时间没有这样的文件或目录

时间:2015-12-31 09:51:18

标签: ruby-on-rails amazon-s3 ffmpeg

在视频轨道中使用gem paperclip-ffmpeg。它工作正常但是当我在几秒钟内找到视频的持续时间时它会给我一个错误

Errno::ENOENT: No such file or directory - the file 'http://getpayad-dev.s3.amazonaws.com/ads/videos/000/000/014/original/Ufone_Tarzan_commercial_%28Ufone_Network_Quality%29_most_Funny_Ad.mp4?1451555000' does not exist
from /home/des0071/.rvm/gems/ruby-2.2.1/gems/streamio-ffmpeg-1.0.0/lib/ffmpeg/movie.rb:11:in `initialize

我的代码是

movie  = FFMPEG::Movie.new("#{self.video.url}")

2 个答案:

答案 0 :(得分:2)

嗯,FFMPEG :: Movie.new定义可以在这里找到:streamio-ffmpeg/movie.rb

raise Errno::ENOENT, "the file '#{path}' does not exist" unless File.exists?(path)
#ruby 2.2.0p0 (2014-12-25 revision 49005)
File.exists?("http://getpayad-dev.s3.amazonaws.com/ads/videos/000/000/014/original/Ufone_Tarzan_commercial_%28Ufone_Network_Quality%29_most_Funny_Ad.mp4?1451555000")
=> false

问题在于ruby的文件类。所以我尝试了这个:

   File.exists?("http://www.google.com")
   => false

好的,所以要么google不在线,要么File不能将URI作为参数。

  

文件是程序可访问的任何文件对象的抽象,并且与类IO密切相关文件包括模块FileTest的方法作为类方法,允许您编写(例如)File.exist?(&#34) ; FOO&#34)。   Class: File Ruby 2.2.0

所以,File Class真的是IO的孩子,IO说什么?

  

本节中的许多示例都使用File类,它是IO的唯一标准子类。这两个班级密切相关。与File类一样,来自IO的Socket库子类(例如TCPSocket或UDPSocket)。   Class:IO Ruby 2.2.0

看起来错误的原因是由于继承,或者因为gem不是设计为通过http流式传输文件。

答案 1 :(得分:1)

正如之前的回答建议,ffmpeg似乎无法通过HTTP获取文件 - 它期待本地文件。

根据文件的编码方式,文件的开头或末尾可能包含元数据。

随后可能的方法是获取文件的第一个或最后一个~100KB并检查那里的MOOV原子/元数据。