Подтвердить что ты не робот

Сохранение соотношения сторон FFMPEG

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

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

4b9b3361

Ответ 1

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

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

-vf "scale=640:-1" 

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

Ответ 2

-vf "scale=640:-1"

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

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

Итак, наиболее общий подход - использовать выражения фильтра:

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

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

Кредиты для ffmpeg trac

UPDATE

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

Ответ 3

Например:

Формат изображения 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"

Ответ 4

Хотя большинство из этих ответов великолепны, я искал команду, которая могла бы изменить размер до целевого размера (ширины или высоты) при сохранении соотношения сторон. Мне удалось это сделать с помощью ffmpeg Expression Evaluation.

Вот соответствующий видеофильтр, с целевым размером 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)'

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

Ответ 5

Используйте force_original_aspect_ratio из трассы ffmpeg:

ffmpeg -i input.mp4 -vf scale=720:400:force_original_aspect_ratio=decrease output.mp4

Ответ 6

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

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

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

Предполагая выходной ограничивающий прямоangularьник 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.

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

Ответ 7

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

Ответ 8

Если присутствует "-aspect x: y" и формат выходного файла равен формату мультимедийного файла ISO (mp4), то ffmpeg добавляет pasp-atom (PixelAspectRatioBox) в поле stsd на дорожке видео, чтобы указать игрокам ожидаемый                              соотношение сторон. Игроки должны масштабировать видеокадры соответственно. Не нужно масштабировать видео перед кодированием или транскодированием, чтобы подогнать его под форматное соотношение, оно должно выполняться плеером.