-hide_banner でコンパイル情報を隠す
前提知識
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.mp44 動画を並べて合成する
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にしている
- 今回は横長 4:3 の動画なので
xstackについて詳しくは ニコラボ
動画出力のエンコーディングについて
-c:v copy でコピーできる
コピーしない場合はとりあえず -preset veryfast -crf 18 -vcodec libx264 -pix_fmt yuv420p としておけばよい
crf
低いほど画質が良い。23 くらいでも耐えるらしい
INFO
cf. preset と CRF 値について ffmpegのエンコードの設定は何が最適か - utamt engineer blog (hatenablog.com) と、ここで紹介されている
- Re:ゼロから始めるFFmpeg - 俺の外付けHDD (hatenablog.com)
- H.264でエンコード:tech.ckme.co.jp
- 2020年版 デジタル放送録画の圧縮を最適化するFFmpegの使い方 - Simple Life in the digital age (digital-den.jp)
の内容をいつか勉強したい。これらの値はそれぞれ何を指定するものなのか?
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 yuvJabis specified, for regions ofJx2pixels with different luma colors…acolors are used to represent the top rowbcolors are used to represent the bottom row’s difference from the top row- e.g.,
yuv444means no subsampling - e.g.,
yuv422means subsampling by two - e.g.,
yuv420means subsampling by four
Most mp4 movies use one ofyuv420p,yuv422p,yuv444pso using one of them is recommended
- movie converted from jpeg uses
yuvj420p, which causes errors for some movie players - ffmpegのピクセルフォーマット指定
yuv420psubsamples 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
-r 59.94/4to the output option if you want 15 fps images from 60 fps
cf. ffmpeg で指定時間でカットするまとめ | ニコラボ (nico-lab.net)
画像をまとめて動画にする
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
- 0 = 90° counterclockwise and vertical flip (default)
- 1 = 90° clockwise
- 2 = 90° counterclockwise
- 3 = 90° clockwise and vertical flip
(ref. rotation - Rotating videos with FFmpeg - Stack Overflow)
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
- 何もつけないとコンテナの規定値になるので注意すること