しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Functions と ImageMagick を使って動画をアニメーション Gif に変換する処理を作った

Azure Functions のテンプレートに Batch があったので、どのような仕組みになっているか調べている間に面白そうだったので、ImageMagick を使ってみることにしました。

とりあえず Batch のテンプレートを選んで、新しい Function を作成します。今回は Blob にアップロードした mp4 を変換したいので、BlobTrigger を選びます。

BlobTrigger を選ぶとストレージアカウントの設定と監視するパスの入力が必要ですが、めんどくさかったのでほぼデフォルトのままにしました。

ImageMagick の Portable 版をダウンロードすると ffmpeg が入っているので、これをそのまま利用します。必要な ffmpeg と convert は Kudu を使って直接アップロードしました。

準備が整ったので Function の中身を書いていくわけですが、Batch の場合は入力と出力を環境変数として取れるようになっています。ファイルベースなので、コンソールアプリケーションとの相性が良いです。

mp4 からアニメーション Gif に変換する部分は本質ではないので、簡単に流しておきます。やっている内容としては動画をフレーム毎に切り出し、アニメーション Gif として保存するだけです。

mkdir temp

ffmpeg -i %input% -an -r 10 -vf scale=240:-1 temp/%%08d.png
convert -delay 5 -layers optimize temp/*.png temp.gif

copy temp.gif %output%
del temp.gif

rd /S /Q temp

同じフレームレートだと面白くないので、少し早くしてあります。

これでアニメーション Gif への変換が動きますが、出力されたファイルの拡張子が mp4 のままになってしまうので、Blob の Path を以下のように修正して対応します。この辺りは WebJobs SDK と変わりません。

今回はプレースホルダに拡張子を含めないことにしました。拡張子を除いたファイル名は保持されます。

Azure Storage Explorer などから Blob にファイルを追加すると、作成した Function の実行が始まります。動画のサイズにもよりますが、少し時間がかかります。

ログには処理結果が出力されるので、コマンド実行の結果を簡単に確認可能です。

この Function で実際に変換したアニメーション Gif を最後に載せておきます。減色を行っていないため、ファイルサイズが大きいので注意。

出力した結果を更に他の Function で処理することも出来るので、組み合わせると面白いですね。