クロスフェードでスライドショーを作成する方法を見つけました。これは2段階のプロセスです。最初のステップでは、フレームレート0.5(各画像で2秒を意味します)で画像を読み取り、フレームレート2で中間ビデオを生成します。つまり、各画像が4回繰り返されます。 2番目のステップでは、フレームレートフィルターを適用します。その結果、各画像が1.5秒間表示され、その後0.5秒間のクロスフェードが表示されます。
ffmpeg -framerate 0.5 -i IMG_%3d.jpg -r 2 -codec:v mpeg4 temp.mp4
ffmpeg -i temp.mp4 -vf "framerate=fps=25" -codec:v mpeg4 out.mp4
この2段階のプロセスは正常に機能しますが、2つの質問があります。
ありがとう、マイケル
フィルタを適用する前に、フレームのタイミングを変更できます。
ffmpeg -i IMG_%3d.jpg -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4
更新:フレームレートフィルターは取り込み時に入力フレームレートに関連付けられているように見えるため、パイプを使用するaltメソッド
ffmpeg -framerate 0.5 -i IMG_%3d.jpg -vf fps=2 -f nut - | ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4
単一行の回避策:
ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4
ここで、WとHは入力寸法に置き換えられます。
解決策を要約したいと思います:
ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:s=WxH:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4
ここで、Aは各画像が表示される時間(秒単位)(クロスフェード期間なし)、Bはクロスフェード期間(秒単位)、WxHは出力ビデオのサイズです。