Solución:
-vf "scale=640:-1"
funciona muy bien hasta que encuentre un error
[libx264 @ 0x2f08120] height not divisible by 2 (640x853)
Entonces, el enfoque más genérico es usar expresiones de filtro:
scale=640:trunc(ow/a/2)*2
Toma el ancho de salida (ow), lo divide por la relación de aspecto (a), divide por 2, trunca los dígitos después del punto decimal y multiplica por 2. Garantiza que la altura resultante sea divisible por 2.
Créditos a ffmpeg trac
ACTUALIZAR
Como señalaron los comentarios, una forma más sencilla sería utilizar -vf "scale=640:-2"
. Créditos a @BradWerth por una solución elegante
Por ejemplo:
Relación de aspecto de 1920×1080 16: 9 => Aspecto de 640×480 4: 3:
ffmpeg -y -i import.media -aspect 16:9 scale=640x360,pad=640:480:0:60:black output.media
relación de aspecto 16: 9, ancho de tamaño 640 píxeles => altura 360 píxeles:
Con un tamaño de salida final de 640×480 y una imagen negra de almohadilla de 60 píxeles (superior e inferior):
"-vf scale=640x360,pad=640:480:0:60:black"
Le pregunté esto hace mucho tiempo, pero en realidad tengo una solución que no conocía en ese momento: para mantener la relación de aspecto, debe usar la escala del filtro de video, que es una herramienta muy poderosa. filtrar.
Simplemente puede usarlo así:
-vf "scale=640:-1"
Lo que fijará el ancho y proporcionará la altura requerida para mantener la relación de aspecto. Pero también puede usar muchas otras opciones e incluso funciones matemáticas, consulte la documentación aquí: http://ffmpeg.org/ffmpeg.html#scale