[FFmpeg-user] Cross fading of videos

Ryan Williams ryan at ryanwilliams.id.au
Fri Dec 11 08:44:07 CET 2015

Please note that I haven't tested any of the following suggestions.
I do however have dissolve with crossfade working a project of mine and I have based these suggestions off working code.

1) Dissolve (Assuming the resolution of both videos is 1280x720 and the audio format is identical)

'+9/TB' represents (length of 1st video in seconds - length of dissolve in seconds)
'ns=43076’ represents (1 second at 44100 Hz sample rate - 1024 samples) to work around a bug I reported (which may've been fixed already).
The reason for including the same files multiple times is a work around filters which "scrub" (trim, atrim, select etc) thus causing buffering problems during encoding.

Visuals Explained:
* Create a 1 second fade in from the start of the 2nd video to be the transition.
* Overlay the transition onto the 1st video so that the end lines up.
* Take the remainder of the 2nd video and concatenate it on the end.

Audios Explained:
* Cossfade the 2nd videos audio with the first with a 1 second overlap (Allowing for the 1024 sample bug I reported)
* Truncate that new audio stream to be the same length as the first video
* Take the remainder of the 2nd videos audio and append it to the end.

The reason for making the audio in 2 parts is so that each part can be resynced with the visuals in the concat filter.
If you attempt to conjure the visuals completely separate from the audio you may get lip sync issues during playback of the 2nd clip.

ffmpeg \
 -y \
 -i "2.mp4" \
 -i "1.mp4" \
 -i "2.mp4" \
 -i "1.mp4" \
 -i "2.mp4" \
 -i "2.mp4" \
 -filter_complex " \
   [0:a] anullsink; \
   [0:v] trim='duration=1', format='pix_fmts=yuva420p', fade='alpha=1:d=1:t=in', setpts='PTS-STARTPTS+9/TB' [transition-v]; \

   [1:v][transition-v] overlay='eval=init', setpts='PTS-STARTPTS' [scene-0]; \
   [2:v] select='e=gte(t\, 1)', setpts='PTS-STARTPTS', format='pix_fmts=yuva420p' [scene-1]; \

   [3:a][4:a] acrossfade='ns=43076', atrim='duration=10' [track-0]; \
   [5:a] atrim='start=1', asetpts='PTS-STARTPTS' [track-1]; \

   [scene-0][track-0] [scene-1][track-1] concat='n=2:v=1:a=1' [output-v][output-a] \
 " \
 -map '[output-a]' \
 -strict experimental -acodec aac \
 -map '[output-v]' \
 -s 1280x720 \
 -vcodec mpeg4 \
 -pix_fmt +yuvj420p \
 -q:v 0 \ 

2) Slicing
ffmpeg -y -i 1.mp4 -filter_complex " \
  [0:v] trim='start=10.45:end=23.54' [trim-v]; \
  [0:a] atrim='start=10.45:end=23.54' [trim-a]; \
  [trim-v][trim-a] concat='n=1:v=1:a=1' [output] \
" \
-map '[output]' \
-strict experimental -acodec aac \
-vcodec mpeg4 \
-q:v 0 \

3) Overwriting
ffmpeg -y -i 1.mp4 -i 2.mp4 -filter_complex " \ 
  [0:v] trim='duration=31.5' [trim-v]; \
  [0:a] trim='duration=31.5' [trim-a]; \
  [trim-v][trim-a][1:v][1:a] concat='n=2:v=1:a=1' [output] \
" \
-map '[output]' \
-strict experimental -acodec aac \
-vcodec mpeg4 \
-q:v 0 \

-----Original Message-----
From: ffmpeg-user [mailto:ffmpeg-user-bounces at ffmpeg.org] On Behalf Of Tony Mobily
Sent: Friday, 11 December 2015 16:45
To: ffmpeg-user at ffmpeg.org
Subject: [FFmpeg-user] Cross fading of videos


I am new to ffmpeg. I am reading through the documentation -- although there is a lot to take in!
I was wondering if you could give me a couple of hints on how to get started.

1) Cross-dissolve

I have two videos, 1.mp4 and 2.mp4, 10 seconds each. I want to concatenate those videos, so that the first one has a cross-dissolve with the second one when they are joined. If the effect goes on for 1 second, this necessarily means that the resulting video will necessarily be 19 seconds (since the last second of 1.mp4 will "blend" with the first second of 2.mp4.
Is this something that can be done with ffmpeg?

2) Slicing

I have a 60 second video, and want to get a slice from the second 10.45 to the second 23.54. Is that possible?

2) Overlay
I have two videos, 1.mp4 (30 seconds) and 2.mp4 (8.5 seconds). I want to create a result video where 2.mp4 overwrites the last 8.5 seconds of 1.mp4.
Is this possible without doing cut/concatenation?

Thank you in advance -- and I apologise if I asked silly questions!

ffmpeg-user mailing list
ffmpeg-user at ffmpeg.org

More information about the ffmpeg-user mailing list