
Estou tentando aplicar efeito de câmera lenta a uma série de vídeos. E ainda mais esses vídeos serão dimensionados, preenchidos e desbotados. A seguir está o comando que estou usando para aplicar câmera lenta.
ffmpeg -i 1.mp4 -filter_complex "
[0:v]trim=0:5,setpts=PTS-STARTPTS[tv1];
[0:v]trim=5:7,setpts=PTS-STARTPTS[tv2];
[0:v]trim=start=7,setpts=PTS-STARTPTS[tv3];
[tv2]setpts=PTS*2[slow];
[tv1][slow][tv3]concat=n=3:v=1:a=0[out]" -map [out] -c:v libx264 test.mp4
Eu tenho duas perguntas.
- Referindo-
[tv2]
se a que é cortado e aplicado o efeito de câmera lenta a partir do 5º segundo, na verdade ele aplica o efeito a partir do 4º segundo. Qual é a razão para isto?
A seguir está o comando que estou usando para outro processamento logo após concatenar no comando acima.
[concat0]scale=iw*min(1280/iw\,720/ih):ih*min(1280/iw\,720/ih),pad=1280:720:(1280-iw*min(1280/iw\,720/ih))/2:(720-ih*min(1280/iw\,720/ih))/2,format=pix_fmts=yuva420p,fade=t=out:st=16:d=2:alpha=1,setpts=expr=PTS-STARTPTS+10/TB[va0];
Lá preciso especificar setpts
e estou usando a duração acumulada dos vídeos antes do vídeo atual.Aquié o comando completo que estou usando para isso.
- Como posso calcular a duração do vídeo após aplicar o efeito de câmera lenta? Por exemplo, qual seria o incremento da duração do resultado do vídeo do primeiro comando que mencionei aqui em segundos ou mesmo microssegundos?
Responder1
Questão 1- O comando está incompleto porque você não leva em consideração oáudiofaixa, você alterou o PTS apenas navídeoacompanhar. Para ver a diferença, tente isto:
# no-good, starts from 4th second audio with a frozen video frame
ffmpeg -i in.mp4 -vf trim=5:7 out.mp4
#
# works as expected, both audio and video start at 5th second
ffmpeg -i in.mp4 -vf trim=5:7 -af atrim=5:7 out.mp4
Questão 2- Isso também não funcionará como esperado pelo mesmo motivo, mas depois de corrigir o problema anterior, aqui está um truque não muito elegante, mas eficaz, para correlacionar os tempos "antes" e "depois":
# overlay the input video with a timer, pulled to the right 200 pixels
ffmpeg -i in.mp4 -f lavfi -i testsrc=n=3 -vf overlay=x=200 in-with-time.mp4
#
# do all your manipulation, and finaly overlay with another timer at x=0
ffmpeg -i in-with-time.mp4 -f lavfi -i testsrc=n=3 -filter_complex "..stuff...,overlay[out]" out.mp4
Isso fornece por quadro o tempo original e resultante com precisão de 1 milissegundo.