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 setpts
filtro 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:v
mas 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=#*PTS
por 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