ffmpegを使ってmp4などの動画からgifを作る方法。
スクリーンレコーダーなどで画面の録画をとってGitHubとかに載せたいけど動画よりGifみたいにパッと見れる方式がいいとか、そういうユースケース。
音声を抜けばMP4のほうが軽かったりするので、容量上の利点はないが、動画と違ってプレイヤーがなく、プレーンに見れるのはメリットだと思う。
またGIFを作ったことがある人なら知っていると思うがGIFは保存方法で画質がかなり変わる、そのため今回はいくつかの方法も比較していく。
元の動画
やり方
ループ再生させるために-plays 0を付けているが、単にGIFに落とすだけであれば、このオプションはなくていい。
単にGIFに落とす
もっとも単純な方法で、保存時の容量も1,279,855byteと小さくなるが、画質が荒くなる欠点がある。
ffmpeg -i input.mp4 -plays 0 output.gif
綺麗なGIFに落とす
非常に綺麗なGIFが出来るが、24,186,455byteと、非常にサイズが大きくなる欠点がある。
ffmpeg -i input.mp4 -filter_complex "[0:v] split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=new=1" -plays 0 output.gif
画質と容量を両立させる
サイズが3,749,739byteと、1/7ほどのサイズまで圧縮できているが、画質も悪くない。これがいい感じの落としどころだと思う。
ffmpeg -i input.mp4 -filter_complex "[0:v] split [a][b];[a] palettegen=stats_mode=single [p];[b][p] paletteuse=dither=none" -plays 0 output.gif
おまけ
APNGに落とす
画質はいいが、ファイルサイズが26,110,504byteと大きくなりすぎる。劣化なしでやりたい場合くらいしか選択肢に挙がらないだろう。
ffmpeg -i input.mp4 -plays 0 output.apng
音声を抜いたMP4にする
ビデオフレームを複製し、オーディオを落としたMP4にする方法。ファイルサイズが2,019,647byteと小さく、元の画質を維持できるため、動画であることを許容できるならこれが一番無難だ。
ffmpeg -i input.mp4 -c:v copy -an output.mp4
参考
- ffmpegでとにかく綺麗なGIFを作りたい - qiita.com
ミキサーが使えない場合に自分のマイク入力とPCからのスピーカー出力を両方取りたいときに使える方法。
確認環境
Windows 11環境下。
| Env | Ver |
|---|---|
| ffmpeg | 7.1.1-essentials_build-www.gyan.dev |
| Screen Capture Recorder | 0.13.3 |
事前セットアップ
Chocolateyはあるものとする。
- ffmpegのインストール
choco install ffmpeg - Screen Capture Recorderのインストール
GitHubのリリース一覧からインストーラーを拾ってきてインストールする
手順
- 録音するマイクを調べる
ffmpeg -list_devices true -f dshow -i dummy - 録音するマイクを指定して録音する(以下はマイク名が「マイク (Sound BlasterX G1)」であるケース)
ffmpeg -f dshow -i audio="マイク (Sound BlasterX G1)" -f dshow -i audio=virtual-audio-capturer -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output.mp3 - Qキーを押して終了する(Ctrl+Cだと保存されない)
おまけ
ps1ファイルをダブルクリックで実行できる環境を作っておき、以下の内容でrec.ps1みたいなものを作っておくと、ワンクリックで呼び出せる。
Write-Host "録音を開始する場合は何かキーを押してください…" -NoNewLine
[Console]::ReadKey($true) > $null
$input="マイク (Sound BlasterX G1)"
$filename=Get-Date -Format "yyyy-MM-dd_HH_mm_ss"
ffmpeg -f dshow -i audio=$input -f dshow -i audio=virtual-audio-capturer -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" "$filename.mp3"


