Linuxでなんちゃって動画スクリーンキャプチャ
タグ: linux / 初版公開: 2014-05-02

Linuxでデスクトップを動画でスクリーンキャプチャするにはrecordmydesktopなどのツールを使う方法がある。 しかし、このような本格的なツールを使わずとも、xwdconvertそれにちょっとしたスクリプトを使えば、スクリーンショットを連続で撮影し、後からそれらを結合する方法で、スクリーンキャプチャの動画を作ることができる。

このエントリで紹介する手順は以下のとおり。

  1. xwininfoでキャプチャ対象のウィンドウIDを調べる
  2. 調べたウィンドウIDをcap.rbスクリプトの引数にして実行する
  3. キャプチャ対象のウィンドウを操作する
  4. cap.rbスクリプトをCtrl + cで停止する
  5. convertで画像をアニメーションGIFに結合する

1. xwininfoでキャプチャ対象のウィンドウIDを調べる

xwininfoはXのウィンドウの情報を表示するためのツールだ。 以下のように実行すると、カーソルが+マークになり、クリックしたウィンドウの情報が表示される。 結果は長いが重要なのはWindow idの行であり、この値をメモっておく。

xwininfo
xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x180000d "xmisao@xmisao: ~"

  Absolute upper-left X:  960
  Absolute upper-left Y:  19
  Relative upper-left X:  960
  Relative upper-left Y:  19
  Width: 958
  Height: 524
  Depth: 24
  Visual: 0x21
  Visual Class: TrueColor
  Border width: 1
  Class: InputOutput
  Colormap: 0x20 (installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +960+19  -0+19  -0-535  +960-535
  -geometry 159x40-0+19

2. 調べたウィンドウIDをcap.rbスクリプトの引数にして実行する

cap.rbは以下のようなちょっとしたRubyスクリプトだ。 このスクリプトは0.1秒ごとにxwdconvertを実行し、連番のGIFファイルとしてスクリーンショットを保存する。

#! /usr/bin/env ruby
id = ARGV[0]
9999.times{|i|
  fname = "cap_#{sprintf("%04d", i)}.gif"
  puts fname
  `xwd -id #{id} | convert - #{fname}`
  sleep 0.1
}

このスクリプトに先ほど調べたウィンドウIDを渡して実行する。 これでウィンドウのキャプチャが開始され、カレントディレクトリにcap_0000.gifcap_0001.gif、…、が順に出力される。

ruby cap.rb 0x180000d

3. キャプチャ対象のウィンドウを操作する

これは文字通り。 キャプチャ対象のウィンドウで、記録を取りたい操作をする。

4. cap.rbスクリプトをCtrl + cで停止する

cap.rbは999秒まで停止しないため、ウィンドウを操作し終わったらCtrl + cで終了させる。

この際、運悪くconvertの実行中だと、ゴミファイルが残る場合がある。 次の手順でもしエラーが発生したら、最後の1枚の画像を削除してやると良い。

5. convertで画像をアニメーションGIFに結合する

convertは以下のようにすると引数で与えた画像をアニメーションGIFとして出力できる。

convert 0.gif 1.gif 2.gif anime.gif

アニメーションGIFを作る時のオプションとして-loop-delayがある。 -loopでアニメーションのループ回数を指定でき、0を指定すると無限ループとなる。 また-delayで1フレームの時間を10msec単位で指定することができる。

以下は1フレーム100msecで、無限ループするアニメーションGIFを出力する例である。

convert -loop 0 -delay 10 0.gif 1.gif 2.gif anime.gif

以上を踏まえてcap.rbが出力した画像を結合するには、以下のようにすれば良い。 -delayの値を調節すれば、実際より遅いまたは早い動画を作ることができる。

convert -loop 0 -delay 10 cap_*.gif anime.gif

おわりに

以上、xwdconvertを使って、簡易的なスクリーンキャプチャを行う方法を紹介した。 実際にやってみると、これだけでも十分に実用できる。 このように基本的なツールを組み合わせれば色々とやりようがあるのがLinuxの良いところだ。