使用带有carrier_wave gem的FFMPG将WAV转换为MP3

时间:2015-09-30 23:52:55

标签: ruby-on-rails ruby carrierwave

在我的“wave_uploader.rb”脚本中,我有以下代码:

class PictureUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick
  include CarrierWave::MimeTypes

  version :wav do
    process :convert_to_mp3

    def convert_to_mp3
      temp_path = Tempfile.new([File.basename(current_path), '.mp3']).path

      `ffmpeg -t 15 -i #{current_path} -acodec libmp3lame -f mp3 #{temp_path}`

      File.unlink(current_path)
      FileUtils.mv(temp_path, current_path)
    end

    def full_filename(for_file)
      super.chomp(File.extname(super)) + '.mp3'
    end
  end

我正在尝试将WAV文件转换为20秒的MP3文件,并在转换后删除WAV文件。上面的代码运行,但我找不到转换后的MP3文件,所以我猜它不能正常工作。

在wave_uploader.rb的末尾,我有一些代码在处理后返回唯一的名称,但我注释掉了代码,认为下面的代码导致WAV文件不能转换为MP3。

# def filename
#   "#{secure_token}.#{file.extension}" if original_filename.present?
# end

# def secure_token
#   var = :"@#{mounted_as}_secure_token"
#   model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
end

如何使这项工作正常,我们将非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我看到的一件事是:

`ffmpeg -t 15 -i #{current_path} -acodec libmp3lame -f mp3 #{temp_path}`

如果ffmpeg不在您的路径中,那么操作系统将无法找到它,并且会返回错误,但是,因为您正在使用反引号,操作系统无法返回字符串STDERR,它将显示错误。反引号只返回STDOUT。

要调试此命令,请从命令行尝试:

which ffmpeg

如果找到ffmpeg,而不是:

`ffmpeg -t 15 -i #{current_path} -acodec libmp3lame -f mp3 #{temp_path}`

尝试:

puts `which ffmpeg`

看看输出是什么。

我怀疑它不在您的路径中,因此您必须找到它的位置并提供它在磁盘上的完整路径。

此外,最好移动原始文件,将新文件移动到原始文件的名称,然后删除原始文件或将其保留为“.bak”文件。这样就可以保留原始文件,直到所有代码都被处理完毕:

  FileUtils.mv(current_path, current_path + '.bak')
  FileUtils.mv(temp_path, current_path)
  File.unlink(current_path + '.bak') # <-- optional