ffmpeg slideshow with crossfade
Solution 1
You can retime the frames before applying the filter:
ffmpeg -i IMG_%3d.jpg -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4
Update: The framerate filter appears to be tied to the input framerate at ingest, so an alt method using pipes
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
A single-line workaround:
ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4
where W and H are replaced with the input dimensions.
Solution 2
I'd like to summarize the solution:
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
where A is the duration in seconds how long each picture is shown (without crossfade duration), B is the crossfade duration in seconds, and WxH is the size of the output video.
Related videos on Youtube
Michael
Updated on September 18, 2022Comments
-
Michael over 1 year
I just figured out how to make a slideshow with crossfade. It's a two-step process. The first step reads the pictures with framerate 0.5 (which means 2 seconds for each picture), and produces an intermediate video with framerate 2. That means each picture is repeated 4 times. The second step applies the framerate filter. The result is that each picture is shown for 1.5 seconds, followed by a 0.5 second crossfade.
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
This two step process works fine, but I have two questions:
- Is it also possible to get the same result in one step, without an intermediate video file?
- If the answer to the first question is no, can someone please show me how the above commands must be modified for a lossless intermediate file, for example RAWVIDEO?
Thanks, Michael
-
slhck over 6 yearsAny reason you need
mpeg4
as codec? Using that particular encoder without setting any target bitrate or quality level will result in bad quality output. I'd rather use H.264 unless you specifically need to target a device that does not support it. -
Michael over 6 yearsI did omit the bitrate and quality level settings in the above example, because I wanted to keep it as short as possible.
-
Michael over 6 yearsBut this doesn't do the same thing. It produces a video where the crossfade duration is 2 seconds, and when one crossfade ends, the next crossfade begins immediately.
-
Gyan over 6 yearsWorkaround added
-
Michael over 6 yearsok, I understand what you mean. First apply the fps filter and then the framerate filter. But I'm calling ffmpeg from a Windows batch file. I think in this case I must write the commands in two lines and use an intermediate file.
-
Gyan over 6 yearsWhy? You can apply the workaround in a batch file.
-
Michael over 6 yearsIt doesn't work. When I start the batch file, the cmd.exe window opens and closes immediately. This is the content of my batch file: c:/ffmpeg/ffmpeg -framerate 0.5 -i IMG_%%3d.jpg -vf fps=2 -f nut - | c:/ffmpeg/ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4 pause
-
Michael over 6 yearsthe pause command is in a new line
-
Michael over 6 yearsThe single-line workaround with zoompan filter works great! There is a small typo in it, replace "d:4" by "d=4" Thank you very much!
-
Michael over 6 years"-framerate 0.5" at the beginning can be omitted. "z=1" can also be omitted, it's the default value.
-
slhck over 6 years
-b:v 5M
and-q:v 0
are mutually exclusive; either you want a particular bitrate (but then two-pass encoding would be better), or you specify a target quality level (´-q:v 0` would however result in a very large file). -
Michael over 6 yearsDoesn't the specified bitrate work only as a maximum in this case? I think when both parameters are specified, it means use the specified quality, but do not exceed the specified bitrate.
-
slhck over 6 yearsNo, that's the
-maxrate
parameter. If you really needmpeg4
, use-q:v 2 -maxrate 5M
for a 1080p video, for example, to achieve a limited rate VBR stream. -
CMCDragonkai over 4 yearsWhy does this command cause me to overwrite the my image files? Also this command keeps creating syntax errors in shell. I think you're missing some quotes. And if I do add quotes around the command, it keeps asking to overwrite files.
-
Michael over 4 yearsThis command has only one output file "out.mp4" and won't overwrite any of your image files.