Введение
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 очень мощный инструмент для обработки видео. С его помощью, имея шпаргалку по его возможностям, можно сэкономить много времени — куда быстрее ввести несколько команд, чтобы обработать видео, чем запускать редактор.
Если вы знаете еще полезные хитрости и трюки — милости прошу поделиться ими в комментариях. Спасибо!
aafin
Может знает кто? Как совместить захват части экрана
1. под виндовз
2. чтобы был показ рамки вокруг захватываемой области
3. чтобы со звуком
Без рамки или без звука работает. Если с рамкой и звуком — захватывает черноту.
xeon
ShareX всё это умеет. OpenSource, под капотом использует ffmpeg, можно кастомизировать параметры записи (я делаю сразу resize в 2 раза меньше, чтобы видео с 4k экрана было разумного размера).
getsharex.com
denaspireone
Camtasia studio?
OBS studio
aafin
Не, обсом все умеют. Тут челенж в том, чтоб сделать это скриптом и одной кнопкой. Нажал на и конку и запись пошла. Без лишних менюшек.