web-dev-qa-db-ja.com

クロスフェード付きのffmpegスライドショー

クロスフェードでスライドショーを作成する方法を見つけました。これは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つの質問があります。

  1. 中間のビデオファイルなしで、1つのステップで同じ結果を得ることができますか?
  2. 最初の質問に対する答えが「いいえ」の場合、RAWVIDEOなどのロスレス中間ファイルに対して上記のコマンドをどのように変更する必要があるかを誰かに教えてもらえますか?

ありがとう、マイケル

3
Michael

フィルタを適用する前に、フレームのタイミングを変更できます。

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は入力寸法に置き換えられます。

3
Gyan

解決策を要約したいと思います:

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は出力ビデオのサイズです。

3
Michael