Как объединить два видео

Часто возникает необходимость сравнить два видео. Например, почистили видео от царапин или сделали цветокоррекцию, и теперь нужно пустить два ролика одновременно (фактически объединить два видео), чтобы пользователь или заказчик видел результат имея возможность мгновенно сравнивать «до» и «после». В отличие от фото, когда можно расположить две фотографии рядом, с видео все несколько сложней. В данной статье объясняется, как объединить два видео, имея под рукой минимальный набор необходимых инструментов.

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

Предположим есть два видеоролика: A.avi и B.avi.

кадры двух видео

Мы хотим сделать третье видео в котором слева будет проигрываться «A», справа «B».

объединенные кадры

Тем самым мы сможем покадрово сравнивать результат «до» и «после».

Я предалагю сделать так:

  1. Разберем оба видеоролика на отдельные кадры;
  2. Возьмем первый кадр из видео «A», «приклеим» справа к нему первый кадр из видео «B»;
  3. Построим «склейку» для всех оставшихся кадров;
  4. По склеенным кадрам сделаем новое видео.

В качестве примера можно посмотреть на следующий видеоролик, склеенный из двух видео.
Слева — исходный вариант до обработки (ship-low-color.mp4).
Справа — то что получилось после добавления насыщенности и резкости (ship-hi-color.mp4).

Для реализации этой идеи нам понадобятся свободнораспространяемые программы FFmpeg и ImageMagick. Абсолютно бесплатные программы, работающие на слабых компьютерах (им не надо много памяти), есть версии для Windows и для Linux и самое главное работающие из командной строки.

Итак, чтобы объединить два видео ship-low-color.mp4 и ship-hi-color.mp4 выполним следующие шаги.

Шаг 1 — подготовка

Создадим папку на диске, например merge-video:

mkdir merge-video

Сделаем еще две папки внутри merge-video (лучше использовать имена видеофайлов, которые будем склеивать):

cd merge-video
mkdir ship-low-color
mkdir ship-hi-color

Шаг 2 — раскладываем видео по кадрам

Разложим каждое видео на отдельные кадры и запишем их в png файлы. В отличие от jpg, png файлы позволяют записать изображение с большей цветовой глубиной и избежать артефактов сжатия. При желании можно использовать для этих целей TIFF формат.

Находясь в папке «merge-video», раскладываем первое видео на кадры и складываем их в папку «hi-color»:

ffmpeg -i ship-hi-color.mp4 hi-color/img_%08d.png

Вот так будет выглядеть папка «hi-color» после извлечения кадров из видео:

Обратите внимание на «%08d» — это означает, что название файлов будет img_<8 цифр>.png.

Проделываем тоже самое для воторого видео, но его кадры кладем в «low-color»:

ffmpeg -i ship-low-color.mp4 low-color/img_%08d.png

Шаг 3 — склеиваем изображения

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

У ImageMagick есть два режима склейки:
1) «+append» — изображения стыкуются по боковой стороне:

2) «-append» — изображения стыкуются по верхней/нижней стороне:

В нашем случае будем использовать «+append».

mkdir merged-image; for img_low in low-color/*.png; do img_hi=`echo $img_low | sed 's/low/hi/'`; num=`echo $img_low | sed 's/low-color\///'`; magick convert ${img_low} ${img_hi} +append merged-image/frame_${num}; done

Выглядит устрашающе, но ничего сложного в этой строке нет 🙂

После выполнения этих команд в рабочей директории появится папка «merged-image»:

Шаг 4 — создаем видео

ffmpeg -pattern_type glob -i 'merged-image/frame_img_*.png' -framerate 30 -an -b:v 6000K -preset veryslow video-merged.mp4

После того, как ffmpeg отработает в рабочей папке появится результирующее video-merged.mp4 являющееся результатом объединения ship-hi-color.mp4 и ship-low-color.mp4.

Выводы

В этой статье мы узнали, как объединить два видео с минимальным набором установленных программ. Все, что нам потребовалось — это две консольные программки FFmpeg и ImageMagick. Не надо скачивать сотни мегабайт, не нужно устанавливать кодеки, не нужен даже графический интерфейс. Все делается из командной строки из окна терминала. Уверяю вас — такое нужно и причем нередко (в научных расчетах на кластерах располагающихся где-то в облаке).

You May Also Like