5つの画像では、ffmpegで60秒のビデオを作成する必要があり、各画像は15秒間表示する必要があります。15秒後、最初の画像はフェードアウトし、2番目の画像はフェードインし、2番目の画像はフェードアウトし、3番目の画像はフェードインする必要があります。ffmpegコマンドを使用してこれを達成する方法を教えてください。
5つの画像では、ffmpegで60秒のビデオを作成する必要があり、各画像は15秒間表示する必要があります。15秒後、最初の画像はフェードアウトし、2番目の画像はフェードインし、2番目の画像はフェードアウトし、3番目の画像はフェードインする必要があります。ffmpegコマンドを使用してこれを達成する方法を教えてください。
回答:
クロスフェード方式を下にスクロールします。
各画像が5秒間表示され、それぞれに1秒間続くフェードがある例。各画像入力の幅、高さ、およびサンプルの縦横比は同じです。サイズが異なる場合は、以下の例3を参照してください。
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
パッド(レターボックス/ピラーボックス)の代わりにクロップ(画面いっぱい)したい場合、またはアップスケーリングを防止したい場合は、静的なサイズのプレーヤーに収まるようにビデオのサイズを変更する例を参照してください。
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の作成に役立ちます。
フェードインしてフェードインおよびフェードアウトします。d
フェードの持続時間です。st
開始時です。
連結連結する(又は「結合」)は、各画像。
MP4を出力し、libx264(ビルドでサポートされている場合はMP4出力のデフォルトのエンコーダー)でエンコードする場合、非FFmpegベースのプレーヤーと互換性のあるクロマサブサンプリングスキームを出力する形式。
分割してフィルター出力のコピーを作成します。1つのコマンドですべてを実行するために、palette *フィルターで必要です。
見栄えの良いGIFを作成するためのpalettegenとpaletteuse。
各画像が5秒間表示され、それぞれに1秒間続くクロスフェードがある例。各画像入力の幅、高さ、およびサンプルの縦横比は同じです。サイズが異なる場合は、上記の例3を適合させてください。
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
各入力から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
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
はループなしです。
-t
して-loop 1 -t 1 -i 001.png
定義し、個々のフレームの期間を、そして数字は、以下のことをT/
内filter_complex
のブロックの定義トランジションの継続時間を?そして、この例のフレームの継続時間は、トランジションの継続時間を含めてカウントされますか?
-preset ultrafast
。
melt
ます。
concat=n=9
コマンドの一部では9
、例の5つの画像+画像間の4つのトランジションから取得されます。異なる数の画像を処理している場合は、それに応じて調整する必要があります。
イメージのフォルダーへのパスを取得し、ffmpegでクロスフェードビデオを出力する一般的なbashスクリプトを作成しました。
https://gist.github.com/anguyen8/d0630b6aef6c1cd79b9a1341e88a573e
このスクリプトは、基本的にフォルダー内の画像を調べ、上記の@LordNeckbeardによる回答に似たコマンドを出力し、コマンドを実行します。このスクリプトは、フォルダーに多数の画像があり、気の遠くなるほど長いコマンドを手動で入力したくない場合に役立ちます。