
Estoy intentando aplicar el efecto de cámara lenta a una serie de videos. Y además, esos vídeos se escalarán, se rellenarán y se difuminarán. El siguiente es el comando que estoy usando para aplicar cámara 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
Tengo dos preguntas.
- En referencia a
[tv2]
que se recorta y se aplica el efecto de cámara lenta a partir del quinto segundo, en realidad aplica el efecto a partir del cuarto segundo. ¿Cuál es la razón para esto?
El siguiente es el comando que estoy usando para otros procesos justo después de concatenar en el comando anterior.
[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];
Allí necesito especificar setpts
y estoy usando la duración acumulada de los videos antes del video actual.Aquíes el comando completo que estoy usando para ello.
- ¿Cómo puedo calcular la duración del vídeo después de aplicar el efecto de cámara lenta? Por ejemplo, ¿cuál sería el incremento de la duración del resultado del vídeo a partir del primer comando que mencioné aquí en segundos o incluso microsegundos?
Respuesta1
Pregunta 1- El comando está incompleto porque no se tiene en cuenta elaudiopista, cambiaste el PTS sólo en lavideopista. Para ver la diferencia, prueba esto:
# 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
Pregunta 2- Esto tampoco funcionará como se esperaba por la misma razón, pero una vez que solucione el problema anterior, aquí hay un truco no muy elegante pero efectivo para correlacionar los tiempos "antes" y "después":
# 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
Esto le proporciona por fotograma el tiempo original y resultante con una precisión de 1 milisegundo.