Проблема появляется только, если высота больше, чем ширина, это увеличивает количество ограничений для ширины с 2 до 3:
- ширина должна быть меньше или равна 1280 (не превышать ширину)
- ширина должна быть меньше или равна начальной ширине (не масштабировать)
- ширина должна быть меньше или равна 1280 * ширина / высота (не превышать высоту)
Чтобы проверить все случаи, вы должны использовать min(1280,min(iw,round(1280*iw/ih)))
, создав фильтр
-vf "scale=min(1280,min(iw,round(1280*iw/ih))):-2"
EDIT
В некоторых версиях ffmpeg вышеприведенная строка не будет работать, ссылаясь на проблемы с самоссылкой. В этом случае мы можем создать альтернативную линию мышления:
- Если ширина больше (или равна) высоты, мы масштабируемся по ширине, используя
min(iw,1280)
- Если высота больше ширины, мы масштабируем по высоте, используя
min(ih,1280)
Тогда выражение будет -vf 'scale=if(gte(iw,ih),min(1280,iw),-2):if(lt(iw,ih),min(1280,ih),-2)'
Не забывайте, что вы можете запустить это через какой-то механизм разбора оболочки, который дополнительно создаст необходимость экранировать запятые. Выражение
-vf 'scale=if(gte(iw\,ih)\,min(1280\,iw)\,-2):if(lt(iw\,ih)\,min(1280\,ih)\,-2)'
Проверено на работу с версиями 2.7.2–3.4.4 в Ubuntu Linux