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

Ffmpeg измените размер более крупного видео, чтобы он соответствовал желаемому размеру и добавлял дополнение

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

Итак, позвольте сказать, что у меня есть оригинальные размеры видео 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.

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

4b9b3361

Ответ 1

попробуйте -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

Ответ 2

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

-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 на нужные значения. Я использую это, чтобы вытащить миниатюру размером 200x120 из любого видео. Подкрепляет davin за его хороший обзор математики.

Ответ 3

Попробуйте следующее:

-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.