Como fazer uma escala de tempo variável?

0

Eu tenho um vídeo em que gostaria de alterar a escala de tempo de um vídeo com base em taxas lidas de um arquivo.

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

  • Comece em velocidade 1x
  • Na marca de 5.7564 segundos mudaria para velocidade de 1.4x
  • Na marca de 10,2571 segundos mudaria para velocidade de 0,983333x
  • Na marca de 15,6251 segundos mudaria para a velocidade de 1x para o resto do vídeo.

Eu descobri que provavelmente precisaria criar um arquivo de script que pudesse ser lido por -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 porque isso acontece, mas não sei o que devo fazer.

A melhor maneira seria cortar o vídeo em 4 segmentos e usar apenas um setpts=#*PTS por segmento, mas não sei como criar scripts.

    
por Scott Chamberlain 14.09.2015 / 03:16

1 resposta

1

Como você mencionou, uma abordagem seria aparar 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
    
por 23.09.2015 / 17:03