我有一个使用Elastic Beanstalk部署的rails应用程序。我想使用ffmpeg来获取有关存储在S3上的音频文件的信息,并使用streamio-ffmpeg gem来使这更容易。
我已经在EC2实例上安装了ffmpeg,这在SSH进入实例时工作正常,并且在本地工作一切正常。我基本上是从S3下载文件,并将其存储在/ tmp文件夹中,然后通过streamio-ffmpeg gem调用它。
s3 = AWS::S3.new(
:access_key_id => ENV["AWS_ACCESS_KEY_ID"],
:secret_access_key => ENV["AWS_SECRET_ACCESS_KEY"])
object = s3.buckets[ENV["AWS_S3_BUCKET"]].objects[CGI::unescape(self.url)]
tempname = Digest::MD5.hexdigest(DateTime.now.to_s) + "." + self.file_format
File.open(Rails.root.to_s + '/tmp/' + tempname, 'wb') do |f|
f.write(object.read)
end
dl = Rails.root.to_s + '/tmp/' + tempname
audio = FFMPEG::Movie.new(dl)
当我收到此错误
时,错误发生在最后一行Errno::ENOENT (No such file or directory - ffmpeg -i /var/app/current/tmp/46951a3d16abb2e5fcf1da9e4cf8e0f3.flac)
我在这里做些蠢事吗?当我进入实例的SSH时,该文件应该是它应该在的位置,当我在命令行中运行该行时,它运行得非常好。
UPDATE 我不是Linux的专家,但是在tmp目录中运行ls -l给了我
-rw-r--r-- 1 webapp webapp 26445358 Apr 9 13:07 90da56d83822a0bf716b5dfaae27844b.wav
这些权限是否具有限制性?
非常感谢任何帮助
答案 0 :(得分:0)
首先,我只构造一次完整路径并在两个地方以相同的方式引用它,这样如果你改变了路径的组合方式,它们就不会失去同步。它还应该使它更容易阅读。
tempname = Digest::MD5.hexdigest(DateTime.now.to_s) + "." + self.file_format
temppath = Rails.root.join('tmp', tempname)
File.open(temppath, 'wb') do |f|
f.write(object.read)
end
audio = FFMPEG::Movie.new(temppath)
如果仍未找到,我唯一可以想到的是某种竞争条件,如果操作系统在关闭后不是很明显的话。虽然看起来不太可能。