2

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

Первый работает для разных размеров (но не масштабируется до нужного размера):

ffmpeg -i input1 -i input2 -filter_complex '[0:v]pad=iw:ih*2[int];[int][1:v]overlay=0:H/2[vid]' -map [vid] -c:v libx264 -crf 23 -preset veryfast output

Второй работает, если видео имеют одинаковую ширину и формат пикселей:

ffmpeg -i input1 -i input2 -filter_complex vstack output

Как получить ширину первого ввода внутри аргумента сложного фильтра, чтобы второй вход мог масштабироваться до той же ширины? Какова будет команда, чтобы сделать это? Я бы предпочел фильтр vstack, так как он должен быть быстрее, чем комбинация pad и overlay.

2 ответа2

5

Вам нужно использовать фильтр scale2ref .

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output

Обратите внимание, что это работает только в том случае, если пропорции обоих видео одинаковы. Если нет, и вы знаете соотношение сторон 2-го видео, используйте [1][0]scale2ref=iw:iw*(H/W)[2nd][ref] где (H/W) следует заменить на соотношение высоты до ширины 2-го видео.


При сборке последней git-версии ffmpeg возможна упрощенная версия,

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref=oh*mdar:ih[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output

Это автоматически сохранит соотношение сторон второго входа.

0
  1. Вы можете получить размеры по:

ffprobe -v ошибка -show_entries stream = ширина, высота -of по умолчанию = noprint_wrappers = 1 - json input_video

  1. сохранить вывод в переменной, например, ffprobe_output. тогда получите ширину:

width = ffprobe_output ['streams'] [0] ['width']

для файлов m4v вы должны получить их во втором массиве:

width = ffprobe_output ['streams'] [1] ['width']

  1. масштаб с этой шириной:

3.a) масштабировать с заданной шириной и сохранять пропорции

ffmpeg -i input_movie -vf scale = width:-1 output_movie

3.b) масштабировать с заданной шириной, сохранять пропорции, но делить высоту, делимую на 2 (требуется для многих форматов пикселей):

ffmpeg -i input_movie -vf scale = width:-2 output_movie

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .