-hide_banner でコンパイル情報を隠す

FFmpeg Filters Documentation

前提知識

ffmpeg <入力オプション> -i <入力ファイル> <出力オプション> <出力ファイル>

のかたちで使う。

  • 入力オプションは、フレームレート、切り出しの開始・終了秒数など
  • 出力オプションは、出力される動画のエンコーディングなど

jpeg 画像を入力として動画を出力する場合

  • 再生側の環境が不安なら -vcodec libx264 -pix_fmt yuv420p をかけとくとよい

画像のインデックスが 1 からスタートしない場合

-pattern_type glob -i '*.jpg'

2 動画を左右に並べて合成する

ffmpeg -y \
    -r 15 -i path1/%010d.jpg \
    -r 15 -i path2/%010d.jpg \
    -filter_complex "xstack=inputs=2:layout=0_0|w0_0:shortest=0" \
	-vcodec libx264 -pix_fmt yuv420p \
    output.mp4

4 動画を並べて合成する

ffmpeg -y \
	-ss <seconds> -i movie1.mp4 \
	-ss <seconds> -i movie2.mp4 \
	-ss <seconds> -i movie3.mp4 \
	-ss <seconds> -i movie4.mp4 \
	-filter_complex "\
	[0:v] setpts=PTS-STARTPTS, scale=676x507 [0_input];\
	[1:v] setpts=PTS-STARTPTS, scale=676x507 [1_input];\
	[2:v] setpts=PTS-STARTPTS, scale=676x507 [2_input];\
	[3:v] setpts=PTS-STARTPTS, scale=676x507 [3_input];\
	[0_input][1_input][2_input][3_input]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0" \
	-to 30 \
	outmovie.mp4
  • -ss は各動画の切り出し開始時刻。いらないなら消す
  • -to で切り出す秒数を指定
  • scale で小さくしないと動画が 4 倍でかくなってしまい遅くなる
    • 今回は横長 4:3 の動画なので 676x507 にしている
  • xstack について詳しくは ニコラボ

動画出力のエンコーディングについて

-c:v copy でコピーできる
コピーしない場合はとりあえず -preset veryfast -crf 18 -vcodec libx264 -pix_fmt yuv420p としておけばよい

crf

低いほど画質が良い。23 くらいでも耐えるらしい

INFO

vcodec

再生側の環境が不安なら -vcodec libx264
容量をとにかく小さくしたいなら -vcodec hevc

  • いわゆる H.265 を使う
  • エンコードにかなり時間がかかる
  • cf. Morpho Tech Blog

pix_fmt

Most of images/videos are chroma subsampled

  • human eyes are sensitive to change in brightness than that of color
  • Therefore chroma part is subsampled while luma part is kept
  • When -pix_fmt yuvJab is specified, for regions of Jx2 pixels with different luma colors…
    • a colors are used to represent the top row
    • b colors are used to represent the bottom row’s difference from the top row
    • e.g., yuv444 means no subsampling
    • e.g., yuv422 means subsampling by two
    • e.g., yuv420 means subsampling by four
      Most mp4 movies use one of yuv420p, yuv422p, yuv444p so using one of them is recommended
  • movie converted from jpeg uses yuvj420p, which causes errors for some movie players
  • ffmpegのピクセルフォーマット指定
  • yuv420p subsamples chroma bandwidth by four without visible deterioration

動画から画像を切り出す

ffmpeg -ss 83.232 -to 218.342 -noautorotate -i input.mp4 -hide_banner -q:v 20 out/%010d.jpg

画像をまとめて動画にする

ffmpeg -framerate 30 -i input.mp4 -hide_banner -q:v 20 out/%010d.jpg

白色背景とマージする

ffmpeg -framerate 5 -i input/%08d.png -f lavfi -i "color=c=white:s=100x250:r=5" -filter_complex "[1:v][0:v]overlay=format=auto:shortest=1,fps=5[v]" -map "[v]" -pix_fmt yuv420p output_whitebg.mp4

動画を回転させる

90 度単位の回転の場合は
ffmpeg -i in.mov -vf "transpose=1" out.mov

ffmpeg -i in.mov -vf "transpose=1,transpose=1" out.mov
のように 2 回回転させると 180 度回転させられる

エンコードするときにメタデータを見て自動で回転させないためには -noautorotate をつける

(90 度単位以外の場合は cf. 映像を任意の角度に回転させる rotate | ニコラボ (nico-lab.net))

動画のフレームレート

ffmpeg でのフレームレート設定の違い | ニコラボ (nico-lab.net) にすべて書いてある。いつか読んで自分でまとめる

入力オプション(連番画像)

-framerate 59.94

  • オリジナルよりフレームレートが少なければ間引く、多ければ重複フレームをつくる。動画時間は変わらない

連番画像を入力するときのフレームレートは -r ではなくて -framerate を使う方がより正確であり、公式ドキュメントを見ても設定項目に書いてある

出力オプション

-r fps

  • 何もつけないとコンテナの規定値になるので注意すること