
Часто возникает необходимость сравнить два видео. Например, почистили видео от царапин или сделали цветокоррекцию, и теперь нужно пустить два ролика одновременно (фактически объединить два видео), чтобы пользователь или заказчик видел результат имея возможность мгновенно сравнивать «до» и «после». В отличие от фото, когда можно расположить две фотографии рядом, с видео все несколько сложней. В данной статье объясняется, как объединить два видео, имея под рукой минимальный набор необходимых инструментов.
Я уже писал про сравнивание фото и видео в Что такое метрики и для чего они нужны. Но там использовался сухой математический подход и все сравнение проводилось на языке цифр. Но не всегда все можно описать языком формул, поэтому зачастую приходится прибегать к визуальному методу сравнения.
Предположим есть два видеоролика: A.avi и B.avi.
Мы хотим сделать третье видео в котором слева будет проигрываться «A», справа «B».
Тем самым мы сможем покадрово сравнивать результат «до» и «после».
Я предалагю сделать так:
- Разберем оба видеоролика на отдельные кадры;
- Возьмем первый кадр из видео «A», «приклеим» справа к нему первый кадр из видео «B»;
- Построим «склейку» для всех оставшихся кадров;
- По склеенным кадрам сделаем новое видео.
В качестве примера можно посмотреть на следующий видеоролик, склеенный из двух видео.
Слева — исходный вариант до обработки (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. Не надо скачивать сотни мегабайт, не нужно устанавливать кодеки, не нужен даже графический интерфейс. Все делается из командной строки из окна терминала. Уверяю вас — такое нужно и причем нередко (в научных расчетах на кластерах располагающихся где-то в облаке).