movを綺麗にgifに変換するには、まずパレットを生成する必要がある。
ffmpeg -i hoge.mov -vf palettegen palette.png
つぎにこのpaletteを用いて、movからgifファイルを生成する。
ffmpeg -i hoge.mov -i palette.png -filter_complex paletteuse out.gif
最後にこのgifファイルにクロマキー処理をする。
色はblueのようなプリセット、または'rgb(0,0,200)'のように指定する。
今回はクロマキーなので、ある程度幅のある値をとって欲しい。
whiteを95%の範囲で透明にする(gifなので階調指定はできないが)するには、次のようにする。
convert -white-threshold 95% -transparent white out.gif trans.gif
と思うじゃろ?
しかし、これではgifアニメーションにおかしな軌跡が写り込んでしまう。
これは、ffmpegが変換する際に圧縮を行うので、各フレームごとに前フレームからのdiffを取っているため。
背景が真っ白だったら、画像のない部分を常に白で上書きすれば問題ないが、透明になった場合は写り込んでしまうのでダメ。
Imagemagickのtransparentオプションは白部分を透明にするだけなので、
結果、前フレームのゴミが次のフレームに写り込んでしまう。
どうすればいいか
透明なので、毎回前フレームの情報を消去して書きなおせば良い。
つまり、各フレームは必然的に画像情報を全て持っていることになるので、ファイルサイズは大きくなってしまうが仕方ない。
ffmpegの出力結果out.gifを、一度imagemagickで次のように処理する。
convert -coalesce -loop 0 out.gif out_coalesce.gif
-coalesceオプションを付けると、各フレームが全画素情報を持つようになる。
(ここで-dispose previousオプション(後述)を付けてはいけない。)
次に、これを次のように変換する。
convert -white-threshold 95% -transparent white -coalesce -dispose previous -loop 0 out_coalesce.gif trans_coalesce.gif
透明化のオプションは先ほどと同じ。
-dispose previousオプションを付けると、前画像の情報を全て破棄し、次フレームの情報のみを再描画する。
ここでも-coalesceを付けるのを忘れずに。
参考
http://fftest33.blog.fc2.com/blog-entry-69.html
http://www.imagemagick.org/script/color.php
http://stackoverflow.com/questions/27099682/imagmgick-multiple-color-and-transparent-image-with-anti-aliasing
http://www.imagemagick.org/Usage/anim_basics/