2011年1月4日火曜日

Ubuntuで動画を携帯向けにエンコードする

まず、Ubuntuに入っているffmpegのバージョンは古い、というより本家ffmpeg1日に1コミット以上という凄まじい早さで開発が進んでいるので、とりあえずSVNリポジトリからチェックアウトして、コーデックもろもろもインストールし、ffmpegのビルド&インストールも済んでいるものとします。

参考URLはこちら: http://ubuntu.futene.net/

変換は make で行おうと思ったのですが、ファイル名にスペースがあると面倒なことになりそうなので、Rakeを使うことにしました。といっても、ルールの定義をするだけな上に基本的なことも理解していないので、特に clean タスクの定義はぞんざいです。まぁ自分用なので、気に入らない方はスルーでおk。

さて、ffmpegへ渡すコマンドラインですが、ffmpegの取る引数はもう現代の魔法ですね。ボクも意味はほとんどわかりませんが、ネットの海から持ってきた情報をかき集めただけのものです。こんな感じ。

$ ffmpeg -i infile.avi -qmin 1 -qmax 51 -pix_fmt yuv420p -vcodec libx264 -coder 0 -vpre medium -bufsize 1000 -g 60 -vlevel 12 -qns -qpel -mbd 2 -s 320x240 -r 29.97 -b 512k -maxrate 5000 -acodec libfaac -ac 2 -ar 44100 -ab 96k -f 3g2 outfile.3g2

コーデックには一応フリーのものを使っています。で、これを2パスエンコードしようということで、Rakefileの登場なわけですね。

SRC = FileList["*mp4"]
DST = SRC.ext("3g2")
INSTALL_DIR = "/media/********************/Video/"


FFMPEG = "ffmpeg"
UNRECOGNIZED_OPTIONS = "-hq -bitexact -vprofile baseline -4mv -trell -aic -me full -fixaspect -muxvb 192 -muxab 64"
OPTIONS = "-qmin 1 -qmax 51 -pix_fmt yuv420p -vcodec libx264 -coder 0 -vpre medium -bufsize 1000 -g 60 -vlevel 12 -qns -qpel -mbd 2 -s 320x240 -r 29.97 -b 512k -maxrate 5000 -acodec libfaac -ac 2 -ar 44100 -ab 96k -f 3g2 -threads 8 -y"


task :default => DST


task :clean do
  DST.each do |file|
    if File.exists? file
      sh "rm '#{file}'"
    end
  end
  sh "rm -f *log"
  sh "rm -f *mbtree"
end


task :install => :default do
  raise RuntimeError, "マウントされてませんよ" if not File.exists? INSTALL_DIR
  DST.each{ |file| sh "cp '#{file}' #{INSTALL_DIR}" }
end


rule ".3g2" => ".mp4" do |t|
  sh "#{FFMPEG} -i '#{t.source}' -pass 1 #{OPTIONS} '#{t.name}'"
  sh "#{FFMPEG} -i '#{t.source}' -pass 2 #{OPTIONS} '#{t.name}'"
end

ほんとシンプルですが、 rake install とすると特定のディレクトリへコピーするようにしました。携帯への転送がWindowsじゃないと行えないので、NTFSパーティションに書き込むための措置です。それが見えなかったら RuntimeError 投げます。

というわけで自分用でした。

※転送しても見れなかったらごめんなさい。

押してねっ→BlogPeople「趣味の世界」ブログランキング

0 件のコメント:

コメントを投稿