¿Cómo hacer una escala de tiempo variable?

¿Cómo hacer una escala de tiempo variable?

Tengo un video en el que me gustaría cambiar la escala de tiempo de un video según las proporciones leídas de un archivo.

He descubierto que para duplicar la velocidad de un video completo podría usar el setptsfiltro setpts=2*PTS, sin embargo, lo que quiero hacer es cambiar la escala con el tiempo para que el video funcione.

  • Comience a velocidad 1x
  • En la marca de 5,7564 segundos cambiaría a una velocidad de 1,4x.
  • En la marca de 10,2571 segundos cambiaría a una velocidad de 0,983333x.
  • En la marca de 15,6251 segundos, cambiaría a velocidad 1x durante el resto del vídeo.

He descubierto que probablemente necesitaría crear un archivo de secuencia de comandos que pudiera leerse, -filter_script:vpero no sé qué usar para obtener el comportamiento que deseo.

Mi primer enfoque ingenuo fue hacer

setpts='
if(lt(T,5.7564),
    1*PTS,      
if(lt(T,10.2571),
    1.4*PTS,
if(lt(T,15.6251),
    0.983333*PTS,
    1*PTS
))))'

pero eso hace que el video salte en los puntos de corte y puede causar que partes del video se salten o se repitan. Ahora entiendo por qué sucede esto, pero no sé qué debo hacer en su lugar.

La mejor manera probablemente sería cortar el video en 4 segmentos y solo usar uno setpts=#*PTSpor segmento, pero no sé cómo escribir un guión.

Respuesta1

Como mencionó, un enfoque sería recortar la entrada en cuatro segmentos separados, aplicar el filtro de configuración en dos de ellos y finalmente concatenarlos todos. aquí está el comando para ello:

ffmpeg -i input.mp4 -lavfi "[0:v]trim=0:5.7564[firstpart];[0:v]trim=start=5.7564:10.2571,setpts=PTS-STARTPTS[secondpart];[0:v]trim=10.2571:15.6251,setpts=PTS-STARTPTS[thirdpart];[0:v]trim=15.6251,setpts=PTS-STARTPTS[forthpart];[secondpart]setpts=PTS/1.4[second];[thirdpart]setpts=PTS/0.983333[third];[firstpart][second][third][forthpart]concat=n=4:v=1:unsafe=1[out]" -map '[out]' output.mp4

información relacionada