Введение
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 очень мощный инструмент для обработки видео. С его помощью, имея шпаргалку по его возможностям, можно сэкономить много времени — куда быстрее ввести несколько команд, чтобы обработать видео, чем запускать редактор.
Если вы знаете еще полезные хитрости и трюки — милости прошу поделиться ими в комментариях. Спасибо!
Автор: shyneko