ffmpeg уменьшит размер видео до нужного размера и добавит отступы - PullRequest
19 голосов
/ 15 ноября 2011

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

Итак, предположим, что у меня есть исходные размеры видео 1280x720 и для моей области 405x320 мне нужно сначала изменить размер видео до 405x227.Я делаю это.Все хорошо на этом этапе.Я делаю математику и обнаруживаю, что мне нужно добавить 46 пикселей отступа сверху и снизу.

Так что параметром заполнения команды для этого будет -vf "pad=405:320:0:46:black".Но каждый раз, когда я запускаю команду, я получаю сообщение об ошибке типа Input area 0:46:405:273 not within the padded area 0:0:404:226.

Единственные документы для заполнения, которые я нашел, это http://ffmpeg.org/libavfilter.html#pad.

Я не знаю, что я делаю неправильно.У кого-нибудь была эта проблема раньше?У вас есть предложения?

Ответы [ 3 ]

44 голосов
/ 02 декабря 2011

попробуй -vf "scale=iw*min(405/iw\,320/ih):ih*min(405/iw\,320/ih),pad=405:320:(405-iw)/2:(320-ih)/2"

Отредактируйте, чтобы уточнить, что происходит в этой строке: вы спрашиваете, как масштабировать один блок, чтобы он поместился в другой блок. Коробки могут иметь разные пропорции. Если они это сделают, вы хотите заполнить одно измерение и центрироваться вдоль другого измерения.

# you defined the max width and max height in your original question
max_width     = 405
max_height    = 320

# first, scale the image to fit along one dimension
scale         = min(max_width/input_width, max_height/input_height)
scaled_width  = input_width  * scale
scaled_height = input_height * scale

# then, position the image on the padded background
padding_ofs_x = (max_width  - input_width) / 2
padding_ofs_y = (max_height - input_height) / 2
8 голосов
/ 18 февраля 2016

Вот обобщенное выражение фильтра для масштабирования (поддержания соотношения сторон) и дополнения любого исходного размера до любого целевого размера:

-vf "scale=min(iw*TARGET_HEIGHT/ih\,TARGET_WIDTH):min(TARGET_HEIGHT\,ih*TARGET_WIDTH/iw),
     pad=TARGET_WIDTH:TARGET_HEIGHT:(TARGET_WIDTH-iw)/2:(TARGET_HEIGHT-ih)/2"

Замените TARGET_WIDTH и TARGET_HEIGHT желаемыми значениями.Я использую это, чтобы извлечь миниатюру размером 200х120 из любого видео.Проповеди Дэвину за его хороший обзор математики .

3 голосов
/ 03 февраля 2017

Попробуйте:

-vf 'scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:x=(640-iw)/2:y=(480-ih)/2:color=black'

Согласно документации FFmpeg, опция force_original_aspect_ratio полезна для сохранения исходного соотношения сторон при масштабировании:

   force_original_aspect_ratio
       Enable decreasing or increasing output video width or height if
       necessary to keep the original aspect ratio. Possible values:

       disable
           Scale the video as specified and disable this feature.

       decrease
           The output video dimensions will automatically be decreased if
           needed.

       increase
           The output video dimensions will automatically be increased if
           needed.
...