画像・動画で伝える手間ひま

Jingを使うのであれなんであれ、スクリーンキャストはなんだかんだ手間がかかる。文章で説明する手間と秤にかけて、どちらが良いか、となれば、それでもスクリーンキャストが楽だ。

使えるものは使えばいいのに」は、動画にするほどでもないのでアニメーションGIFにしたわけだが、これも実はもとはJingで動画としてキャプチャしたものが元である。

結局のところ「撮りたい作業状態にして Prnt Scrn」→「繰り返し」→「画像編集」→「アニメーションGIFに」とするのと、「動画からフレームを静止画として抜き出す」→「不要フレーム削除」→「アニメーションGIFに」のどっちが楽か、と。これは動画の長さにもよるのであろうし、手持ちの画像・動画編集ソフトにもよるのであろう。

使えるものは使えばいいのに」では先に Jing でキャプチャした swf を avi に変換してから、まずは全フレームを jpg として抽出した:

1 me@host: ~$ ffmpeg -i 2015-02-25_0019.avi -qscale:v 1 frame%4d.jpg

-qscale:v 1は jpg の「最高画質」の指定になるが、これを指定しない「デフォルト」は、字が潰れて全く識字出来ないほど酷いので、指定そのものは必須。ただ、何も「最高画質」である必要はなくて、worst が 31 なので、1~31の間に丁度いい按配の画質はあるだろう。にしてもな、なんというか「潰れて読めないほど低画質」なのに「高圧縮」で喜んでてどーすんのよ、と思う。字が読めないんでは意味ないでしょーよ。皆よく我慢してるな、と思うような動画が多いが、ソフトウェアが「高圧縮優先」し過ぎてるんではないだろうか?

でだ。ffmpeg で「全フレーム」抽出すると、たった1分半程度の動画であっても、かなりの量の静止画が抽出されてしまう。本当は ffmpeg 自身で「25フレームおきに」のような指定も出来るので、それを活用する手もあるが、それだと欲しいフレームを取りこぼしそうだったので採用しなかった。ので、まずは「完全に同一のフレームを削除」を以下 Python スクリプトで:

 1 import os
 2 import sys
 3 import glob
 4 import hashlib
 5 d = ""
 6 for fn in sorted(glob.glob("*.jpg")):
 7     md5 = hashlib.md5(open(fn, "rb").read())
 8     cd = md5.hexdigest()
 9     if cd == d:
10         sys.stdout.write("remove %s..." % fn)
11         sys.stdout.flush()
12         os.unlink(fn)
13         sys.stdout.write("done.\n")
14     d = cd

結局のところ「実世界を撮影した動画」ではないので、完全に同一のフレームは結構な量になって、2/3くらい消えてなくなった。というか ffmpeg でないのかな、こんなオプション?

重複削除したら、あとは目視で欲しいフレームを探した。

抽出したフレームを ImageMagick でアニメーションGIFに:

1 me@host: ~$ convert -delay 70 -loop 0 frame*.jpg movie.gif

使えるものは使えばいいのに」のアニメーションGIFは全18フレームで出来ている。

画質を「良くし過ぎた」ために3MB超えてしまったがこれはやり過ぎだろう。ただね、個人的には低画質って非常に精神的にストレスになるんで、ちょっとやなのよねぇ。(「画像の美しさ」にはあまり興味はないんだね。その「ストレス」がやなの。)