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.

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


person misterjinx    schedule 15.11.2011    source источник


Ответы (3)


попробуй -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
person dooche    schedule 02.12.2011
comment
Очень Красиво, мне нравится! - person Adam F; 13.10.2016
comment
Работает как шарм! Спасибо! - person dmitry.matora; 25.12.2018

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

-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'у за хороший обзор математики .

person Seth    schedule 18.02.2016
comment
Лучший ответ для меня, легко сценарий. - person inolasco; 26.03.2016
comment
Это будет работать с анаморфотными видео: -vf "scale=(iw*sar)*min(TARGET_WIDTH/(iw*sar)\,TARGET_HEIGHT/ih):ih*min(TARGET_WIDTH/(iw*sar)\,TARGET_HEIGHT/ih), pad=TARGET_WIDTH:TARGET_HEIGHT:(TARGET_WIDTH-iw)/2:(TARGET_HEIGHT-ih)/2" - person Ryan Williams; 03.04.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.
person Star Brilliant    schedule 03.02.2017