在进程结束之前重命名carrierwave扩展

时间:2013-09-02 08:50:35

标签: ffmpeg carrierwave fog

我有一个通过carrierwave上传的音频文件。我想在处理之前重命名current_file。

当我处理版本时,通常我会通过

重写文件扩展名
def full_filename(for_file=file)
  super.chomp(File.extname(super)) + '.mp3'
end 

但这将在版本创建过程后执行。

如何在保存之前制作版本并将其重命名。

更具凝聚力:

我正在使用ffmpeg将WAV文件转换为MP3。

FFMPEG需要一个inputfile(-i inputfile.wav)和outputfilename,它需要mp3 fileextension来处理mp3。 (在我的例子中是output.mp3)

如何在保存之前重命名扩展程序?

ffmpeg -i inputfile.wav -acodec libmp3lame -f mp3 watermarked.mp3
         HOW CAN I RENAME THE EXTENSTION BEFORE IT GET SAVED? ^^^

上面的剪辑(-f强制编解码器和格式)不是它的工作和

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

发生得太晚(处理后完成)

如何重命名临时Carrierfi​​le名称?

1 个答案:

答案 0 :(得分:4)

您可以使用临时文件(带有mp3扩展名)解决此问题,然后将其移动到可由full_filename按预期处理的位置:

version :mp3 do
  process :convert_to_mp3

  def convert_to_mp3
    temp_path = ... # generate good temp path, ending in '.mp3'

    `ffmpeg -i #{ current_path.shellescape } -acodec libmp3lame -f mp3 #{ temp_path.shellescape }`

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

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

生成temp_path的一些选项,供您测试和决定:

  • current_path.chomp(File.extname(current_path)) + '.mp3'
  • Tempfile.new([File.basename(current_path), '.mp3']).path
  • Rails.root.join('tmp', 'mp3', Dir::Tmpname.make_tmpname([original_filename,'.mp3'], nil))