お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
投稿日:ソフトウェア::ffmpeg

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

ミキサーが使えない場合に自分のマイク入力とPCからのスピーカー出力を両方取りたいときに使える方法。

確認環境

Windows 11環境下。

Env Ver
ffmpeg 7.1.1-essentials_build-www.gyan.dev
Screen Capture Recorder 0.13.3

事前セットアップ

Chocolateyはあるものとする。

  1. ffmpegのインストール
    choco install ffmpeg
  2. Screen Capture Recorderのインストール
    GitHubのリリース一覧からインストーラーを拾ってきてインストールする

手順

  1. 録音するマイクを調べる
    ffmpeg -list_devices true -f dshow -i dummy
  2. 録音するマイクを指定して録音する(以下はマイク名が「マイク (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
  3. 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"