Изменить размер видео с помощью ffmpeg - сохранить соотношение сторон - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь написать скрипт для пользователя-телеграммы, который может конвертировать любое видео / анимацию в .mp4. У меня уже есть, поэтому скрипт связывает и использует API cloudconvert.com .

Теперь моя проблема заключается в команде ffmpeg, которую я передаю в CC, так как мне нужно, чтобы видео было меньше 1280 пикселей по обе стороны. Неважно, будет ли конечное видео 720 * 1280 или 1280 * 1280 или что-то совсем другое, если ни одна из сторон не превосходит 1280 пикселей.

Здесь есть сложная часть, я не хочу портить соотношение сторон и не хочу увеличивать масштаб видео, если оно меньше 1280.

Часть кода, которая на самом деле важна, это часть масштаба. Этот следующий фрагмент изменит размер видео до максимальной 1280 пикселей в высоту, но не учитывает ширину, он просто сохраняет соотношение.

-vf "scale=min'(1280,iw)':-2"

Теперь, как бы мне пришлось либо адаптировать его, либо изменить так, чтобы он действительно изменял размер в зависимости от того, какая сторона больше 1280 пикселей?

Надеюсь, я достаточно конкретен и с нетерпением жду вашей помощи.

1 Ответ

0 голосов
/ 06 января 2019

Проблема появляется только, если высота больше, чем ширина, это увеличивает количество ограничений для ширины с 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

...