¿Es posible en FFMPEG cambiar la escala con el tiempo?

Ok, usando el filtro de superposición, uno puede cambiar la ubicación x/y de un video con el tiempo usando la variable "t". Por ejemplo, overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0se puede usar para comenzar a deslizar un elemento superpuesto desde la parte superior izquierda a la parte superior derecha, después de que hayan pasado 2 segundos.

Lo que quiero hacer es usar un principio similar para escalar elementos. Me gustaría poder cambiar la escala de un video a lo largo del tiempo usando una expresión (como scale=w=iw*t, o algo similar).

es posible?

cuando ejecuto esa expresión a través de -filter_complex, obtengo

Error al evaluar la expresión 'iw*t'.

Tal vez la expresión para out_w:'iw*t' o para out_h:'-1' sea autorreferencial.

Siento que hay una buena posibilidad de que necesite parchear FFMpeg si quiero obtener esta funcionalidad, pero pensé en preguntar primero, ¡para ver si alguien está al tanto de este tipo de cosas!

¿Alguien sabe cómo se podría lograr tal tarea?

¡Gracias por la ayuda!

Suena más como un error de sintaxis en este momento, pero no he usado esa función antes, así que lamentablemente no puedo ayudar aquí.
Por lo que puedo decir, mi sintaxis permanece limpia y funcional hasta que introduzco la variable "t". Más allá de eso, parece enojarse conmigo y arrojar errores, sin importar lo que intente: P
Entonces, ¿todo funciona hasta que agregas *t?
*t, +t, cualquier cosa que tenga que ver con "t". En cualquier otra característica adaptable al tiempo en libavfilter, lo hace dinámico agregando una "t" a la expresión. Con esto, introducir la "t" solo causa errores, todo el tiempo. Entonces, me pregunto si hay una puerta trasera que me falta, o si la función simplemente no existe: P
No es algo definido cuando se trata de un filtro de superposición.
Se define con respecto a las coordenadas x e y de la superposición. Puede usarlo de manera efectiva en esas expresiones (consulte los documentos). Sin embargo, tengo problemas para que funcione en los valores de escala.
Podrías simplemente escribir un filtro. wiki.multimedia.cx/index.php?title=FFmpeg_filter_howto
La última vez que estuve mirando las expresiones ffmpeg, tuve dificultades para encontrar qué variables estaban disponibles para las expresiones en qué filtro. Algunos de ellos admiten t, otros no. Reevaluar la expresión y reconfigurar el filtro para cada cuadro es costoso para algunos filtros, así que supongo que es por eso que no lo hacen.
@ theophilus777, ¿encontró la respuesta a su pregunta?
@alexspeller, el filtro de escala no admite la edición de la línea de tiempo, por lo que no es directamente posible. Voy a comprobar si hay una solución.
@Mulvya ¿Qué hay de extraer marcos, escalarlos según sea necesario y volver a colocarlos?
Técnicamente posible con salida H.264/5. No sé cómo los jugadores/editores lo manejarán.
Para ser honesto, esto definitivamente se puede lograr escribiendo una aplicación externa (por ejemplo, en python), donde las proporciones de escala se pueden multiplicar por un factor variable. Veré qué puedo hacer. Cualquier sugerencia es bienvenida.
@Mulvya No, los jugadores no pueden manejarlo. Necesitan un tamaño de marco constante. Los marcos variables deben estar acolchados para completar el marco.
No es verdad. Pruebe esto: codifique un video en algún tamaño pero guárdelo en .TS. Codifique otro video con un tamaño diferente pero con la misma configuración de codificación y guárdelo como .TS. Use el demuxer o protocolo concat de FFmpeg para crear MP4 fusionado. Juega en VLC o Potplayer. trabaja aquí En Potplayer, si usa el atajo kbd para cambiar el tamaño de la ventana del reproductor al tamaño del video, cambiará el tamaño a los nuevos parámetros de video si presiona la tecla cuando la reproducción haya cambiado al segundo video. Básicamente, si su codificador/muxer inserta múltiples SPS/PPS en banda (es decir, en mdat), entonces algunos reproductores admiten reinicio de contexto.
@alexspeller ¿Cuál es el propósito de la escala dinámica?

Respuestas (1)

Por lo que entiendo, 't' se evalúa una vez. ¿Has leído esto: https://ffmpeg.org/ffmpeg-filters.html#zoompan ?

Documentos ffmpeg:

9.170.1 Ejemplos

  • Acérquese hasta 1,5 y realice una panorámica al mismo tiempo en algún punto cerca del centro de la imagen:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom, 1.5),y,y+1)':s=640x360

  • Acerca el zoom hasta 1,5 y haz una panorámica siempre en el centro de la imagen:

zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'

  • Igual que el anterior pero sin pausa:

zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/ acercar/2)'