ffmpeg の 忘れそうな操作のメモ

最近 ffmpeg で操作をするたびに、同じ操作を調べなおすことが多発していたのでここらでまとめようかと感じた次第です。
(使うときには調べるけど、使用間隔が 2 週間に 1 度くらいなのでさすがに覚えられないのです。)

目次

参考

動画 -> gif

1
2
3
4
5
6
7
8
9
10
11
12
13
# シンプルな変換
ffmpeg -i src.mp4 dist.gif

# サイズ変更(横幅480pxを基準に変換)
ffmpeg -i src.mp4 -vf scale=480:-1 dist.gif

# サイズ変更(縦横を直接指定)
ffmpeg -i src.mp4 -s 480x320 dist.gif
# サイズ変更(規格を入力)
ffmpeg -i src.mp4 -s vga dist.gif

# フレームレート(1秒間に何枚画像が切り替わるか)変更
ffmpeg -i src.mp4 -r 15 dist.gif

mp3 + 画像 -> mp4

1
2
3
4
5
6
7
8
9
10
# 入力の画像をループさせて固定画像のmp4を作成する
ffmpeg.exe -i src.mp3 -i cover.jpg -loop 1 -vcodec libx264 -pix_fmt yuv420p dist.mp4

# 画像のサイズが2の倍数で無いとエラーが起こる
# 例: height not divisible by 2 (1100x1651)
# 対策として以下のようにする iwは入力画像の横幅 -2が計算の切り上げの結果としてエラーの原因を回避できる
ffmpeg.exe -i input.mp3 -i cover.jpg -vf scale=iw:-2 -loop 1 -vcodec libx264 -pix_fmt yuv420p dist.mp4

# サイズを変更したいとき
ffmpeg.exe -i input.mp3 -i cover.jpg -vf scale=360:-1 -loop 1 -vcodec libx264 -pix_fmt yuv420p dist.mp4

mp4 に差し込みの画像を追加

windows では時間を指定するものは動かなかった mac では動作した

1
2
3
4
5
6
7
8
9
10
11
12
# mp4に画像を差し込む
# overlay=0:0 左上から見てx=0 y=0 に画像を重ねる
ffmpeg -i src.mp4 -i insert.jpg -filter_complex "[0][1]overlay=0:0'" -pix_fmt yuv420p -max_muxing_queue_size 9999 -c:a copy dist.mp4

# mp4に画像を時間を指定して差し込む
# 画像を兼ねる時間は enable='between(t,3,10)'で指定する。この場合3秒~10秒の間が有効時間になる
ffmpeg -i src.mp4 -i insert1.jpg -i insert2.jpg -filter_complex "[0][1]overlay=100:0:enable='between(t,3,10)'" -pix_fmt yuv420p -max_muxing_queue_size 9999 -c:a copy dist.mp4

# mp4に画像を時間を指定して複数差し込む
# 3秒~10秒に画像1枚目、
# 13秒~20秒に画像2枚目を設定する
ffmpeg -i src.mp4 -i insert1.jpg -i insert2.jpg -filter_complex "[0][1]overlay=100:0:enable='between(t,3,10)'[tmp1];[tmp1][2]overlay=200:0:enable='between(t,13,20)'[tmp2]" -m "[tmp2]" -pix_fmt yuv420p -max_muxing_queue_size 9999 -c:a copy dist.mp4

mp4 と mp4 を連結

1
2
3
4
5
6
7
8
9
10
11
12
13
# 連結対象のファイルを記述したファイルを作成する
touch lint
# listの中の記述で、ファイルを列挙する
# 例)
# file src1.mp4
# file src2.mp4

# 連結する
ffmpeg -safe 0 -f concat -i list -pix_fmt yuv420p -max_muxing_queue_size 9999 -c copy dist.mp4

# 連結対象のファイルはフレームレートが合わないとエラーになる
# 対応として個別のファイルのフレームレートを合わせる。
ffmpeg -i src.mp4 -r 15 dist.mp4

mp4 の切り出し

1
2
3
# -ss 開始秒数
# -t 切り出し時間
ffmpeg -i src.mp4 -ss 3 -t 5 dist.mp4

今後も使いそうなコマンドは、拡充する。