Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GIF overlays blink with ffmpeg

Tags:

ffmpeg

gif

I've been playing around with ffmpeg over the past months and can't get rid of an issue I'm facing when adding a GIF file as an overlay.

Basically what I'm trying to achieve is to add a transparent GIF animation as an overlay on top of a MP4 video.

Please find below an example command that I'm using:

ffmpeg \
  -i 0689a8a9-43b5-45d2-b0e8-acbea6905ce1.mp4 \
  -ignore_loop 0 \
  -i 02a6e696-969b-4a90-9444-e4b0b4d6f6da.gif \
  -t 10.000000 \
  -filter_complex "[0:v][1:v]overlay=enable='between(t, 1, 3)'[overlay]" \
  -map '[overlay]' \
  -pix_fmt yuv420p \
  output.mp4

For a better understanding, please note that:

  • -ignore_loop 0 allows me to loop the animation as long as the overlay is enabled
  • -t makes my video last 10s
  • overlay=enable='between(t, 1.0, 3.0)' sets the interval during which it's visible

However, when I run this command, a very few milliseconds before the GIF disapears (at 3s), it starts blinking. If I run take a look at it frame by frame, it actually disappears from the video, then comes back, and eventually goes away as expected.

Please find an example with a black background and a random GIF from giphy at this link. The assets can be found here.

I'm probably missing something here. Do you have any hints ?

I'm running ffmpeg in 4.3.1.

Thank you in advance

like image 895
vesna Avatar asked Nov 09 '20 13:11

vesna


1 Answers

I can replicate this with an arbitrary gif. I suspect a bug in the overlay filter. Feel free to present this to https://trac.ffmpeg.org.

This happens as soon as the temporal filtering is set (filter is listed as having timeline support) and furthermore changes depending on the time boundaries. The latter should never be the case.

MWE

ffmpeg \
  -t 10 -s qcif -f rawvideo -pix_fmt rgb24 -r 25 -i /dev/zero \
  -ignore_loop 0 -i 'https://media.tenor.com/images/c50ca435dffdb837914e7cb32c1e7edf/tenor.gif' \
  -filter_complex "overlay=enable='between(t,3,7)'" \
  -f flv - | ffplay -

You could try, as a workaround, converting the gif to an mp4 (ffmpeg -re -i <gif> [...]) and set the white areas to transparent.

like image 195
Suuuehgi Avatar answered Nov 12 '22 11:11

Suuuehgi