Введение

FFmpeg — мультимедийный комбайн, набор библиотек которые позволяют записывать, обрабатывать и конвертировать видео и/или аудио материалы в различные форматы. С помощью этого инструмента можно производить видео монтаж практически любой сложности. Его используют многие плееры, конвертеры, редакторы и библиотеки компьютерного зрения. В этой статье я поделюсь трюками и хитростями с FFmpeg, которые и сам часто использую в работе.

Обрезка видео по времени

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

ffmpeg -i i.mp4 -ss 00:01:00 -t 00:02:00 -c copy o.mp4

Параметр -ss указывает на начальную точку, а -t на длительность.

Важное замечание! Если длительность видео 5 минут, начальную точку укажем в 00:04:00, а длительность в 00:02:00, длительность конечного видео будет 1 минута.

Тут и далее по тексту статьи, i.mp4 - это путь к входному файлу, а o.mp4 - к выходному.

Создание видео из фотографий

Предположим, у нас есть камера наблюдения, которая делала фото каждую минуту в течение суток, а мы хотим получить одно непрерывное видео.

Используя код ниже, можно превратить все фото с расширением .jpg из текущей папки в видео, с кадровой частотой 10 FPS, используя H.264 кодек.

ffmpeg -framerate 10 -pattern_type glob -i '*.jpg' -c:v libx264 o.mp4

Извлечение фотографий из видео

А теперь сделаем действие противоположное действию из предыдущего пункта — разобьем видео по кадрам на фотографии.

ffmpeg -i o.mp4 -r 1 -q:v 2 -f image2 img-3%d.jpeg

Склейка двух и больше видео в одно

Для склейки множества видео в одно нам потребуется создать файл, например list.txt, в котором по порядку перечислим пути к видео, которые хотим склеить, например:

file 'video1.mp4'
file 'video2.mp4'
file 'videoN.mp4'

А после этого выполним:

ffmpeg -f concat -i list.txt -c copy o.mp4

Создавать такой файл вручную не лучшая идея, можно его наполнить автоматически, например, так:

for f in ./*.mp4; do echo "file '$f'" >> list.txt; done

или так:

printf "file '%s'\n" ./*.mp4> list.txt

Удаление и извлечения аудио из видео

Для удаления используем:

ffmpeg -i i.mp4 -c:v copy -an o.mp4

А для извлечения:

ffmpeg -i i.mp4 -vn 0.wav

Обрезка видео по высоте и ширине

В начале статьи я рассказал о способе обрезки видео по времени, но его также можно обрезать и по размеру кадра, например превратить 16:9 формат в 3:4, обрезав кадр слева и справа.

ffmpeg -i i.mp4 -filter:v "crop=w:h:x:y" o.mp4

В фильтре crop по очереди нужно указать ширину, высоту нового кадра, а также его смещение по координатам.

Размещение видео рядом в одном кадре (stack video)

Перед тем, как мы это сделаем, есть пара моментов, которые нужно рассмотреть:

  • Видео должны иметь одинаковую высоту.

  • Видео должны иметь тот же формат пикселей.

Горизонтальное размещение:

ffmpeg -i i0.mp4 -i i1.mp4 -filter_complex hstack=inputs=2 o.mp4

Вертикальное размещение:

ffmpeg -i i0.mp4 -i i1.mp4 -filter_complex vstack=inputs=2 o.mp4

Сетка 2x2:

ffmpeg -i i0.mp4 -i i1.mp4 -i i2.mp4 -i i3.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2[top]; [2:v][3:v]hstack=inputs=2[bottom]; [top][bottom]vstack=inputs=2[v]" -map "[v]" o.mp4

Сетка 3x2:

ffmpeg -i i0.mp4 -i i1.mp4 -i i2.mp4 -i i3.mp4 -i i4.mp4 -i i5.mp4 -filter_complex "[0:v][1:v][2:v]hstack=inputs=3[top];[3:v][4:v][5:v]hstack=inputs=3[bottom];[top][bottom]vstack=inputs=2[v]" -map "[v]" o.mp4

Поворот видео

ffmpeg -i i.mp4 -vf "transpose=0" o.mp4

Параметр transpose в коде выше может принимать такие значения:

  • 0 - Повернуть на 90 градусов против часовой стрелки и развернуть по вертикали. По умолчанию.

  • 1 - Повернуть на 90 градусов по часовой стрелке.

  • 2 - Повернуть на 90 градусов против часовой стрелки.

  • 3 - Повернуть на 90 градусов по часовой стрелке и развернуть по вертикали.

Послесловие

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

Если вы знаете еще полезные хитрости и трюки — милости прошу поделиться ими в комментариях. Спасибо!