個人開発者 Advent Calendar 2016 13日目のカレンダーです。
そのまんまなツール
以前、avi や mp4 等をアニメーションGIFに変換する - clock-up-blog という記事を書きましたが、毎度毎度コマンド打ち込むのが大変なので GUI ツール (Windows用) にしたものを紹介します。
ありきたりなツールなんですけどね、同じような 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 になっただけですがなかなか便利ですのよ。