crossfade between 2 videos using ffmpeg
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Dreamlands
--
Chapters
00:00 Crossfade Between 2 Videos Using Ffmpeg
01:05 Accepted Answer Score 37
02:04 Answer 2 Score 5
03:01 Answer 3 Score 11
03:35 Answer 4 Score 22
03:50 Thank you
--
Full question
https://superuser.com/questions/778762/c...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#commandline #video #ffmpeg #videoediting
#avk47
ACCEPTED ANSWER
Score 37
I suggest to do that way:
- Create black background with the same duration and resolution as output video should be
- Add alpha channel to each video
- Add fade to alpha effect to each video
- Use overlay on each video with black background
So the command for adding crossfade to 2 video (5 sec) each should be:
ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4
This will fade out first video to alpha at the 4th second (st=4) with a duration of 1 second (d=1), fade in the second one at the 0th second (st=0) with a duration of 1 second (d=1), and move its display time forward to 4 sec (+4/TB). Then we just cut 9 second of black color, scale it to output video size and overlay the stuff.
Hope it helps.
ANSWER 2
Score 22
FFmpeg now has a crossfade filter, released in version 4.3.
ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "xfade=offset=4.5:duration=1" output.mp4
And similarly, there's an audio version.
ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "xfade=offset=4.5:duration=1;acrossfade=duration=1" output.mp4
ANSWER 3
Score 11
ffmpeg-concat is the easiest way to accomplish what you want and allows you to use a bunch of sexy OpenGL transitions, with the default being crossfade.
ffmpeg-gl-transition is a custom ffmpeg filter which allows you to use GLSL to smoothly transition between two video streams. This filter is significantly easier to use and customize than the alternatives listed here.
This filter supports a large list of transition types, with the default being crossfade.
./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4
ANSWER 4
Score 5
This is how I did :
- ffmpeg version N-77197-gdf2ce13
- 2 videos of 4 seconds each.
- Need to join it with fade between them.
- videos are 25 fps.
1) Add fade out (light to dark) at the end of the 1st and fade in (dark to light) at the beggining of the 2nd:
ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4
ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4
76:24 mean the fade out will start frame 76 and will finish 24 frames later = 1s fade out.
0:25 mean the fade in will start frame 0 and will finish 25 frames later.
2) Merge the 2 videos
Convert all to TS
ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts
ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts
Merge
ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4
Thanks to:
http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php