FFmpeg как консольный видео-редактор
FFmpeg — набор библиотек и утилит командной строки, позволяющих производить практически все основные операции редактирования и преобразования файлов видео и звуковых файлов. Ниже шпаргалка из основных команд для работы с FFmpeg, которые могут пригодиться при редактировании видео. Особенно обратим внимание на не-деструктивное без потери качества редактирование файлов видео и звуковых файлов. Лицензия: GNU LGPL и GNU GPL. Сайт: http://ffmpeg.org
FFmpeg для начинающих
Съёмка видеороликов в цифровых форматах с помощью смартфонов, фотоаппаратов и прочих цифровых приспособлений стала распространённым явлением. Само собой возникает необходимость как-то редактировать снятые видеоролики, — например, для размещения на «Ютубе». То есть видеоролики часто нужно обрезать, заменять или удалять звуковую дорожку, изменить размер формат видео, а потом всё склеивать в единый файл видео.
Для этого массового занятия создаётся немало программ. Взять хотя бы поставлявшийся ранее в системы Windows видео редактор MoveMaker. Мы же рассмотрим набор утилит и библиотек для редактирования и преобразования медиафайлов под названием FFmpeg.
Чем хорош FFmpeg:
Файлы FFmpeg доступны по общественной лицензии. То есть исходный код свободно открыт для изучения, модификации и распространения. И сами программы практически бесплатны, как книги в общественной библиотеки.
Как и характерно для общественных программ, FFmpeg распространяется для всех популярных операционных системах — GNU/Linux, Windows, MacOS.
Программы FFmpeg являются консольными, редактировать файлы мультимедиа можно прямо из командной строки. Что делает утилиты FFmpeg незаменимыми для автоматизации обработки файлов видео и звуковых файлов в различного рода скриптах и сценариях — например, на веб-сайтах.
FFmpeg имеет собственную библиотеку с поддержкой большого количества кодеков для различных форматов мультимедийных файлов — практически на все случаи жизни. Плюс можно собирать FFmpeg с возможностью подключения сторонних кодеков.
Соответственно для консольных утилит можно создавать и программные оболочки, похожие, например, на MoveMaker, где операции делаются не через командную строку, а с помощью графического интерфейса и манипулятора «мышь». В силу общественной лицензии чего компоненты FFmpeg можно найти практических в большинстве программ для перекодирования и редактирования видео.
FFmpeg для работы позволяет редактировать многие видеоролики без потери качества. У обычного потребителя возможности снимать несжатое или lossless-видео обычно нет, ролики уже получаются сжатыми и дальнейшее редактирование с перекодированием ещё больше добавит артефактов на видео-изображение. Поэтому возможность не-деструктивного без пережатия редактирования видео-файлов никому не помешает.
Так же следует отметить, что FFmpeg имеет альтернативу — форк Libav. Синтаксис параметров команд одинаков в обоих случаях.
О форматах и кодеках
Коротко нужно сказать в качестве не лирического отступления о форматах файлов видео и звуковых файлов. Понимание этого нужно для того, чтобы команды этого набора утилит и библиотек не выглядели как магические заклинания.
Обычно файл видео представляет собой контейнер. Это что-то наподобие архива, созданного архиватором zip или tar, в котором содержаться множество файлов. По сути, в таком контейнере имеются файлы видео-данных, одна или несколько звуковых дорожек, могут быть текстовые файлы субтитров, могут быть и ещё какие-нибудь данные. Обычно эти входящие в контейнер файлы называются потоками.
Распространёнными форматами контейнеров для видео являются 3gp, MP4, MOV, MPEG, AVI, MKV ("Матрёшка"), WEBM и др. FFmpeg работает с большим количеством таких форматов контейнеров.
Формат звуковых файлов — MP3, OGG Vorbis, WAV и др. — обычно содержит аудио-трек и текстовые метаданные о жанре, авторе, исполнителе и т.п.
Непосредственно видео-данные в контейнерах «упакованы» в виде различных форматов, которые определяются кодеками — программами для кодирования и декодирования видео. Наиболее популярными кодеками являются кодеки H.264 и H.265 для контейнера MP4, V8 и V9 для контейнера WEBM.
FFmpeg работает с большим количеством кодеков, включая экзотические. Узнать список возможных кодеков в FFmpeg можно запустив команду ffmpeg с параметром -codecs
.
ffmpeg -codecs
Основными параметрами видео-данных являются:
- разрешение изображения видео — например, 320х240, p720 и т.д;
- формат и кодек, с помощью которого создавался видео-поток;
- битрейт — количество данных в килобайтах или мегабайтах, которые нужно для проигрывания видео за одну секунду — например, 240 Kb/s, 1Mb/s;
- фремрейт — количество кадров в секунду (frame per second) — например 24 fps, 30 fps.
Для аудио-данных важными параметрами являются:
- формат и кодек, с помощью которого создавался звуковой поток;
- частота дискретизации — например, 44 KHz;
- битрейт — количество данных в килобайтах, которые нужно для проигрывания аудиофайла за одну секунду — например, 96 Kb/s, 128Mb/s;
- режим моно, стерео и т.д.
Но параметров на самом деле больше. Узнать параметры контейнера видео и входящих в него данных видео и аудио легко сделать с помощью команды fmpeg с параметром -i, которому передаётся путь и имя мультимедийного файла
ffmpeg -i video.mp4
VidCutter: графический интерфейс для FFmpeg
Но начать использование FFmpeg можно не только из командной строки. К FFmpeg существуют и графические оболочки – программы, в которых основные команды и операции можно производить с помощью графического интерфейса и манипулятора «мышь».
Примером такой очень простой графической оболочки является очень простенькая программа VidCutter. Она позволяет в графическом интерфейсе задействовать производить обрезку видео-файлов без перекодирования, то есть без потери качества.
Работа в этой программе состоит из одной операции — выделить начало и конец фрагмента и нажать кнопку обрезки видео. Но в большинстве случаев нужно больше, чем просто обрезать видео-файлы.
Установка комплекта утилит FFmpeg
Linux. Утилиты FFmpeg обычно входят во все репозитории дистрибутивов Linux и легко устанавливаются штатными менеджерами пакетов этих дистрибутивов. Также можно скачать с официального сайта готовые бинарные сборки ffmpeg и запускать их прямо из домашней папки. Или же собрать из исходников.
Для Windows и Mac OS можно скачать с официального сайта архив с готовые бинарными сборками FFmpeg, распаковать их в любой каталог. Нужные утилиты обычно находятся в папке bin. Запускать их нужно из командной строки, задавая путь к этим утилитам, непосредственно в командной строке или через добавление пути к утилитам через глобальные системные переменные.
Основных утилит в наборе FFmpeg две:
- ffmpeg — утилита для всех операций с файлами мультимедиа;
- ffplay — очень простой проигрыватель для файлов мультимедиа, вместо которого можно использовать любой другой проигрыватель.
Редактируем c FFmpeg
Допустим, у нас есть несколько дорогих нам файлов видео, сделанные когда-то каким-нибудь старым «Кэноном», или «Никоном», или камкордером. Нам хотелось обрезать лишнее в этих видео, убрать из них фоновый звук и наложить какую-нибудь музычку. Потом всё склеить в единый файл без перекодирования и потери качества.
Положим эти файлы в отдельную папочку и заходим в эту папку из командной строки для редактирования файлов видео с помощью команд ffmpeg.
Так же нужно держать правильный порядок и группировку параметров командной строки утилиты ffmpeg:
- Не забываем, что входной файл(ы) для манипуляций и редактирования задаётся сразу после команды
ffmpeg
после опции-i
:ffmpeg -i video.mp4
; - после параметров входного или входных файлов идут глобальные параметры — например, опция выбора потоков, опция нового разрешения видеоролика;
- потом идёт опция видео-кодека, за которым перечисляются его параметры в том числе и видео-фильтры;
- потом идёт опция аудио-кодека и перечисляются его параметры в том числе и фильтры;
- завершает команду имя файла на выходе.
Пример строки команды
ffmpeg -i video.mpg -s 320x240 -vcodec -b 200K -acodec -ab 96K out.avi
FFmpeg: перекодирование и деструктивное редактирование
Для многих операций редактирования файлов видео,— например для склейки видео, — эти файлы нужно привести к единому формату.
Основное предназначение FFmpeg — это перекодирование файлов мультимедиа из одного формата в другой. И перекодирование в FFmpeg может делаться очень легко.
Как самый минимум для перекодирования в другой формат нужно задать в выходном файле нужное расширение файла. И всё. По этому расширению утилита подберёт нужный кодек и перекодирует входной файл согласно параметрам по умолчанию для этого кодека, исходя из параметров входного файла. Например, следующая команда перекодирует входной файл формата MP4 video.mp4
в файл контейнера WEBM video.webm
fmpeg -i video.mp4 video.webm
Но параметры по умолчанию обычно являются базовыми и могут не обеспечить как желаемое качество или возможность дальнейшего редактирования. Поэтому параметры формата можно задавать явно. Перечислим основные опции для блока параметров видео и блока звука.
Опции ffmpeg для параметров видео:
-vcodec
или краткоc:v
— параметры видео-кодека, или "copy", или пустой параметр (значением по умолчанию)-f
— формат контейнера-b
— битрейт в килобитах или мегабитах в секунду задаётся буквой K или M-aspect
— соотношение сторон картинки (4:3, 16:9, 1.3333, 1.7777)-r
— фреймрейт
Опции ffmpeg для параметров звука:
-acodec
или краткоc:a
— параметры кодека звука, или "copy", или пустой параметр (значением по умолчанию)-f
— формат аудио-ab
— битрейт аудио-ar
— частота дискредитации-ac
— количество каналов
Например, перекодируем входной файл формата MP4 video.mp4
в файл контейнера WEBM video.webm
с некоторыми явно заданными параметрами
ffmpeg -i video.mp4 -s 640x480 -vcodec -b 600kb/s -acodec -ab 128kb/s video.avi
В результате этой команды запустится процесс перекодирования потоков видео и аудио с помощью выбранных кодеков согласно новым параметрам. В зависимости от параметров файлов мультимедиа и мощности компьютера этот процесс перекодирования может быть довольно длительный по времени.
FFmpeg: изменение разрешения видео
Перекодирование будет произведено, естественно, и если просто задать новое разрешение для видео с помощью глобальной опции -s
ffmpeg -i video.mp4 -s 320х240 video.webm
FFmpeg: перекодирование и не-деструктивное редактирование видео без потери качества
Теперь о преобразование видео из одного формата в другой без потери качества. Для некоторых операций возможно редактирование без перекодирования звука и видео, без потери качества, когда потоки внутри файла контейнера остаются нетронутыми и просто копируются как есть из одного файла в другой. Для этого для опций -vcodec
и -acodec
используется параметр copy
. Например «перельём» видео-поток и аудио-поток из файла формата MP4 video.mp4
в файл контейнера TS video.ts
:
ffmpeg -i video.mp4 -vcodec copy -acodec copy video.ts
В результате новый файл контейнер video.ts будет содержать нетронутое перекодированием видео и звук из файла контейнера video.ts.
FFmpeg: не-деструктивная нарезка и обрезка файлов видео
Обрезка видео файла производится при помощи опций -ss
и -t
. Опция -ss
задаёт начало обрезки, а опция -t
задаёт продолжительность дальнейшего фрагмента. Время задаётся в формате "часы:минуты:секунды". Для не-деструктивного редактирования содержимого видео-файла используйте параметр copy
.
ffmpeg -i video.mp4 -ss 00:00:02 -t 00:00:12 -vcodec copy -acodec copy video.mp4
Обрезка без перекодирования происходит очень быстро и не отнимает много компьютерной мощности.
FFmpeg: склейка и соединение файлов видео
Что бы склеить, соединить видео-файлы с помощью ffmpeg, они должны быть одного формата, в том числе одинаковыми и по параметрам потоков видео и звука этого формата. Если это не так, то нужно произвести предварительное перекодирование файлов видео к единому формату.
Для многих форматов соединение файлов в ffmpeg происходит при помощи оператора concat
, которому после двоеточия передаётся последовательность входных файлов, разделённых символом вертикальной черты. Пример склейки одинаковых и однотипных по формату файлов file1.avi и file2.avi без перекодирования:
ffmpeg -i "concat:file1.avi|file2.avi" -vcodec copy -acodec copy output.avi
Следует учитывать при соединении фрагментов видео в единый файл, что видео потоки и аудио потоки фрагментов складываются по отдельности, а потом объединяются в один контейнер. Поэтому если в одном из фрагментов звуковая дорожка короче по времени чем видео-поток, то звуковые дорожки остальных фрагментов сдвинутся к концу этой короткой звуковой дорожки и произойдёт рассинхронизация звука. Это надо учитывать.
FFmpeg: склейка и соединение файлов формата видео MP4
Видео-файлы в контейнере MP4 нельзя соединить с помощью оператора concat
. Но можно предварительно преобразовать эти файлы в контейнер, например, MPEG-TS без перекодирования видео и звука:
ffmpeg -i vid1.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts vid1.ts
ffmpeg -i vid2.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts vid2.ts
А потом эти файлы уже можно соединить при помощи оператора concat
в итоговый файл mp4:
ffmpeg -i "concat:vid1.ts|vid2.ts" -vcodec copy -acodec copy out.mp4
FFmpeg: удаление звуковой дорожки
Часто из видео-файла нужно удалить звуковой поток, чтобы потом заменить на какой-нибудь другой. Делается это с помощью опции -an
(audio not).
ffmpeg -i zvuk.mpg -vcodec copy -an bezzvuka.mpg
FFmpeg: добавление или замена звуковой дорожки
Добавить звуковой поток в файл видео нужно с помощью дополнительной опции -i
которой в качестве параметра передаётся путь звуковому файлу.
ffmpeg -i bezzvuka.mpg -i zvuk.mp3 -vcodec copy -acodec copy zvuk.mpg
FFmpeg: опция «-map» для обращения к потокам в видео-фвйлах
Выше мы увидели пример многократного использования для ffmpeg опции -i
, если обрабатываются, соединяются, мультиплексируются несколько входных файлов мультимедиа. Также выше было сказано, что файлы-контейнеры могут содержать в себе несколько мультимедийных потоков видео, звука и данных. FFmpeg имеет специальную опцию -map
, с помощью которой можно указать конкретный входной мультимедийный поток или внутренний поток в контейнере для обработки, копирования или вставки.
Потоки обозначаются двойным номером, разделённых двоеточием — «0:0», «0:1», «1:0», «2:1» и т.д. Первая цифра до двоеточия — это номер по порядку каждого входного файла, задаваемого опцией -i
, начиная с нуля. А номер после двоеточия обозначает номер потока внутри файла.
Рассмотрим опцию -map
на конкретных примерах
Сохранить отдельную звуковую дорожку из видео-файла (демультиплексация)
Номера потоков в каждом видео-файле можно определить через вывод команды ffmpeg -i
, который будет иметь приблизительно такой формат:
ffmpeg -i video.mkv
...
Stream #0:0(und): Video ...
Stream #0:1(ger): Audio ...
Stream #0:2(eng): Audio ...
Stream #0:3(rus): Subtitle …
То есть 0 перед двоеточием означает, что это первый по порядку входной файл для ffmpeg — в примере выше это файл video.mkv. А номера после двоеточия означают номера внутренних потока этого файла. Для обработки конкретного потока опции -map
нужно передать конкретный номер этого потока. Пример команды с опцией -map
, которая демультиплексирует, то есть сохраняет одну из звуковых дорожек контейнера в отдельный файл:
ffmpeg -i video.mkv -map 0:2 sound.wav
FFmpeg: добавить несколько звуковых дорожек в видеофайл (мультиплексация)
Теперь рассмотрим пример добавления нескольких звуковых дорожек в видео-файл с помощью FFmpeg. Для этого опять используем опцию -map
.
Допустим у нас есть чистый видео-файл video.avi и мы подобрали к нему несколько звуковых дорожек zvuk1.mp3 и zvuk2.mp3 — например разная музыка или комментарии на разных языках. Теперь используем опцию '-map' для мультиплексации, то есть соединения этих файлов в единый файл контейнер:
ffmpeg -i video.avi -i zvuk1.mp3 -i zvuk2.mp3 -map 0:0 -map 1:0 -map 2:0 out.avi
Как видите, для входных файлов после опций -i
в опциях -map
используются номера перед двоеточием. И мы получили выходной видео-файл с двумя звуковыми дорожками внутри, между которыми можно переключаться во многих плеерах — например, в плеере mpv переключение между звуковыми дорожками делается через "#" (Shift+2).
Естественно можно было добавить параметры кодирования для нового видео-файла. Например опции -c:v copy -c:a copy
позволили бы в примере выше сложить новый файл out.avi чистым копированием без перекодирования входных файлов video.avi, zvuk1.mp3 и zvuk2.mp3.
Таким образом с помощью FFmpeg можно добавить в видео-файл субтитры. Главное не запутаться в номерах входных потоков и потоков внутри контейнера.
Всегда под рукой
Выше в статье рассказано в стиле шпаргалки про основные команды FFmpeg для начинающих. За рамками статьи оказалось много синтаксических возможностей командной строки ffmpeg, так и — много функциональных возможностей этой программы. Например, не рассказано про фильтры FFmpeg. Более успешное использование FFmpeg требует в дальнейшем знакомства с полной документацией программы и с документацией нужных форматов мультимедиа.
Статья в дальнейшем может быть дополнена новыми примерами использования FFmpeg. Но у всех всегда под рукой есть руководство и справочник на английском языке.
Сохранить в текстовой файл руководство FFmpeg
man ffmpeg > ffmpeg_man.txt
Сохранить в текстовой файл справку FFmpeg
ffmpeg -h full > ffmpeg_help.txt