ffmpegでフェードイン/アウト効果のある5つの画像でビデオを作成する


27

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


4
何を試してみましたか?このフォーラムは、「仕事をせずに答えてください」タイプのフォーラムではありません。とはいえ、ffmpeg fadeドキュメンテーションへのリンクを提供します-ffmpeg.org/ffmpeg-filters.html#fade
Mike Diglio 14年

回答:


49

黒にディップ/フェード

クロスフェード方式を下にスクロールします。

フェードの例

各画像が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高さが異なる入力画像を使用します。1280x720のボックスに収まるようにパディングされます。

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ベースのプレーヤーと互換性のあるクロマサブサンプリングスキームを出力する形式

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

  • 見栄えの良いGIFを作成するためのpalettegenpaletteuse


クロスフェード

クロスフェードの例

各画像が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はループなしです。


1
@LordNeckbeard、この回答に感謝します。別の例で使用しました。持っている私は、数は、以下のことをよく理解-tして-loop 1 -t 1 -i 001.png定義し、個々のフレームの期間を、そして数字は、以下のことをT/filter_complexのブロックの定義トランジションの継続時間を?そして、この例のフレームの継続時間は、トランジションの継続時間を含めてカウントされますか?
cincplug

1
@Nisargこれは完全な出力ではないようで、前に表示した2つのコマンドのうち、どのコマンドなのかわかりません。とにかく、を追加してみてください-preset ultrafast
llogan

1
@LordNeckbeard画像、ビデオクリップ、およびオーディオトラックのセットを組み合わせて、単一のビデオファイルを作成する必要があります(できればoggですが、この時点ではあまり関係ありません)。さらに、隣接する画像間でトランジション効果を作成する必要があります。ffmpegや他のコマンドラインツールを使用して、このタスク全体をスクリプト化する方法はありますか?目標は、コマンドラインインターフェイスを介してタスクを自動化することです。
Webユーザー

1
@WebUser Transitionsはおそらくを使用して簡単になりmeltます。
-llogan

2
ffmpegアプローチは私にとってうまく機能しています。ありがとう!ページを初めて利用する人のためのヒント。concat=n=9コマンドの一部では9、例の5つの画像+画像間の4つのトランジションから取得されます。異なる数の画像を処理している場合は、それに応じて調整する必要があります。
ジム・ミラー

4

イメージのフォルダーへのパスを取得し、ffmpegでクロスフェードビデオを出力する一般的なbashスクリプトを作成しました。

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

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


申し訳ありませんが、あなたのスクリプトが#4への入力#0で、ffmpegの3.0.1で失敗し、それを返します:「フィルターグラフの説明に無効なファイル・インデックス5」
クシシュトフBociurko

TobySpeight:良い点、答えをより明確にするために編集しました。基本的に、主なアイデアはすでに上記の@LordNeckbeardによって与えられています。このスクリプトは、多くの画像に一般化されています。
-anh_ng8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.