Cómo hacer que una superposición se mueva a puntos específicos en marcos específicos usando ffmpeg

Lo siguiente básicamente debería tener una imagen que aparece en el cuadro 438, y luego la misma imagen se mueve a una posición diferente en el cuadro 339, luego básicamente desaparece por el resto del video.

ffmpeg -i C:\src\assets\video\base.mp4 -r 25 -i C:\card.png -y \
    -filter_complex [1:v]setpts=PTS-STARTPTS+(1/TB)[1v]; \
    [0:v][1v]overlay=x=0:y=0:enable='between(t,438/25,439/25)'[1v]; \
    [0:v][1v]overlay=x=300:y=300:enable='between(t,439/25,440/25)'[2v]; \
    [1v][2v]concat=n=2:v=1:a=0[out] -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

Parece que no puedo obtener el comando real correcto o generar algo que se asemeje a lo que necesito.

Sé que estoy cerca, puedo superponer un cuadro, pero no puedo obtener más que eso.

Respuestas (1)

Utilizar

ffmpeg -i C:\src\assets\video\base.mp4 -i C:\card.png -y \
       -filter_complex "[0:v][1:v]overlay=x='if(eq(n,439),300,0)':y='if(eq(n,439),300,0)':enable='eq(n,438)+eq(n,439)'[out]" \
       -map [out] -map 0:a -ss 17 C:\temp\j7kthb0v\composit.mp4

Es posible que deba escapar de las comas en los filtros dependiendo de su shell, es decir n,438, ->n\,438

Eso es increíble, gracias, mucho más simple que varias superposiciones.
No pregunté esto en la publicación original, pero estoy usando esta solución para la animación, básicamente quiero especificar una posición para X e Y, según un número de cuadro. Puedo lograr esto anidado si no es así. pero hay una manera mejor?
No realmente. El filtro no está diseñado para animaciones como esa. Puedes simplificarlo algo así:x='0*eq(n,438)+300*eq(n,439)+X*eq(n,567)+...'
He estado jugando con la variable n, en la superposición si tuviera que hacer: overlay=x='( 605 + -0.8023952095808383 * n)':y='( 406 + -0.4365269461077843 * n)':enable='between(t,438/25,605/25)', ¿significa esto que n sería igual a 0 y se incrementaría para cada cuadro para el que es visible? (605 - 438)
Esas expresiones significan que la superposición comienza en (605,406). Con cada marco, (0.80,0.43) se resta y luego se redondea. Pero solo es visible (en las posiciones calculadas) entre los tiempos 17.56 y 24.20
Gracias, entendí esa parte, pero ¿n == 0 en el cuadro 438 y n == 1 en el cuadro 439?
No, nes el marco no. El primer cuadro es n = 0.
Entonces, en mi ejemplo, n sería igual a 438 cuando es visible por primera vez.
Así es...
¿Puede darme consejos sobre el zoompan? Básicamente, estoy tratando de agregar al final de la superposición, un efecto de zoom que se aleja de la imagen después del cuadro de inicio (438 e incrementa a un alejamiento de 0.43). Esto es lo que he intentado pero no parece aplicar ningún zoom.zoompan=z='if(gte(in,438),min(pzoom-0.04,0.43),1)':d=1
zoompan no puede alejarse a un lienzo más grande que la entrada. Tendrás que rellenar el video de antemano.
no entiendo a que te refieres con eso amigo
Además, el zoom está en una capa con una imagen superpuesta, ¿no se aplica el zoom solo a eso?
De hecho, ahora también puedo ver el fondo animado, maldita sea.
representa la zoomcantidad de zoom si el ancho de entrada es 100 y luego zoom=2 recorta una ventana de 50 píxeles de ancho. el zoom no puede ir por debajo de 1. Debe rellenar el marco del sujeto con píxeles adicionales (que pueden ser transparentes) y luego alejar el zoom en ese marco acolchado.
Entonces, si el ancho de entrada es en realidad 1659 y el video principal es 1920, ¿tengo que rellenar la diferencia entre los dos?
zoompan opera con una sola entrada. Si esa entrada es el resultado de un filtro de superposición, zoompan no sabe nada al respecto. Todo lo que ve es la imagen compuesta. Tal vez publique una nueva Q con una ilustración de lo que está tratando de hacer.
He hecho esto, video.stackexchange.com/questions/24339/… si no le importaría echar un vistazo, estoy trabajando para agregar un gif a esa publicación ahora