Como fazer uma escala de tempo variável?

Como fazer uma escala de tempo variável?

Tenho um vídeo em que gostaria de alterar a escala de tempo de um vídeo com base nas proporções lidas de um arquivo.

Eu descobri que para dobrar a velocidade de um vídeo inteiro eu poderia usar o setptsfiltro setpts=2*PTS, mas o que eu quero fazer é mudar a escala ao longo do tempo para que o vídeo

  • Comece na velocidade 1x
  • Na marca de 5,7564 segundos, ele mudaria para velocidade de 1,4x
  • Na marca de 10,2571 segundos, ele mudaria para a velocidade de 0,983333x
  • Na marca de 15,6251 segundos, ele mudaria para velocidade 1x para o resto do vídeo.

Descobri que provavelmente precisaria criar um arquivo de script que pudesse ser lido, -filter_script:vmas não sei o que usar para obter o comportamento desejado.

Minha primeira abordagem ingênua foi fazer

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
))))'

mas isso faz com que o vídeo salte nos pontos de corte e pode fazer com que partes do vídeo sejam ignoradas ou repetidas. Agora entendo por que isso acontece, mas não sei o que devo fazer.

A melhor maneira provavelmente seria cortar o vídeo em 4 segmentos e usar apenas um setpts=#*PTSpor segmento, mas não sei como criar um script para isso.

Responder1

Como você mencionou, uma abordagem seria cortar a entrada em quatro segmentos separados, aplicar o filtro setpts em dois deles e, finalmente, concatenar todos eles. aqui está o comando para isso:

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

informação relacionada