FFMpeg: superpone una imagen o un gif encima de un vídeo durante X segundos mientras el vídeo permanece en pausa

FFMpeg: superpone una imagen o un gif encima de un vídeo durante X segundos mientras el vídeo permanece en pausa

Mi requisito es el siguiente:

  1. El vídeo de entrada es un MP4.
  2. La superposición puede ser gif o png.

La superposición debería aparecer sobre el vídeo de entrada en una marca de tiempo. Debería durar 5 segundos. Si es un gif, debería reproducirse durante esos 5 segundos en bucle. Durante estos 5 segundos en los que aparece la superposición, el vídeo de fondo debe pausarse (tanto audio como vídeo) y luego reanudarse una vez que desaparezca la superposición. La superposición puede ocurrir desde el 0 hasta el último fotograma.

Intenté insertar la imagen en una marca de tiempo, calcular el fotograma en esa marca de tiempo y luego usarla, looppero me encuentro con uno u otro problema, ya sea con audio o video. También intenté dividir el video en dos partes en el momento de la superposición, aplicarlo a una y luego fusionarlos.

Estoy en esto durante los últimos 3 días y espero que alguien me ayude con el comando, ya que en este momento me supera.

Respuesta1

Uff me tomó horas hacer esto bien. El comentario de @Баяр Гончикжапов y la respuesta de este tema ayudaron:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg

Tienes que usar el filtro tpad en la parte antes de la superposición de esa manera puedes pausar el último fotograma de esa parte todo el tiempo que quieras. A continuación, rellena el audio de la parte 1 para compensar el tiempo extra mientras el vídeo está en pausa y muestra la superposición con un filtro de almohadilla.

Continuando, contactas las partes de video + partes de audio y sobre el video resultante aplicas la superposición.

Como ejemplo, usaré una parte 1 de 30 segundos, luego haré una pausa con superposición durante 5 segundos y una parte 2 también de 30 segundos.

Para una imagen png:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"

Para una imagen gif:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"

información relacionada