С более новыми версиями ffmpeg, вы можете использовать scale
фильтр force_original_aspect_ratio
option. Например, чтобы поместить видео в размер 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, если входное видео больше. Если он меньше, он не будет масштабироваться. The 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
Я не буду вдаваться в объяснения того, что все это делает, но в основном вы можете кормить его любым видео, и это будет только масштабирование, а не масштабирование. Если вы для этого можно разделить фильтр на отдельные выражения. Возможно, это можно сократить, но это также работает.