Hay formas sencillas para escalar un vídeo con FFMpeg:
ffmpeg -i input.mov -filter:
v
scale=1080:-1 output.mp4
Con -1 indicamos que conserve el aspecto (proporción) del original.
El problema viene cuando quiero escalar un vídeo dentro de una operación compleja de ffmpeg. Al usar, por ejemplo -filter_complex, no permite usar el cambio de escala de la manera normal.
Quería compartir este código que me ha costado bastante sacar a base de muchas pruebas y consultas en la web.
La idea era poder hacer un script para poder crear un vídeo con frames negros al comienzo y al final (esto es tema de una entrada anterior) y poderlo escalar al tamaño deseado. En este caso de 1920×1080 a 1280x 720
Para ello primero hay que indicar el tamaño que queremos en el generador de frames negros…
-f lavfi -i color=c=black:s=1280×720:r=25:d=1
… y luego escalar el vídeo que interesa dentro de -filter_complex
-filter_complex «[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend];
Aquí el código completo:
ffmpeg -f lavfi -i color=c=black:s=1280×720:r=25:d=1 -f lavfi -i «aevalsrc=0:c=stereo:d=1» -i input.mov -filter_complex «[0:v] trim=start_frame=1:end_frame=5 [blackstart]; [0:v] trim=start_frame=1:end_frame=5 [blackend]; [2:v] scale=1280:-1 [scaled]; [1:a] atrim=duration=0.2 [audiostart]; [1:a] atrim=duration=0.2 [audioend]; [blackstart] [audiostart] [scaled] [2:a] [blackend] [audioend] concat=n=3:v=1:a=1[v][a]» -map «[v]» -map «[a]» -c:v libx264 -crf 22 -preset slow -profile:v high10 -pix_fmt yuv420p -c:a aac -strict -2 -b:a 128k -timecode 00:01:00:00 -tune zerolatency output.mp4