Con las versiones más recientes de ffmpeg, puede usar la opción scale
del filtro force_original_aspect_ratio
. Por ejemplo, para ajustar un video a 1280 × 720, sin escalar (consulte esta publicación para obtener más información):
ffmpeg -i input.mp4 -filter:v "scale='min(1280,iw)':min'(720,ih)':force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
Aquí, el scale
filtro se escala a 1280 × 720 si el video de entrada es más grande que eso. Si es más pequeño, no se ampliará. El pad
filtro es necesario para llevar el video de salida a 1280 × 720, en caso de que su relación de aspecto o tamaño difiera del tamaño objetivo.
Con versiones anteriores de ffmpeg, hay una solución un tanto extraña. Primero, defina el ancho, la altura y la relación de aspecto de su salida. Esto nos ahorrará algo de tipeo.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Ahora, apliquemos el comando de filtro súper complejo que escribió Jim Worrall :
ffmpeg -i input.mp4 -vf "scale = min(1\,gt(iw\,$width)+gt(ih\,$height)) * (gte(a\,$aspect)*$width + \
lt(a\,$aspect)*(($height*iw)/ih)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*iw : \
min(1\,gt(iw\,$width)+gt(ih\,$height)) * (lte(a\,$aspect)*$height + \
gt(a\,$aspect)*(($width*ih)/iw)) + not(min(1\,gt(iw\,$width)+gt(ih\,$height)))*ih" \
output.mp4
Realmente no voy a explicar qué hace todo esto, pero básicamente puedes alimentar cualquier video, y solo disminuirá, no aumentará. Si lo desea, puede diseccionar el filtro en sus expresiones individuales. Es posible acortar esto, pero también funciona así.