☃️

Zenity使って動画GIF変換シェルスクリプトかいた話

2022/01/02に公開

bannar

これは何?

動画をアニメーションGIFに変換します。

…そこら辺に転がってるって?

え?なんの再発明?

  • 横幅600pxの大きさで出来上がるGIFファイルのサイズをギリギリまで最小化
  • ファイル選択ダイアログ
  • 進行状況をプログレスバーで表示
  • 終了を音と通知ダイアログでお知らせ

可愛いおじさんが終了をお知らせしてくれます。
再配布禁止なのでおじさんアイコンは個別にダウンロードして下さい…

ありがとうございます。

Zenityのprogress dialogってどう書く?

シェルスクリプトにGUIならZenityですが、プログレスバーの動かし方は知りませんでした。GNOME HELPを読んでみるとどうやらechoを使うと良さそうです。

CWD=$(pwd)
(
    FILE=$(zenity --file-selection --file-filter="MOVIE files | *.mp4 | *.avi | *.oga" --title="Select a MOVIE file" --filename="${CWD}/")
    echo "0"
    ffmpeg -i "${FILE}" -an -r ${FPS} %04d.png
    echo "30"
    mogrify -resize ${WIDTH}x *.png
    echo "50"
    pngquant --posterize=$POSTERIZE --quality=$QUALITY *.png
    echo "70"
    convert *fs8.png ANIMATION.gif
    echo "90"
    rm *.png
    echo "100"
) | 
zenity --progress \
    --title="Make animation gif" \
    --text="処理中..." \
    --percentage=0 \
    --auto-close \
    --no-cancel

キャンセルボタンは必要ありませんので--no-cancelを指定します。

ファイルサイズをなるべく小さく!

アニメーションgifはサイズが大きいです。だいたい元の動画ファイルよりも大きくなります。貼り付けたい場合困ります。そこで

  • pngquantによる最適化

を行いました。
pngquantによる最適化は【じーろぐ】減色ツールPngquantの仕組みと最適パラメータを探るを参考にしました。

  --quality min-max don't save below min, use fewer colors below max (0-100)
  --speed N         speed/quality trade-off. 1=slow, 3=default, 11=fast & rough
  --ordered         disable Floyd-Steinberg dithering
  --floyd           Controls level of dithering (0 = none, 1 = full).
  --posterize N     output lower-precision color (e.g. for ARGB4444 output)
  --strip           remove optional metadata (default on Mac)

pngquantは優秀でちょっとやそっとでは画質が荒くなりません。デフォルトの設定では最低値にしてその分サイズをぎりぎりまで小さくしています。荒いな、と思ったら設定を上げてみると良いと思います。

デスクトップ通知はzenityかnotify-sendか

zenityの通知だと下にいらないボタンが表示されてしまって見苦しいです。zenity以外の要因らしくnotify-sendを使いました。

Installation

新しいフォルダを作り、そこにファイルを置いて下さい。

git cloneすれば初めからこの様になります。
make_animation_gif.shに実行権限を与えて下さい。

Requirementsのインストール
sudo apt update
sudo apt upgrade -y
sudo apt install ffmpeg imagemagick pngquant pulseaudio-utils libnotify-bin zenity

Usage

make_animation_gif.shをダブルクリックするか仮想端末から起動して下さい。

Requirements

  • ffmpeg
  • imagemagick
  • pngquant
  • paplay(pulseaudio-utils)
  • notify-send(libnotify-bin)
  • zenity

Setting

Parameters

標準では以下の設定になっています。

  • FPS=5
    • ffmpeg
  • WIDTH=600
    • mogrify
  • POSTERIZE=4
    • pngquant, 削減ビット数最大値
  • QUALITY=0-5
    • pngquant, 最低0-100

もし設定を変えたい場合はソースの以下の部分を変更して下さい。

# 初期設定 ###########
FPS=5
WIDTH=600
POSTERIZE=4
QUALITY=0-5
# ####################

Icon

man_55.pngはいらすとや様該当ページから個別にダウンロードして下さい。
https://3.bp.blogspot.com/-1LXBe86Lrs8/Vf-artgLU6I/AAAAAAAAyJE/i5zNuMDWXWo/s800/icon_business_man13.png

最適化前 24.7 MiB

最適化後 13.7 MiB

55.4%のサイズダウン!

Reference

https://help.gnome.org/users/zenity/stable/index.html.en
https://pngquant.org/
https://zlog.hateblo.jp/entry/2019/05/05/pngquant
https://zenn.dev/ykesamaru/articles/52653d248e854d

Author

yKesamaru

License

MIT license

それ以外のライセンス
https://launchpad.net/ubuntu/bionic/+source/ubuntu-sounds/+copyright

  • Creative Commons Attribution-ShareAlike License
  • /usr/share/sounds/ubuntu/notifications/

Github

https://github.com/yKesamaru/movie2gif

Discussion