С новыми версиями FFmpeg, вы можете использовать опцию scale
force_original_aspect_ratio
фильтра. Например, чтобы разместить видео в разрешении 1280 × 720 без увеличения (см. Этот пост для получения дополнительной информации):
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
Здесь scale
фильтр масштабируется до 1280 × 720, если входное видео больше этого. Если он меньше, он не будет увеличен. pad
фильтр необходим для доведения выходного видео до 1280 × 720, если его форматное соотношение или размер отличаются от целевого размера.
В старых версиях ffmpeg есть несколько хакерских решений.
Сначала определите ширину, высоту и соотношение сторон вашего вывода. Это спасет нас от набора текста.
width=640; height=360
aspect=$( bc <<< "scale=3; $width / $height") # <= floating point division
Теперь давайте применим супер сложную команду фильтра, которую написал Джим Уорралл:
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
Я не буду подробно объяснять, что все это делает, но в основном вы можете кормить его любым видео, и оно будет только уменьшать, а не улучшать. Если вы готовы к этому, вы можете разделить фильтр на отдельные выражения. Можно было бы сократить это, но это также работает.