Поддержание соотношения сторон FFMPEG - PullRequest
41 голосов
/ 22 ноября 2011

Мне нужно конвертировать кучу видеофайлов с помощью ffmpeg. Я запускаю bash-файл, который хорошо конвертирует все файлы, но есть проблема, если конвертированный файл не в формате 16: 9. Поскольку я фиксирую размер экрана на -s 720x400, если форматное соотношение оригинала равно 4: 3, ffmpeg создает выходной файл 16: 9, что приводит к ухудшению формата изображения.

Есть ли настройка, позволяющая установить соотношение сторон в качестве основного параметра с изменяемым размером (например, путем фиксации только размера X или Y)?

Ответы [ 7 ]

58 голосов
/ 11 января 2013
-vf "scale=640:-1"

прекрасно работает, пока не встретится ошибка

[libx264 @ 0x2f08120] height not divisible by 2 (640x853)

Поэтому наиболее общий подход - использовать выражения фильтра:

scale=640:trunc(ow/a/2)*2

Он принимает ширину вывода (ow), делит еепо соотношению сторон (а), делит на 2, усекает цифры после десятичной точки и умножает на 2. Это гарантирует, что полученная высота делится на 2.

Кредиты на ffmpeg trac

ОБНОВЛЕНИЕ

Как отмечалось в комментариях, более простым способом было бы использовать -vf "scale=640:-2".Кредиты @BradWerth для элегантного решения

28 голосов
/ 10 сентября 2012

Например:

1920x1080 форматное соотношение 16: 9 => 640x480 форматное соотношение 4: 3:

ffmpeg -y -i import.media -aspect 16:9 scale=640x360,pad=640:480:0:60:black output.media

формат изображения 16: 9, размер ширина 640 пикселей => высота 360 пикселей:
С конечным размером вывода 640x480 и черным изображением 60 пикселей (сверху и снизу):

"-vf scale=640x360,pad=640:480:0:60:black"
20 голосов
/ 17 марта 2012

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

Вы можете просто использовать его так:

-vf "scale=640:-1" 

, который фиксирует ширину и обеспечивает высоту, необходимую для сохранения соотношения сторон.Но вы также можете использовать множество других опций и даже математические функции, см. Документацию здесь - http://ffmpeg.org/ffmpeg.html#scale

8 голосов
/ 29 августа 2016

Использование force_original_aspect_ratio, из ffmpeg trac :

ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4
8 голосов
/ 14 мая 2014

Хотя большинство из этих ответов великолепны, я искал команду, которая могла бы изменить размер до целевого размера (ширина или высота) при сохранении соотношения сторон. Я смог сделать это, используя Оценка выражения ffmpeg .

Вот соответствующий видеофильтр с целевым размером 512:

-vf "thumbnail,scale='if(gt(iw,ih),512,trunc(oh*a/2)*2)':'if(gt(iw,ih),trunc(ow/a/2)*2,512)'"


Для ширины вывода:

'if(gt(iw,ih),512,trunc(oh*a/2)*2)'

Если ширина больше высоты, вернуть цель, в противном случае вернуть пропорциональную ширину.


Для выходной высоты:

'if(gt(iw,ih),trunc(ow/a/2)*2,512)'

Если ширина больше высоты, вернуть пропорциональную высоту, в противном случае вернуть цель.

6 голосов
/ 17 июля 2018

Если вы пытаетесь установить ограничивающий прямоугольник, то использование force_original_aspect_ratio согласно ответу xmedeko является хорошей отправной точкой.

Однако, это не работает, если ваше входное видео имеет странный размер и , который вы кодируете в формат, который требует, чтобы размеры делились на 2, что приводит к ошибке.

В этом случае вы можете использовать оценку выражения в функции scale, как это было в ответ Чарли .

Предполагая выходной ограничивающий прямоугольник 720x400:

-vf "scale='trunc(min(1,min(720/iw,400/ih))*iw/2)*2':'trunc(min(1,min(720/iw,400/ih))*ih/2)*2'"

Чтобы разобрать это:

  • min(1,min(720/iw,400/ih) находит коэффициент масштабирования, чтобы поместиться в ограничивающей рамке (от здесь ), ограничивая его максимум 1, чтобы обеспечить только уменьшение масштаба, а
  • trunc(<scaling factor>*iw/2)*2 и trunc(<scaling factor>*iw/2)*2 гарантируют, что размеры делятся на 2 путем деления на 2, превращения результата в целое число, а затем умноженияобратно на 2.

Это устраняет необходимость в поиске размеров входного видео до кодирования.

0 голосов
/ 22 ноября 2011

вы можете использовать ffmpeg -i, чтобы получить размеры исходного файла, и использовать это в ваших командах для кодирования.На какой платформе вы используете ffmpeg?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...