ディップ/フェードアウト

ディップ/フェードアウト

5 つの画像を使用して、ffmpeg で 60 秒のビデオを作成する必要があります。各画像は 15 秒間表示する必要があります。15 秒後、最初の画像はフェードアウトし、2 番目の画像はフェードインする必要があります。その後、2 番目の画像はフェードアウトし、3 番目の画像はフェードインする必要があります。ffmpeg コマンドを使用してこれを実現する方法を教えてください。

答え1

ディップ/フェードアウト

クロスフェード方法については下にスクロールしてください。

フェードの例

各画像が 5 秒間表示され、それぞれに 1 秒間のフェードがある例。各画像入力の幅、高さ、サンプルのアスペクト比は同じです。サイズが異なる場合は、以下の例 3 を参照してください。

MP4出力

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

音声付き

上記と同じですが、音声付きです。

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-i audio.m4a \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

さまざまなサイズまたは任意のサイズの入力画像の場合

最初の例と同様ですが、入力画像は幅 x 高さが異なります。1280 x 720 のボックスに収まるようにパディングされます。

ffmpeg \
-loop 1 -t 5 -i input0.png \
-loop 1 -t 5 -i input1.png \
-loop 1 -t 5 -i input2.png \
-loop 1 -t 5 -i input3.png \
-loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v0]; \
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

例を見る静的サイズのプレーヤーに収まるようにビデオのサイズを変更するパッド(レターボックス/ピラーボックス)の代わりにトリミング(画面を埋める)したい場合、またはアップスケーリングを防ぎたい場合。

GIF出力

フィルターを追加しますffmpeg を使用して、適切な品質でビデオを GIF に変換するにはどうすればよいですか?

ffmpeg \
-framerate 10 -loop 1 -t 5 -i input0.png \
-framerate 10 -loop 1 -t 5 -i input1.png \
-framerate 10 -loop 1 -t 5 -i input2.png \
-framerate 10 -loop 1 -t 5 -i input3.png \
-framerate 10 -loop 1 -t 5 -i input4.png \
-filter_complex \
"[0:v]fade=t=out:st=4:d=1[v0]; \
 [1:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1]; \
 [2:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [3:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [4:v]fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

出力オプションを使用して-loop、GIF のループ回数を制御します。このオプションを使用しない場合、デフォルトは無限ループです。 の値は-1ループなしです。

使用されるオプションとフィルター:

  • -t各入力の継続時間を秒単位で設定します。

  • -loop 1画像をループします。そうでない場合は、1 フレームの継続時間になります。

  • -framerate入力画像のフレーム レートを設定します (宣言されていない場合のデフォルトは 25)。GIF を作成するときに便利です。

  • 規模パッド入力画像を特定の均一なサイズに収める(例 3 で使用)。

  • フェードフェードインおよびフェードアウトします。dはフェードの継続時間です。stは開始時刻です。

  • 連結各画像を連結(または「結合」)します。

  • フォーマットMP4 を出力し、libx264 (ビルドでサポートされている場合の MP4 出力のデフォルト エンコーダー) を使用してエンコードする場合に、FFmpeg ベース以外のプレーヤーと互換性のあるクロマ サブサンプリング スキームを出力します。

  • スプリットフィルター出力のコピーを作成します。palette* フィルターが 1 つのコマンドですべてを実行するために必要です。

  • パレットジェンそしてパレットの使用見栄えの良い GIF を作成するため。


クロスフェード

クロスフェードの例

各画像が 5 秒間表示され、それぞれに 1 秒間のクロスフェードがある例。各画像入力の幅、高さ、サンプルのアスペクト比は同じです。サイズが異なる場合は、上記の例 3 を適用します。

MP4出力

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -movflags +faststart out.mp4

音声付き

ffmpeg \
-loop 1 -t 5 -i 1.png \
-loop 1 -t 5 -i 2.png \
-loop 1 -t 5 -i 3.png \
-loop 1 -t 5 -i 4.png \
-loop 1 -t 5 -i 5.png \
-i music.mp3 \
-filter_complex \
"[1]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=yuva444p,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3]; \
 [bg3][f3]overlay,format=yuv420p[v]" -map "[v]" -map 5:a -shortest -movflags +faststart out.mp4

音声付きの2つのビデオをクロスフェードする

各入力から 5 秒のセグメントを選択し、1 秒のクロスフェードを追加します。

ffmpeg -i input0.mp4 -i input1.mp4 -filter_complex \
"[0:v]trim=start=5:end=10,setpts=PTS-STARTPTS[v0];
 [1:v]trim=start=12:end=17,setpts=PTS-STARTPTS+4/TB,format=yuva444p,fade=st=4:d=1:t=in:alpha=1[v1];
 [v0][v1]overlay,format=yuv420p[v];
 [0:a]atrim=start=5:end=10,asetpts=PTS-STARTPTS[a0];
 [1:a]atrim=start=12:end=17,asetpts=PTS-STARTPTS[a1];
 [a0][a1]acrossfade=d=1[a]" \
-map "[v]" -map "[a]" output.mp4

GIF出力

ffmpeg \
-framerate 10 -loop 1 -t 5 -i 1.png \
-framerate 10 -loop 1 -t 5 -i 2.png \
-framerate 10 -loop 1 -t 5 -i 3.png \
-framerate 10 -loop 1 -t 5 -i 4.png \
-framerate 10 -loop 1 -t 5 -i 5.png \
-filter_complex \
"[1]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+4/TB[f0]; \
 [2]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+8/TB[f1]; \
 [3]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+12/TB[f2]; \
 [4]format=rgba,fade=d=1:t=in:alpha=1,setpts=PTS-STARTPTS+16/TB[f3]; \
 [0][f0]overlay[bg1];[bg1][f1]overlay[bg2];[bg2][f2]overlay[bg3];[bg3][f3]overlay,split[v0][v1]; \
 [v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" out.gif

出力オプションを使用して-loop、GIF のループ回数を制御します。このオプションを使用しない場合、デフォルトは無限ループです。 の値は-1ループなしです。

答え2

私はパスを入力する一般的なbashスクリプトを書きました画像のフォルダffmpeg でクロスフェード ビデオを出力します。

https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e

このスクリプトは基本的に、フォルダー内の画像を調べ、上記の @LordNeckbeard の回答に似たコマンドを出力し、そのコマンドを実行します。このスクリプトは、フォルダー内に多数の画像があり、気が滅入るほど長いコマンドを手動で入力したくない場合に役立ちます。

関連情報