ffmpegとimageMagickを使ってmp4からいい感じにgifに変換する

More than 1 year has passed since last update.

Androidのスクリーンの動画をmp4からgifに変換する方法について。@kgmyshinさんに以下のコマンドを教えていただいたのですが、ちょっと調整した点があったので、メモ。

Screen Shot 2015-09-29 at 00.15.13.png

https://gist.github.com/kgmyshin/6a7742fe1e04e25c4d21

mkdir ________work

ffmpeg -i $0 -an -r 15 ________work/%04d.png
convert work/*.png __mov.gif
rm -r ________work


事前準備

imagemagickffmpegを導入します。いずれもhome brewからインストールできます。

brew install ffmpeg

brew install ImageMagick

簡単ですね。


ffmpeg(mp4 -> png)

まず、ffmpegの以下のコマンドですが

ffmpeg -i $0 -an -r 15 ________work/%04d.png

mp4を画面ごとのpngにしてくれます。


  • -i のところでファイル名(シェルスクリプトで実行しない場合はファイル名, スクリプトで実行する場合は引数指定)

  • -an でオーディオは録音しない

  • -r でフレームレートを指定します。上なら 15frames/secですね。

  • %04d.pngの部分は 0000.pngという風にナンバリングします。


27秒の動画を変換したので420枚程のpngとなりました。

ffmpeg -i sample.mp4 -an -r 15 %04d.png


imagemagick(png -> mp4)

convert  work/*.png __mov.gif

上記を実行すると、pngが繋げられてgifに変換されますが、ここで一つ問題が発生します。ファイルサイズがデカイ。

6MBのmp4を変換した所、43MBとなってしまいました。

Screen Shot 2015-09-29 at 00.05.03.png

これはいけてないので、pngのサイズを小さくしてみます。


圧縮率の指定

まずは圧縮率を指定してみました。-resizeはpngを圧縮する時に指定するコマンドです。2桁ですが、10の位の部分が圧縮率を指定しているようです。とりあえず20を指定してみました。

convert *.png -resize 20 output_%04d.png

convert output_*.png kekka.gif

すると、以下の様に完全にぼやけたgifになってしまいました。

debot_3.gif


サイズの指定

次にサイズを変更してみました。先ほどの -resize を利用しますが、今度は%をつけます。これでサイズが変更されます。

convert *.png -resize 20% output_%04d.png

convert output_*.png kekka.gif

この結果、元動画くらいくっきりgifでありながら、サイズは1/10までサイズダウンできました。

Screen Shot 2015-09-29 at 00.10.56.png


最終的なコマンド

ffmpeg -i sample.mp4 -an -r 15 %04d.png

convert *.png -resize 20% output_%04d.png
convert output_*.png kekka.gif