Your offsets are incorrect. Try:
ffmpeg -i v0.mp4 -i v1.mp4 -i v2.mp4 -i v3.mp4 -i v4.mp4 -filter_complex \
"[0][1:v]xfade=transition=fade:duration=1:offset=3[vfade1]; \
[vfade1][2:v]xfade=transition=fade:duration=1:offset=10[vfade2]; \
[vfade2][3:v]xfade=transition=fade:duration=1:offset=21[vfade3]; \
[vfade3][4:v]xfade=transition=fade:duration=1:offset=25,format=yuv420p; \
[0:a][1:a]acrossfade=d=1[afade1]; \
[afade1][2:a]acrossfade=d=1[afade2]; \
[afade2][3:a]acrossfade=d=1[afade3]; \
[afade3][4:a]acrossfade=d=1" \
-movflags +faststart out.mp4
How to get xfade offset
values:
input | input duration | + | previous xfade offset |
– | xfade duration |
offset = |
---|---|---|---|---|---|---|
v0.mp4 |
4 | + | 0 | – | 1 | 3 |
v1.mp4 |
8 | + | 3 | – | 1 | 10 |
v2.mp4 |
12 | + | 10 | – | 1 | 21 |
v3.mp4 |
5 | + | 21 | – | 1 | 25 |
These are simplified example durations that are different than the durations shown in the original question.
- See xfade and acrossfade filter documentation for more info.
- See FFmpeg Wiki: xfade for a gallery of transition effects and more examples.
- You can get input durations with
ffprobe
.