ルギア君の戯言

雑多な記事。

GIFアニメーション付きコミュニティの作り方

またしてもくだらない mixi のコミュニティを作ってしまった(ぁ


http://mixi.jp/view_community.pl?id=3871237


よかったら入ってあげてください(ぁ


さて、カメラで撮った動画を GIF アニメーションに変換する方法を紹介しようではないか。


例として MOL001.3GP (IEEE1394経由で取り込んだ DV 形式でも、デジカメで撮った AVI 形式でも)を GIF アニメーションに変換してみましょう。

必要なツール

  • GNU Image Manipulation Program (GIMP)
  • FFMPEG (r15697 以降奨励)

手順

まずは ffmpeg でフレーム数と解像度を落としながら動画から必要な部分を切り出します。

$ ffmpeg -i MOL001.3GP -an -f gif -ss 20 -t 2.5 -pix_fmt rgb24 -s 176x144 -r 8:1 out.gif

ss 秒から t 秒間切り出して、解像度を s にして、フレームレートを r にして out.gif に書き出します。
この場合は、20秒の位置から2.5秒間を切り出して、画面サイズを 176x144 に変更し、フレームレートを 8:1 (8fps) にします。


2.5 \div 0.125 = 20ですから、できあがるGIFアニメーションは 20 フレームあることになります。(0.125 は1フレームの長さ・単位は秒毎フレーム。)


逆に変換する時間は何秒でもいいからそこから 8fps で 20 フレーム切り出したいという場合には、

$ ffmpeg -i MOL001.3GP -an -f gif -ss 20 -vframes 20 -pix_fmt rgb24 -s 176x144 -r 8:1 out.gif

のように vframes オプションで指定します。


できた out.gif はまだ無限ループしない*1ので、gimp で無限ループするように設定する必要があります。


out.gif を gimp で開き、別名(例: out-1.gif)で、GIF 形式を選択して保存します。
「複数のレイヤーがある」というメッセージが出てくるので、「アニメーションとして保存」を選択し、アニメーションGIFの設定のダイアログを出します。


「無限ループ」にチェックを付けて、正しいフレームレート(この場合は 125 ミリ秒)を設定したあと「全フレームのフレーム間の時間に値を使用」にチェックを付けて保存してくれれば、GIF アニメーションのできあがり。


mixi の規定では 20フレーム以内、500kB 以内なので、これで 500KB 以下なら晴れて mixi のコミュニティのトップに張り付けることができます。


なお、gimp は画像を適当に正規化するので、ffmpeg の変換結果よりかなりサイズが小さくなりますので、500KB 程度を目指したい人は、大きめに作りましょう。

-rw-rw-r-- 1 lugia lugia  186641 2008-11-29 11:26 out-1.gif
-rw-rw-r-- 1 lugia lugia  582242 2008-11-29 11:25 out.gif

なお、携帯でも正しく表示させたい場合は、100KB 以下に抑える必要があります。

フレーム時間表

フレームレート 20フレームの時間 1フレームの時間
1 fps 20 秒 1000 ミリ秒
2 fps 10 秒 500 ミリ秒
3 fps 約 6.7 秒 333 ミリ秒
4 fps 5 秒 250 ミリ秒
5 fps 4 秒 200 ミリ秒
6 fps 約 3.3 秒 167 ミリ秒
7 fps 約 2.86 秒 143 ミリ秒
8 fps 2.5 秒 125 ミリ秒
9 fps 約 2.2 秒 111 ミリ秒
10 fps 2 秒 100 ミリ秒
15 fps 約 1.3 秒 67 ミリ秒
16 fps 1.25 秒 63 ミリ秒
20 fps 1 秒 50 ミリ秒
25 fps 0.8 秒 40 ミリ秒
29.97 fps 約 0.67 秒 33 ミリ秒
30 fps 約 0.67 秒 33 ミリ秒
40 fps 0.5 秒 25 ミリ秒
50 fps 0.4 秒 20 ミリ秒
100 fps 0.2 秒 10 ミリ秒

これ以上増やすと描画できなくなる。

*1:firefoxInternet Explorer で確認すること。描画エンジンによっては無条件でループするものがある