昨日こんな動画があることを教えて貰った。
GVimでとある科学の超電磁砲OP「only my railgun」‐ニコニコ動画(9)「えっ?どうやってるの?」って思われた方もいるかもしれない。
たくさんプログラミングしてった。ちょっと疲れた。ちなみに、これはリアルタイムのレンダリングではない。私自分のパソコンには2fpsぐらいです。64色でお楽しみ。感想はこちら(中国語だが):http://www.fancymouse.net/blog/2009/12/20/gvim_railgun_op/
http://www.nicovideo.jp/watch/sm9143016
実はコラでもなんでもない。Vimで出来る(正しくはGVim)。Vimは画像を表示する事は出来ないが、シンタックスハイライトにかけては他のエディタと比べ物にならないくらい優秀だ。XPM画像ファイル(X Pixmap)はASCIIだけで書かれたC言語のヘッダファイルなのだが、先頭に色定義、後続にその定義を使ったデータ部となっている為、VimではXPM画像ファイルを開くとさも画像ファイルであるかの様に見える。もちろんフォントの大きさが1ドットになるので若干縦長にはなる。
この仕組みを使えば、Vimで動画が再生出来る。もちろん↑の動画作者も言ってる通り、リアルタイムじゃないのであしからず。なおこの手順は↑の動画を見てmattnが勝手に推測した方法なので若干手法が違うかもしれない。
まず、動画を再生しそれを連番画像ファイルとして出力する。ここではmplayerを使うと楽。
# mplayer /home/mattn/動画/仮面ライダーディケイド変身.avi -vo jpeg
放っておくとどこまでもjpeg画像を出力しまくるので適度に止める。次にこのjpegファイル群をxpm画像ファイルへ変換する。こんな場合はシェルスクリプトにお任せ。
mkdir out
/bin/ls *.jpg |\
while read -r line; do
FNAME=`basename $line .jpg`
convert $line -resize 150x100 out/$FNAME.xpm ;
done
convertはImageMagickに付属されている。さて、outディレクトリにxpmファイル群が出力されたので、一枚適当に開いて最下行までを表示した時に全てのドットが収まる様に、フォントとウィンドウ幅を調整する。フォントが小さすぎてウィンドウ幅が分からないのであれば、「:new」して無名バッファを作り、挿入モードで「<c-r>=&columns . " " . &lines . " " . &guifont」と入力してどこかに保存してしまえばいい。
表示しきったらこれをGVimの枠付きでキャプチャを取る訳だが、数十枚ある画像を手作業ではやってられない。ここも自動化する。
以下のvimスクリプトを書いた。
set guifont=Symbol\ 1
set columns=300
set lines=90
unlet! images
let images = split(globpath(".", "*.xpm"), "\n")
for image in images
exe "e ".image
normal! G
redraw
silent! exec "!scrot -u"
bw!
endfor
なるべく正方形に近いフォントを選んだつもり。scrotはスクリーンキャプチャで、何時も愛用している物。デスクトップ全体とかエコじゃない事はしたくないので「-u」オプションを付けて、フォーカスのあるウィンドウだけキャプチャを取った。これを実行すれば、現在のフォルダからxpmファイル群を一つずつ開き、最下行に移動し、画面更新後にキャプチャを取得、バッファを終了、という動きになる。ちなみに今回の例だと、1画像を表示仕切るのに4秒程度かかったので、合計すると数十分掛かった。
さて、これでscrotが生成したキャプチャが出来上がるので、合成する。こんな場合はmencoderが役に立つ。
mencoder mf://*scrot.png -mf w=320:h=335:fps=5:type=png -ovc copy -o output.avi
一瞬にしてoutput.aviが生成された。fpsは適度に調整が必要。
それでは出来上がった物を...
動画ファイルはこちらのAVIかWebMで。
苦労した割には、ちょっぴり過ぎて悲しいですね。
みなさんもGVimで動画再生してみませんか?