Blank File

LinuxとかPythonとかVimとか、趣味でいじる感じで

Linuxでgifのscreencastを作る

今日公開したVimのプラグインの紹介のために、初めてScreencastをgifで作ってみました。意外とLinuxGifアニメを簡単に作るための情報が少なく感じたので書いておきます。わりと面倒でした。きっともっといい方法があると思うので、ご存知の方は教えていただけると幸いです。

方針

gifでのScreencastの作り方は以下のような方法があるのではないかと思います。

  1. 動画を作ってgifに変換
  2. 静止画像をたくさん作ってまとめてgifに変換
  3. 便利なソフトで画面をキャプチャするとgifで出力される

探すと「動画とってImagemagickgifに変換」的な話が多かったのですが、私は3がいいです。

探してみた

How to create animated GIF images of a screencast? - Ask Ubuntuにたどり着きました。ここの二番目の回答が私が求めていたものに近かったです。

ということで、スクリーンキャプチャしてGif出力してくれるbyzanzをインストールします。Debian wheezyでは初めからリポジトリに登録されていました。

sudo apt-get install byzanz

これでインストールはできました。

使ってみた

とりあえず回答にあったとおりに使ってみました。おもむろに端末上で

byzanz-record --duration=15 --x=200 --y=300 --width=700 --height=400 out.gif

と実行。

見た目には何も表示されませんでしたが、15秒後くらいに制御が戻って来ました。カレントディレクトリにout.gifファイルも出力されています。どうやら画面の左上(200px, 300px)の点から幅700px、縦400pxの領域が15秒間録画されたようです。ヘルプにもそう書いてあります。

とりあえず画面を録画してGifに出力できています。しかも画質は適度でいい感じです。ファイルサイズも手頃です。

しかし、録画領域がピクセル指定な上に範囲すら表示してくれないのは少し厳しいです。GTKだともう少しオプションがあるようですが、私はDebianKDEをかぶせています。他の人も困っていました

強引になんとかした

結局、アナログな方法で対応しました。

  1. ピクセル単位でグリッドの入っている画像を用意
  2. 画面と同じ解像度の画像を作り、左上の任意のpixel(x, y)に印をつけ、壁紙にする
  3. 撮りたいものをグリッド入り画像にあわせて目的のサイズ(w, h)に調整する
  4. 撮りたいものの左上を壁紙上の点(x, y)にあわせ、下記コマンド実行
byzanz-record --duration=15 --x=x --y=y --width=w --height=h out.gif

録画時間(duration)やx,y,w,hは実際の値(pixel)を入れてください。

グリッド入り画像としては、適当なサイズだけならばwikpediaの解像度のページの画像が良さそうでした。壁紙側は適当に作りました。

で、作ったスクリーンキャストがこちらです。

f:id:h-miyako:20140126180646g:plain

600x480で15秒間、ファイルサイズは約200kBです。

Githubに公開してから気づきましたが、右端がバッサリ切れてました。おそらく横幅は640に合わせていたんだと思います。悲しいです。

正直ffmpegで動画をとってImagemagickgifに変換するほうが手軽だったと思います。その方法だと画質とファイルサイズの兼ね合いが若干心配ですが。

PythonあたりでPyQtか何かで枠を表示してbyzanz呼ぶフロントエンド作ればいいような気がしてきました。そういうのすでにありそうですね。ご存知の方いたらコメント欄などで教えていただけると幸いです。