uzullaの日記

本家:about等:Twitter
 | 

2008-02-22

Rubyからffmpegを叩くライブラリ

| 23:00

動画ファイルを入力して、色々な形式に変換する機能を作っている。

メールで写ムービーを送信したら作成されるとかも作る予定。

class FfmpegWrapper
  # 各機種用のProfile
  @@profiles = {
    
    # Docomo 3gp High 
    'docomo_high.3gp' => { 
      :f       => '3gp', #file suffix
      :vcodec  => 'mpeg4', # codec
      :s       => '320x240', # resolution
      :r       => 15, # frame rate
      :b       => '128k', # video bit rate
      :acodec  => 'libamr_nb', # audio codec
      :ab      => '4.75k', # audio bit rate
    },
    
    # Au 3g2 High 
    'au_high.3g2' => { 
      :f       => '3g2', #file suffix
      :vcodec  => 'mpeg4', # codec
      :s       => '320x240', # resolution
      :r       => 15, # frame rate
      :b       => '80k', # video bit rate
      :acodec  => 'libamr_nb', # audio codec
      :ab      => '4.75k', # audio bit rate
    },
    
    # PC flv High 
    'pc_high.flv' => { 
      :f       => 'flv', #file suffix
      :vcodec  => 'flv', # codec
      :s       => '320x240', # resolution
      :r       => 30, # frame rate
      :b       => '384k', # video bit rate
      :acodec  => 'libmp3lame', # audio codec
      :ar      => '11025',
      :ab      => '32k', # audio bit rate
    },
    #適当に追記する
    
  }
  
  def initialize()
  end
  
  def setandgo(setting)
    set(setting)
    run()
  end
  
  #パラメータ設定
  def set( setting )
    #setting{ :ffmpeg  => '/path/to/ffmpeg', 
    #         :ifile   => '/path/to/inputfile',
    #         :ofile   => 'outputfile', 
    #         :profile => 'targetName', }

    @ffmpegOptions = Array.new
    @@profiles[ setting[:target] ].each{ |k,v|
      @ffmpegOptions.push(%Q{ -#{k} #{v}})
    }
    
    @cmd = Array.new
    @cmd.push %Q{#{setting[:ffmpeg]} -i "#{setting[:ifile]}" #{@ffmpegOptions} "#{setting[:ofile]}" }
  end
  
  # @cmdを実際に実行
  #エラー処理などを全く行っていない。 FIXME
  def run()
    stdout = ""
    io = IO.popen("#{@cmd}", "r");
    io.each("\n") {|line|
      stdout << line
    }
    io.close
    return stdout
  end

  # 登録プロファイルのKeyリストを返す
  def profiles()
    rtnarr = Array.new()
    @@profiles.each{ |k,v|
      rtnarr.push(k)
    }
    return rtnarr
  end
  
end


#以下利用例
#1ファイルから全てのプロファイルへ変換
ffmpeg =  FfmpegWrapper.new()
targets = ffmpeg.profiles()
      
setting = Hash.new
setting[:ffmpeg] = 'c:/bin/ffmpeg/bin/ffmpeg.exe'
setting[:ifile] = 'c:/tmp/' + 'testfile.3gp' #入力ファイル
     
targets.each{ |target|
  setting[:ofile] = 'c:/tmp/' + 'testfile.3gp' + "_" + target #出力ファイル名
  setting[:target] = target
  ffmpeg.setandgo( setting )
}

どうでもいいけど、Rubyハッシュなどの記述で最後に,があってもエラーにならないから楽でいいね(コピペ的な意味で)

 |