地上の洞窟

どこにも行かず、液晶と「にらめっこ」し続ける人の物語。

【FFmpeg】とにかく簡単にmp4→gif変換

mp4→gif変換
mp4 → gif変換

※画面は開発中のものです。とか言っとけ定期


前置き

ブログ上でイメージを示したいが、それが動画だったとき。
本来であればvideoタグとか使って動画を埋め込みたいところだが、
はてなブログ君では動画のアップロードが出来なかったりする。

多分TwitterYouTubeに上げた動画を埋め込むのが一番なのだが、
自分はTwitterはROMりたいし、YouTubeになんでもかんでも上げるのはちょっちね。

てなわけで考えられるのが昔ながらの.gifアニメーション
最近は.webpみたいな規格もあるようだが、
はてなブログ君では.webpは取り扱えなかったりする(またかよー!)

というわけで、動画ファイルを.gifに変換する方法を紹介しやす。

準備

動画を.gifに変換する方法は色々ありますが、今回はFFmpegを使用します。

ダウンロード先は色々あるけど、
FFmpeg公式ページ
→ Download
→ Get packages & executable files
Windows EXE Files
Windows builds by BtbN

からでいいと思う。手間だろうからリンク先貼っときます。

github.com

ここのLatest Auto-Build → Assetsから
ffmpeg-master-latest-win64-gpl-shared.zip」をダウンロードして、
.zipファイルなので解凍して、どっか分かる場所に置いとく。

バッチファイル作成

解凍したフォルダの中にある bin\ffmpeg.exe を動かしていくのだが、
コイツを動かすにはコマンドプロンプト(cmd.exe)から
コマンドを入力して動かしてやる必要がある。

ただし、毎回毎回手入力するのも大変だし、場所指定が面倒だったりと色々あるので、
バッチファイル*1を作成して手軽に動かしてあげようという算段。

ffmpeg.exeと同じフォルダ内に適当な.batファイルを作成して、以下の内容を書き込む。

@echo off

set ffmpeg_path="ffmpeg.exe"

if "%~1"=="" (
  echo Please drag and drop target file.
  pause
  exit /b
)

%ffmpeg_path% -i %~1 -filter_complex "fps=24,split[a][b];[a]palettegen[pal];[b][pal]paletteuse=dither=none:diff_mode=rectangle" -y %~n1.gif

pause

このバッチファイルに動画ファイルをドラッグ&ドロップすれば、
同じ場所に同じ名前でgifファイルが生成される。
(既に同名のgifファイルが存在する場合は上書きされるので、注意)

バッチファイルの作り方は普通にテキストファイルを作成して、
拡張子を.batにするだけでおk。あとは↑をコピペするだけ。


バッチファイルの説明

各項を説明していく。

@echo off

これを書いておくと、バッチファイル内で実行されたコマンドが
コマンドプロンプト内に表示されなくなる。

set ffmpeg_path="ffmpeg.exe"

ffmpeg_pathという変数にffmpeg.exeまでのフルパスを代入して使用する。
""内を、各自ダウンロードした ffmpeg.exeまでのフルパス に書き換えて使用してください。

if "%~1"=="" ( ~~~ )

"%~1" というのは、このバッチファイルに対して
ドラッグ&ドロップされたファイルのフルパスを表す。
これがもし空ならば、変換する対象のファイルが無いとみなし処理を終了する。

%ffmpeg_path% -i %~1 ~~~

%ffmpeg_path% -i %~1 -filter_complex "fps=24,split[a][b];[a]palettegen[pal];[b][pal]paletteuse=dither=none:diff_mode=rectangle" -y %~n1.gif

実際にffmpegを実行するための一行。
-filter_complex の後の""内で、.gifアニメのfps*2を設定している。

この値を大きくすれば動きが滑らかになるが、ファイルサイズがクソデカになるので注意。
また、fpsの他にもサイズ指定などができる。

"fps=24,scale=320:-1,split[a][b];[a]palettegen[pal];[b][pal]paletteuse=dither=none:diff_mode=rectangle"

fps=24 の後に scale=320:-1 を追加している。
横幅を320pxに、縦幅は-1、これは指定した横幅320pxに対して、
元の画像の縦横比を崩さないように縦幅を自動計算して、拡大縮小する。

そのあとのごちゃごちゃした項では、動画からパレットを生成して
減色する工程を行ってたりするが、ややこしいのでここでは割愛。

後ろの方についてる -y は、同名のファイルが存在する場合に上書きするオプション。
%~n1 はドラッグ&ドロップされたファイルの名前(フォルダや拡張子を含まない)。


pause

これを書いておくと、バッチファイルの処理が終わった際に、
コマンドプロンプトが自動終了しないようになる。

まとめ

バッチファイルを作成して、ドラッグ&ドロップでmp4をgifに変換する方法でした。
まぁ、それでも面倒っちゃ面倒だよね。特に出力設定変えるのにバッチファイル編集するのが。
なんか動画→gif変換できる簡単なソフトとか作ろうかな?いや、そんな暇は実際ないんだけど。

今回の方法は変換する動画によっては色合いが褪せちゃうことがあります。
その場合は手間ですが、変換する動画に色調補正をかけて、彩度を上げておくとよいです。
(冒頭の画像もそうだったりする)

しかし、.gifファイルは圧縮が悪いのか、
.mp4から比べると画質が悪くなる上に、ファイルサイズが爆増してしまいます。
できることなら動画を直張りした方がいいですね、マジで。


おまけ

動画→アニメーションwebpを出力するコマンド。主に-qscale:v 80の所で画質が変わる

%ffmpeg_path% -i %~1 -vcodec libwebp -filter:v fps=fps=30 -lossless 0 -qscale:v 80 -loop 0 -preset default -an -vsync 0 -compression_level 6 -y %~n1.webp



パレットを使用せず.gifを出力するコマンド。画質は悪いがサイズは小さい

%ffmpeg_path% -i %~1 -r 30 -y %~n1.gif


*1:.batファイル。実行するコマンドを一まとめにして、簡単なプログラムのように扱える

*2:frame per second、一秒あたりのフレーム数