代码之家  ›  专栏  ›  技术社区  ›  Jan

在进程结束前重命名载波扩展

  •  1
  • Jan  · 技术社区  · 12 年前

    我有一个音频文件,可以通过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文件扩展名来处理mp3。(在我的情况下输出.mp3)

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

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

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

    def完整文件名(for_file=文件)
    super.chomp(文件.extname(超级))+'.mp3'
    终止
    

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

    如何重命名临时Carrierfile名称?

    1 回复  |  直到 12 年前
        1
  •  4
  •   Taavo    12 年前

    您可以通过使用临时文件(带有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))