clock-up-blog

go-mi-tech

動画ファイルをアニメーションGIFに変換するGUIツール「movie2gif」

個人開発者 Advent Calendar 2016 13日目のカレンダーです。

そのまんまなツール

以前、avi や mp4 等をアニメーションGIFに変換する - clock-up-blog という記事を書きましたが、毎度毎度コマンド打ち込むのが大変なので GUI ツール (Windows用) にしたものを紹介します。

f:id:kobake:20161210202527p:plain:w500
ありきたりなツールなんですけどね、同じような GUI ツールはいくつか見つけたのですがどうも圧縮率が悪く巨大な GIF ができあがってしまうものが多かったので今回は自作に踏み切りました。内部的には avi や mp4 等をアニメーションGIFに変換する - clock-up-blog で書いたロジックをそのまま実行してます。

技術紹介

既にある技術の再発明はしたくない。でも ffmpeg の実行ファイルをパッケージに埋め込むのもなんだかなぁ、と思いながらライブラリ情報を漁っていたら NReco.VideoConverter という NuGet パッケージを見つけました。

このパッケージを導入した状態で、例えば以下のような C# コードを実行すると、

var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
ffmpeg.Invoke(@"-i hoge.mp4");

実際には以下のようにコマンドライン実行したかのような効果が得られます。

> ffmpeg -i hoge.mp4


そんなわけで実際の変換処理はこのあたりでやってます。

ffmpeg.Invoke(string.Format(@"-y -i ""{0}"" -vf fps={1},scale={2}:-1:flags=lanczos,palettegen ""{3}""", param.inputfile, param.fps, param.width, tmp_palettefile));
ffmpeg.Invoke(string.Format(@"-y -i ""{0}"" -i ""{1}"" -filter_complex ""fps={2},scale={3}:-1:flags=lanczos[x];[x][1:v]paletteuse"" ""{4}""", param.inputfile, tmp_palettefile, param.fps, param.width, tmp_outputfile));


コマンド実行が GUI になっただけですがなかなか便利ですのよ。

おわり

ところで WPF アプリの作り方はまだまだ勉強中でして、現実装の XAML がものすごく汚い、というか冗長です。何か良いアドバイスあればください。

});