2008年7月21日月曜日

ソフトキャプチャとffmpegでエンコ

キャプ板を使わずに動画をつくりたいな、と前から考えていたんですが
スクリーンショットを連続取得(ソフトキャプチャ)→ffmpegで動画化(エンコ)、の手順で製作できた!
というレビューです。

ためしに、うちで動いてるスクリーンセーバーを動画化してみました。こんな感じ。




おおまかな製作手順は以下の3ステップです。

25fpsで20秒間(画像500枚分)の動画を製作するとします。
スクリーンショットのダンプファイルはディレクトリ"src"以下に保存します。
スクリーンショットの画像ファイルはディレクトリ"seq"以下に保存します。
(あらかじめsrc、seqをmkdirしておきます。
それぞれ大量のファイル(500枚)が生成されるので別ディレクトリにしてます。)


(1) コマンド"xwd"を使って特定のウインドのスクリーンショットをダンプ
$ for ((i=0;i<250;i++)) ; do xwd -silent -id 0x2200042 -out src/`printf '%03d' $i`.wd ; sleep 0.040 ; done

※ 25fps = スクリーンショットの取得間隔 40ミリ秒 (sleep 0.040)
※ 特定のウインドを示す"-id"の引数"0x220042"はコマンド"xwininfo"で調べる



(2) コマンド"convert"を使ってxwdのダンプファイル(*.wd)をJPEGファイルに変換
$ for i in `ls src` ; do convert src/$i seq/`echo $i | sed 's/wd/jpg/'` ; done


(3) コマンド"ffmpeg"で連番JPEGファイルを動画に変換
$ ffmpeg -i seq/%03d.jpg -vcodec mjpeg -sameq out.avi


キャプ板といった特別なハードは必要なく、適当な速さ(上記例では40ミリ秒)で
スクリーンショットを連続取得さへできれば動画を製作できるのでお手軽でした。


環境

OS: Linux
debian-etch (i386)
linux-2.6.18
Xorg-7.1.1
xscreensaver-5.04
ffmpeg-SVN-r13618

※ xwdはパッケージ"xbase-clients"に含まれる
※ convertはパッケージ"imagemagick"に含まれる