
Mi requisito es el siguiente:
- El vídeo de entrada es un MP4.
- 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, loop
pero 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"