¿Cómo recortar una imagen en movimiento (superpuesta) a través de un video en ffmpeg?

¿Cómo recortar una imagen en movimiento (superpuesta) a través de un video en ffmpeg?

Quiero recortar una imagen en movimiento. El cultivo debe moverse con el tiempo para lograr un efecto de traducción. Intenté con el siguiente comando:

   ffmpeg -y -i video.mp4 -filter_complex "movie=filename=image.jpg:loop=1[pip:v];[pip:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)'[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4

Pero la cosecha sigue fija. Creo que la marca de tiempo de recorte no funciona porque es una imagen. No encuentro la solución, ¿pueden ayudarme?

ingrese la descripción de la imagen aquí

Respuesta1

En lugar de usar el moviefiltro, puede agregar image.jpgcomo segunda entrada y agregar -rpara configurar la velocidad de fotogramas:

ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg...

Define la velocidad de cuadros (tasa de repetición) de image.jpgy resuelve el problema de las marcas de tiempo.


Línea de comando actualizada:

ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg -filter_complex "[1:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)':format=yuv444[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4

información relacionada