Информация для тех, кто хотел бы научиться на своём компьютере/ноутбуке редактировать записи вебинаров через специальную программу!
Программа FFMPEG предназначена для конвертирования видео и аудио файлов через специальные команды в командной строке Вашего компьютера/ноутбука, благодаря которым возможно самостоятельно:
1. Изменить формат и качество записи;
2. Изменить разрешение и битрейт для видео и аудио;
3. Нарезать фрагменты записи на отдельные записи;
4. Замедлить и ускорить воспроизведение видео и аудио;
5. Склеить видео и аудио в единый файл;
6. Удалить аудио из видео, а также извлечь аудио из видео.
(Более подробную информацию см. в шаге №5).
С ЧЕГО НАЧАТЬ?
Шаг №1. Скачиваем программу на Windows
Для начала Вам необходимо перейти на официальный сайт разработчиков и скачать файл программы. Ссылка на скачивание программы: https://yadi.sk/d/_ybZxA8VN2pBmQ
Шаг №2. Установка программы
Этот шаг требует особого внимания, так как работа с FFMPEG происходит через командную строку, поэтому разберём по пунктам алгоритм установки FFMPEG:
1. Вы скачали архивный файл и Вам необходимо его открыть;
2. Открываем скачанный архивный файл и находим папку «bin», внутри которой располагается файл-приложение «ffmpeg.exe»;
Примечание! Если у Вас нет архиватора для открытия файла, то можно скачать архиватор WinRar на официальном сайте разработчиков.
Ссылка на скачивание: https://winrar-pro-download.com
3. Извлекаем файл «ffmpeg.exe» в заранее созданную папку «ffmpeg» на корневом диске (как правило, это диск «C»);
4. Далее заходим в проводник (иконка «лупа») и находим «Мой компьютер». Нажимаем на него правой кнопкой мыши и выбираем «свойства», после чего появится следующее окно:
5. Нажимаем на «Дополнительные параметры системы» и заходим в «переменные среды»;
6. Находим в окошке «системные примененные» пункт «Path», нажимаем «изменить»;
7. В появившемся окне нажимаем на кнопку «создать» и указываем путь к файлу ffmpeg. Для этого переходим в папку с ffmpeg и кликаем на строчку, выделенную красным (см. на картинке), после чего нажмите сочетание клавиш Ctrl+C;
8. После того, как нажали клавишу «Создать» (1), вставляем скопированное в строку (2) и нажимаем на «Ок» (3).
Шаг №3. Запускаем программу
1) Если вы используете ОС Windows10, то вам достаточно нажать на значок «поиск»(лупа) и ввести английскими буквами «cmd»:
(Прим. Если же Вы используете более ранние версии Windows (7,8), то Вам нужно зайти в меню «пуск» и строка «поиск» будет в самом низу).
2) Далее, заходим в командную строку и проверяем – работает ли программа. Для этого вводим: ffmpeg, после чего нажимаем кнопку Enter. Если Вы всё сделали правильно, у Вас будет примерно следующий отклик в командной строке:
(Прим. Если же у Вас появляются строки красного цвета, то вероятно – Вы сделали что-то не так. Попробуйте повторить алгоритм по новой).
Шаг №4. Используемые файлы
Для начала работы с видео-файлом необходимо, чтобы файл находился в директории доступных дисков. Например: имеется видео-файл «Testovii File.mp4». Я расположил его прямо на диск D.
Таким же образом разместите остальные файлы, с которыми вы собираетесь работать в ffmpeg.
Либо, если не хотите перетаскивать файл, вам нужно будет скопировать путь к файлу(об этом позже).
(Прим. Рекомендуется использовать английские буквы в названии файлов, с которыми собираетесь работать)
Теперь с файлами можно работать.
Запускаем командную строку. Как правило, по умолчанию в командной строке указан путь к корневой папке, например:
Чтобы начать обрабатывать файл, необходимо указать тот диск, где расположен нужный файл. В нашем случае, это Диск D. Для смены диска, в строке прописываем команду: D:
После чего нажимаем Enter и видим, что теперь у нас отображается Диск D:
Теперь мы можем начать работать с файлами. Любая команда начинается со слова ffmpeg в строке:
Далее будет представлен ряд простых команд, где input.mp4 – название исходного видео-файла; input.mp3 – название исходного аудио-файла; output.format – название полученного файла; а ключ «–i» -это то, что необходимо прописывать перед обрабатываемым файлом (input.mp4/input.mp3).
Шаг №5. Основные команды
1) Для того, чтобы перевести видео в другой видеоформат:
ffmpeg –i Z\input.avi output.mp4
(Прим. – Z\ — путь к файлу input.avi, пример: выбираем нужный файл в папке (1), кликаем на него, затем кликаем на строку с его расположение (2), и копируем правой кнопкой мышки; также следует помнить, что при попытке форматирования из более легкого файла(Mp4) в более тяжелый(avi) – полученный файл будет в более плохом качестве)
2) Для того, чтобы перевести видео в аудио:
ffmpeg –i Z\input.mp4 output.mp3
(Прим. – Если появляется красная строка при нажатии ENTER, то попробуйте поместить input.mp4 в Кавычки – «input.mp4»)
3) Для того, чтобы вырезать фрагмент из видео:
Способ : 1 – обрезать концовку.
ffmpeg -i input.mp4 –t 00:00:00 output.mp4
(Прим. -t 00:00:00 – указывается время продолжительности видео от начала)
Способ : 2 – вырезать кусок из любой точки.
ffmpeg -ss 00:00:00 -i input.mp4 -t 00:00:00 output.mp4
(Прим. –ss 00:00:00 – указывается время начала желаемого куска; -t 00:00:00 – указывается время продолжительности желаемого куска;
Если появляется красная строка, то попробуйте поместить input.mp4 в Кавычки – «input.mp4»)
P.S Применимо как к видео, так и к аудио файлам!
4) Команда для склеивания пустого видео файла и аудио файла:
ffmpeg -i input.mp3 -i input.mp4 output.mp4
(Прим. Если вы используете разные по длительности файлы, то у них вседа будет совпадать начало, а длительность конечного файла будет равна самому длинному исходному файлу, пример:
Аудиофайл.mp3 – длительность 00:05:00 + Видеофайл.mp4 – длительность 00:03:00 = финальный файл.mp4 – длительность 00:05:00)
5) Команда для удаления аудио из видео:
ffmpeg -i input.avi -vcodec copy –an output.avi
6) Команда для ускорения/замедления видео:
ffmpeg –i input.avi -vf setpts=X*PTS output.avi
(Прим. X больше 1 – замедление; X меньше 1 — ускорение)
7) Команда для ускорения/замедления аудио:
Ffmpeg –I input.mp3 -filter:a «atempo=X» –vn output.mp3
(Прим. X значение больше нуля – ускорение; X значение меньше нуля (0.5;0.8) – замедление)
Команда для ускорения/замедления файла с аудио и видео:
ffmpeg -i input.mp4 -filter_complex «[0:v]setpts=X*PTS[v];[0:a]atempo=Y[a]» -map «[v]» -map «[a]» output.mp4
(Прим. X больше 1 – замедление; X меньше 1 – ускорение;
Y значение больше нуля – ускорение; Y значение меньше нуля (0.5;0.8) – замедление)
9) Для того, чтобы изменить параметр «качество»:
Для AVI:
ffmpeg -i input.avi -q X output.avi
(Прим. X от 23 до 50, где 50 – минимальное качество; данная опция помогает уменьшить размер файла)
Для Mp4:
ffmpeg -i input.mp4 -crf X output.mp4
(см. Прим. Выше)
10) Для того, чтобы изменить Битрейт:
Для аудио: ffmpeg -i input.mp4 -b:a 128k output.mp4
(Прим. Где 128k– цифра, обозначающая размер битрейта)
Для видео: ffmpeg -i input.mp4″ -b:v 1000k output.mp4
11) Для того, чтобы изменить разрешение видео:
ffmpeg -i input.mp4 -s X output.mp4
(Прим. X – разрешение, например: «-s 800×600»)
Для общего сжатия видео:
13) ffmpeg -i input.mp4 -codec:a copy -vcodec libx264 -preset fast -crf 32 output.mp4
В заключении:
В этой статье были рассмотрены:
— Способ установки ffmpeg для Windows
— Была представлена выжимка из самых распространённых команд, которая позволит использовать программу «ffmpeg» для решения, пусть не самых сложных, но всё-же возникающих задач.
Команды в программе ffmpeg не ограничиваются тем списком, что был представлен в данной статье. Как было сказано выше, в интернете существует более 200 страниц со всевозможными командами, призванными проводить манипуляции с видео\аудио-файлами, которыми, как правило, пользуются продвинутые пользователи.
Мы же предоставили краткий мануал по основным возможностям, и надеемся, что этот материал окажется полезным для наших пользователей!
Загрузить PDF
Загрузить PDF
Из этой статьи вы узнаете, как использовать программу FFmpeg, чтобы конвертировать видео и аудио файлы в командной строке (Windows) или в терминале (Mac).
-
-
С помощью FFmpeg видеоролики и песни можно преобразовать в разные форматы (то есть песню можно преобразовать в аудиофайл другого формата, а видеоролик — в видеофайл другого формата).
- Также видеофайлы можно конвертировать в аудиофайлы.
-
Выберите файл, а затем нажмите Ctrl+C.
- Сделайте это, чтобы получить резервную копию исходного файла на случай, если что-то пойдет не так.
-
Перейдите на рабочий стол компьютера, а затем нажмите Ctrl+V.
- В этом случае файл будет находиться в легкодоступном месте.
-
Для этого щелкните правой кнопкой мыши по файлу, в меню выберите «Свойства» и найдите формат в строке «Тип файла».
- Необходимо знать текущий формат файла, чтобы сообщить FFmpeg, какой файл конвертировать.
-
Видео можно преобразовать в видеофайл, песню в аудиофайл и видео в аудиофайл. Доступные форматы в FFmpeg:[1]
- Видео — MP4, MOV, WEBM, FLV, AIFF и AVI.
- Аудио — MP3, WAV, WMA, M4A, AAC и OGG.
-
Нажмите на файл, чтобы отобразить его полное имя. В FFmpeg нужно ввести полное имя файла.
- Рекомендуем переименовать файл и присвоить ему короткое и простое имя, чтобы облегчить процесс конвертации. Для этого щелкните правой кнопкой мыши по файлу, нажмите «Переименовать» и введите новое имя.
-
Она есть во всех версиях Windows. Для этого:
-
Введите cd Desktop и нажмите ↵ Enter. В командной строке отобразятся все файлы, которые хранятся в папке «Рабочий стол».
-
Введите ffmpeg -i, затем введите имя и расширение исходного файла, а затем введите имя и расширение конечного файла.
- Например, чтобы преобразовать MP4-файл «Kitties» в WAV-файл «Cats», введите ffmpeg -i Kitties.mp4 Cats.wav.
- Когда будете вводить имя файла, не забудьте про регистр букв (например, если в имени есть прописные буквы, вводите прописные буквы).
- Если в имени файла есть пробелы, заключите имя и расширение файла в кавычки. Например, вместо YouTube Drama.mp4 введите "YouTube Drama.mp4" (не меняйте пробелы на знаки подчеркивания, если, конечно, их нет в имени файла).
-
Если вы правильно ввели имя исходного файла и выбрали доступный формат конечного файла, начнется преобразование файла.
- На конвертирование файлов (особенно видеороликов) может уйти много времени. Если вы конвертируете большой видео или аудио файл, не закрывайте командную строку, пока в ней не отобразится «C:\Users\Name\Desktop>».
-
Когда процесс завершится, преобразованный файл появится на рабочем столе под именем, которые вы ввели.
Реклама
-
На компьютерах Mac программу FFmpeg проще установить как часть менеджера пакетов Homebrew, который можно быстро установить через терминал:[2]
- Перейдите на страницу https://brew.sh/index_ru в веб-браузере.
- Скопируйте код в разделе «Установка Homebrew». Для этого выделите код и нажмите ⌘ Command+C.
- Откройте Spotlight
, введите терминал и дважды щелкните по «Терминал».
- Вставьте скопированный код. Для этого нажмите ⌘ Command+V.
- Нажмите ⏎ Return и дождитесь, когда установка завершится.
- Введите brew install ffmpeg и нажмите ⏎ Return.
-
С помощью FFmpeg видеоролики и песни можно преобразовать в разные форматы (то есть песню можно преобразовать в аудиофайл другого формата, а видеоролик в видеофайл другого формата).
-
Выберите файл, а затем нажмите ⌘ Command+C.
- Сделайте это, чтобы получить резервную копию исходного файла на случай, если что-то пойдет не так.
-
Перейдите на рабочий стол компьютера, а затем нажмите ⌘ Command+V.
- В этом случае файл будет находиться в легко доступном месте.
-
Для этого щелкните по файлу, чтобы выбрать его, а затем нажмите «Файл» > «Свойства» и найдите расширение в конце имени файла (например, «.mp4»).
-
Видео можно преобразовать в видеофайл, песню в аудиофайл и видео в аудиофайл. Доступные форматы в FFmpeg:
- Видео — MP4, MOV, WEBM, FLV, AIFF и AVI.
- Аудио — MP3, WAV, WMA, M4A, AAC и OGG.
-
Нажмите на файл, чтобы отобразить его полное имя. В FFmpeg нужно ввести полное имя файла.
-
Если вы закрыли терминал, когда установили FFmpeg, откройте его. Для этого нажмите «Spotlight»
, введите терминал и дважды щелкните по «Терминал»
.
-
Введите cd Desktop и нажмите ⏎ Return. В командной строке отобразятся все файлы, которые хранятся в папке «Рабочий стол».
-
Введите ffmpeg -i, затем введите имя и расширение исходного файла, а затем введите имя и расширение конечного файла.
- Например, чтобы преобразовать MP4-файл «Kitties» в WAV-файл «Cats», введите ffmpeg -i Kitties.mp4 Cats.wav.
- Когда будете вводить имя файла, не забудьте про регистр букв (например, если в имени есть прописные буквы, вводите прописные буквы).
- Если в имени файла есть пробелы, заключите имя и расширение файла в кавычки. Например, вместо YouTube Drama.mp4 введите "YouTube Drama.mp4" (не меняйте пробелы на знаки подчеркивания, если, конечно, их нет в имени файла).
-
Если вы правильно ввели имя исходного файла и выбрали доступный формат конечного файла, начнется преобразование файла.
- На конвертирование файлов (особенно видеороликов) может уйти много времени. Если вы конвертируете большой видео или аудио файл, не закрывайте терминал, пока в нем не отобразится новая пустая строка.
-
Когда процесс завершится, преобразованный файл появится на рабочем столе под именем, которые вы ввели.
Реклама
Об этой статье
Эту страницу просматривали 28 585 раз.
Была ли эта статья полезной?
Исторически сложилось так, что автору в течение достаточно длительного периода приходилось разрабатывать мультимедийную поддержку для Windows-приложений. Вначале использовался DirectShow, но в какой-то момент произошло знакомство с проектом FFmpeg, который привлек своей мощью, универсальностью и гибкостью. В процессе работы с FFmpeg было написано немало кода: обертка на C++ для FFmpeg API, а также ряд утилит и GUI решений для .NET. Когда эти результаты достигли определенной степени зрелости, возникло желание поделиться ими с программистским сообществом и заодно изложить свое понимание архитектуры FFmpeg и компьютерного мультимедиа вообще.
Введение
В начале статьи дается краткая общая характеристика FFmpeg, затем достаточно подробно описываются внутреннее устройство FFmpeg — терминология, компоненты, библиотеки. Далее кратко описываются процесс сборки FFmpeg и программирование с использованием FFmpeg API. После этого описываются предлагаемые решения автора и приводятся ссылки для скачивания.
Это третья статья автора, посвященная FFmpeg. Первая, описывающая архитектуру кодеков, находится здесь, вторая, посвященная увеличению скорости декодирования видео, находится здесь. В связи с постоянным развитием архитектуры и кодовой базы FFmpeg некоторые сведения, изложенные в статье про кодеки, требуют небольшой коррекции.
1. Общая характеристика FFmpeg
FFmpeg — это грандиозный Open Source проект, своего рода энциклопедия компьютерного мультимедиа. Название происходит от названия экспертной группы MPEG (Moving Picture Experts Group) и FF, означающего «fast forward». Инициаторами и руководителями являются Фабрис Беллар (Fabrice Bellard) и Михаэль Нидермайер (Michael Niedermayer).
В этом проекте разработчики попытались собрать практически все известные решения в области компьютерного мультимедиа, в том числе достаточно редкие. При использовании полной версии FFmpeg вероятность того, что вы столкнетесь с неизвестным контейнером, кодеком, протоколом весьма небольшая.
FFmpeg включает в себя 8 библиотек и 3 приложения, которые собираются под многие платформы и практически не требуют установки каких-то внешних компонент или фреймворков. Но за эти удобства надо платить, суммарный размер библиотек в полной сборке FFmpeg 7.1, более 150 МБ (например, в FFmpeg 4.0 это было «всего» 64 МБ). Впрочем, в эпоху 64-битных ОС и терабайтных дисков это, наверное, не является такой уж критической характеристикой. К тому же при необходимости можно сделать сборку «под себя», оставив только нужные компоненты.
FFmpeg эффективно использует архитектуру современных процессоров, многоядерность, многопоточность, векторные инструкции, также имеется поддержка графических процессоров.
Код библиотек и приложений FFmpeg написан на C, точнее на C11 c небольшими исключениями. Код общедоступных заголовочных файлов FFmpeg API совместим с C99. Детали см. на соответствующей странице сайта FFmpeg. Проект имеет монолитную архитектуру, если требуются изменения, например, добавление компонент, то их надо вносить в код проекта, после чего собирать его заново. Такая архитектура принципиально отличается от архитектуры, основанной на независимых компонентах и плагинах. (В качестве примера подобной архитектуры можно привести DirectShow или GStreamer.)
В состав FFmpeg входят три консольных приложения — ffmpeg
, ffplay
и ffprobe
, для их настройки используются командная строка. Для создания собственных решений на основе FFmpeg предлагается API. Для разработки программ на C/C++ имеются заголовочные C-файлы и необходимые файлы для компоновки с библиотеками. В соответствии с принципами Open Source код библиотек и приложений является открытым, что иногда очень помогает разобраться со сложными случаями.
2. Терминология, основные компоненты и библиотеки FFmpeg
В этом разделе мы рассмотрим термины, используемые в FFmpeg, опишем компоненты и основные сценарии их взаимодействия, а также библиотеки, в которых эти компоненты находятся. Отметим, что все описанные ниже библиотеки используют вспомогательную библиотеку libavutil
.
Материалы раздела также можно рассматривать как достаточно общее описание внутреннего устройства компьютерного мультимедиа, безотносительно к используемым программным инструментам.
2.1. Опции
Для дополнительной настройки многих компонент используются опции (options). Опции — это набор пар ключ-значение. Ключ является строкой. В интерфейсе функций, использующих опции, значение также задается строкой, но во внутреннем представлении значение может быть разных типов. Для хранения набора пар строк используется контейнер AVDictionary
. Для внутреннего представления опции используется структура AVOption
. Опции являются весьма гибким и универсальным механизмом настройки компонент.
Источник медиаданных часто называют медиаконтейнером (media container) или просто контейнером (container). Этот термин хорошо подходит для медиаданных, находящихся в файле, но, возможно, покажется не вполне адекватным для других источников медиаданных, с которыми умеет работать FFmpeg, например, медиаданные, которые не описываются одним файлом, поступают через сеть или другие коммуникационные каналы, поступают с устройства захвата медиаданных, генерируются какими-то генераторами. Но там не менее мы будем использовать этот термин, так как, во-первых, использовать единый термин просто удобно, а во-вторых, FFmpeg предоставляет ряд абстракций, позволяющих единообразно трактовать самые разные источники медиаданных.
2.3. Демультиплексирование
Для получения данных из медиаконтейнера служат компоненты FFmpeg, называемые демультиплексорами (demuxer). Демультиплексоры находятся в библиотеке libavformat
.
2.3.1. Формат
Ключевой характеристикой демультиплексора является формат (format), который идентифицируется строкой. Каждый демультиплексор имеет формат и в FFmpeg нет двух демультиплексоров с одинаковым форматом. Соответственно, мы можем говорить о формате контейнера, это будет означать, что контейнер доступен с помощью демультиплексора с таким форматом.
Для открытия демультиплексора надо задать три параметра:
- URL (Uniform Resource Locator);
- Формат;
- Опции.
Рассмотрим каждый из этих параметров более подробно.
URL является обязательным параметром и представляет собой строку, например, это может быть путь к файлу или адрес сетевого источника. Эта строка не всегда является адресом ресурса в сети Интернет, в общем случае ее структура зависит от конкретного формата. URL может начинаться с префикса proto_name://
или proto_name:
, который определяет протокол получения данных. FFmpeg поддерживает несколько десятков протоколов. Среди них основной это, конечно, файловый протокол (его можно не указывать, а если указывать, то в виде file:
). Также есть хорошо известные сетевые протоколы общего назначения — TCP, UDP, HTTP, а также некоторые более специальные протоколы. Структура остальной части URL зависит от протокола, она определяет локацию источника данных и, возможно, какие-то дополнительные параметры. В первом приближении можно считать, что протокол определяет то, как демультиплексор получает поток байтов, а формат определяет структуру этого потока. Действительно, простые протоколы получения потока байтов типа файлового или TCP можно комбинировать с разными форматами, но другие протоколы тесно связаны с форматом, например hls
, rtsp
. В случае получения данных с устройства видео- и аудиозахвата протокол не указывается.
Формат — это ключевая характеристика демультиплексора, без него открытие невозможно, но достаточно часто FFmpeg определяет формат из URL и заголовка контейнера, в этом случае его явно указывать не нужно. Например, в случае файлового контейнера формат обычно связан с расширением файла. Вот примеры таких расширений: avi
, mp4
, mkv
, mov
, flv
, ogg
, wav
, mp3
.
Опции используются для уточнения деталей протокола и формата и используются довольно редко. Для некоторых форматов (обычно относящихся к так называемым сырым форматам), использование опций является обязательным, так как контейнер не содержит всех параметров, необходимых для демультиплексирования, примеры есть в разделе 2.9.
2.3.2. Потоки и пакеты
После успешного открытия демультиплексора становятся доступными медиаданные, которые разбиваются на потоки (streams, структура AVStream
). Число потоков один или несколько, в зависимости от формата демультиплексора и медиаданных контейнера. Для ссылки на поток используется индекс.
Медиатип
Важнейшей характеристикой потока является медиатип данных, представляемых потоком (media type, перечисление AVMediaType
). Основные медиатипы, поддерживаемые FFmpeg — это видео (video) и аудио (audio). Еще один медиатип — это субтитры (subtitle). Есть также два вспомогательных медиатипа — данные (data) и вложение (attachment). Демультиплексор может и не определить медиатип потока, тогда он считается неизвестным (unknown).
В контейнере может быть несколько потоков с одинаковым медиатипом, например, аудиопоток с многоканальным объемным звуком и аудиопоток с простым стереозвуком. Может быть несколько потоков с субтитрами, каждый из которых использует какой-то один язык. В случае нескольких потоков с одинаковым медиатипом, один из них обычно помечается флагом «по умолчанию» (default), этот поток выбирают, когда отсутствуют другие критерии выбора потока. Потоки с одинаковым медиатипом можно иногда различать с помощью целочисленного идентификатора потока.
Идентификатор кодека
Поток представляет медиаданные в некотором сжатом формате или закодированными и, соответственно, следующей после медиатипа важнейшей характеристикой потока является формат сжатия (compression format) или формат кодирования (encoding format) представляемых данных. (Термины «сжатие» и «кодирование» в этом контексте являются синонимами.) В FFmpeg этот формат называется идентификатором кодека (codec id, перечисление AVCodecID
). Отметим, что термин «кодек» (codec — enCOder/DECoder) обычно используется для обозначения программных или аппаратных компонент, осуществляющих кодирование или декодирование, то есть для кодеров и декодеров, но в данном случае идентификатор кодека идентифицирует формат сжатия (кодирования).
Для более подробного описания идентификатора кодека служит структура AVCodecDescriptor
. Ключевым членом этой структуры является идентификатора кодека (член id
), а остальные члены как раз и дают дополнительную информацию. Прежде всего, это медиатип (член type
), а также уникальное имя (член name
). Таким образом, можно говорить об имени идентификатора кодека. Вот примеры некоторых имен: h264
, hevc
, vp9
, aac
, mp3
, pcm_mulaw
. Это имя в основном используется для внутренней работы FFmpeg, в самом контейнере используется другой идентификатор. Поток обычно представляет идентификатор кодека в каком-то виде, зависящем от формата контейнера. Это может быть строка (например, CodecTag в Matroska) или число (например, четырехбайтовый FourCC или двухбайтовый FormatTag в WAV-файлах). В FFmpeg идентификатор кодека — это элемент перечисления, то есть целочисленная константа, и демультиплексор должен определить эту константу исходя из данных, извлекаемых из потока. Если это не удается, то идентификатор кодека потока оказывается неизвестным (unknown).
Другие характеристики медиаданных потока
Кроме медиатипа и идентификатора кодека, демультиплексор может определять и другие характеристики медиаданных, представляемых потоком, но они в основном уже зависит от медиатипа потока. Например, для видео это размеры кадра, для аудио число и раскладка каналов, частота дискретизации.
Пакеты
Медиаданные, представляемые потоком, организованы в объекты, которые называются пакетами (packets, структура AVPacket
). Демультиплексор умеет последовательно извлекать пакеты из контейнера, после того, как пакет извлечен, можно определить к какому потоку относится этот пакет (член stream_index
структуры AVPacket
). Нельзя извлекать пакеты из конкретного потока. Поток является скорее логической категорией, он объединяет в одну группу пакеты, имеющие общие характеристики. В самом контейнере пакеты разных потоков физически располагаются «вперемешку». Подробнее о некоторых принципах размещения пакетов в контейнере см. раздел 2.11.2.
2.3.3. Метаданные и главы
Контейнер может содержать метаданные (metadata) — набор строковых пар ключ-значение. Метаданные могут содержать достаточно произвольные данные, но имеются некоторые традиционные, например метаданные с ключами title
, album
, artist
, copyright
, comment
. Поток также может иметь метаданные, есть несколько стандартных, например метаданные с ключами language
, encoder
. Демультиплексор загружает метаданные в контейнер AVDictionary
. Но следует иметь в виду, что метаданные поддерживают не все форматы.
Некоторые файловые контейнеры поддерживают еще и главы (chapters). Глава — это интервал воспроизведения медиаданных, который задается временем начала и конца, а также может содержать метаданные (обычно с ключом title
). Эти данные загружаются в структуру AVChapter
. В качестве примеров форматов, поддерживающих главы, можно привести Matroska (файлы *.mkv
) и QuickTime/MOV (файлы *.mov
).
2.4. Декодирование
2.4.1. Декодер
Если идентификатор кодека потока известен и требуется дальнейшая обработка пакетов, то надо открыть декодер (decoder). Декодер является программный компонентой, ключевой характеристикой которой является идентификатор кодека. Декодер умеет разжимать (декодировать) сжатые (закодированные) данные с соответствующим идентификатором кодека, то есть трансформировать их в данные одного из известных несжатых форматов. Декодеры находятся в библиотеке libavcodec
. Если для потока определился идентификатора кодека, то для него можно открыть декодер по умолчанию (Изредка идентификатор кодека не имеет декодеров и тогда пакет должен обрабатываться внешним приложением.) Все декодеры имеют уникальное имя. Часто имя декодера по умолчанию совпадает с именем идентификатора кодека (например h264
, hevc
, vp9
, aac
), но такое совпадение не обязательно и даже может внести определенную путаницу. (Например, для идентификатора кодека mp3
декодер по умолчанию mp3float
.) Для многих идентификаторов кодека имеются более одного декодера и для того, чтобы открыть альтернативный декодер, надо знать его имя.
Декодер может поддерживать опции, которые задаются при открытии декодера, но это делается редко, за исключением одного случая — если декодер поддерживает многопоточное декодирование, то с помощью опции threads
можно задать число используемых потоков.
Более подробно архитектура кодеков обсуждается в предыдущей статье.
2.4.2. Видео- и аудиокадры
Рассмотрим, как декодер работает для видео- и аудиопотоков. Если декодер успешно открыт, то на вход ему передаются пакеты, извлеченные из потока, а на выходе из декодера извлекаются разжатые (декодированные) данные, называемые кадрами (frames, структура AVFrame
). Термин «кадр» применяется не только к видео, но и к аудио. Отметим также, что на один входной пакет не всегда получается один выходной кадр, может быть ноль кадров или больше одного (хотя, конечно, чаще всего «один к одному»). Кадр характеризуется медиатипом и другими параметрами, зависящими от медиатипа.
Ключевой характеристикой видеокадра является формат пикселей (pixel format, перечисление AVPixelFormat
). В FFmpeg более двухсот форматов пикселей. Каждый формат пикселей имеет строковое представление, вот некоторые примеры: yuv420p
, nv12
, bgra
, rgb24
, gray8
, pal8
. Видеокадр также характеризуется размером в пикселях — шириной (width) и высотой (height).
Ключевой характеристикой аудиокадра является формат отсчетов (sample format, перечисление AVSampleFormat
). Форматов отсчетов всего двенадцать. Каждый формат отсчетов имеет строковое представление, например fltp
, s16p
, flt
, s16
. Аудиокадр также характеризуется количеством и раскладкой каналов (channel layout), частотой дискретизации (sample rate) и количеством отсчетов в каждом канале, которое называется размером кадра (frame size).
Формат кадров (то есть формат пикселей или отсчетов), извлекаемых из декодера, является важной характеристикой декодера. Для видеодекодеров чаще всего используются два — yuv420p
и nv12
. Это планарные (planar) форматы цветовой модели YCbCr с цветовой субдискретизацией (chroma subsampling 4:2:0), среднее число бит на пиксель равно 12. Планарность означает, что яркостная компонента Y хранится в отдельном массиве. Для аудиодекодеров чаще всего используется fltp
. Это планарный 32-битный формат в стандарте IEEE Float, планарность означает, что отсчеты каждого канала расположены непрерывно. Несколько реже используется s16p
— планарный 16-битный формат PCM16, другие форматы используются очень редко.
Декодер может поддерживать несколько выходных форматов, при открытии декодера по умолчанию выбор формата происходит автоматически. При открытии декодера по имени нужно запросить его выходные форматы и указать один из них в качестве используемого выходного формата.
2.4.3. Несжатые данные
Поток может представлять и несжатые данные, но они все равно обрабатываются по этой же схеме. Для потока должен определиться идентификатор кодека и существовать соответствующий декодер. Декодер может быть очень простым, иногда он просто копирует данные. Например, для WAV-файла, в котором хранятся данные в формате PCM16, идентификатор кодека единственного потока определится как pcm_s16le
или pcm_s16be
, декодер по умолчанию для этих идентификаторов кодека имеет такое же имя. Декодер pcm_s16le
на little-endian платформах просто копирует данные из буфера пакета в буфер кадра, формат отсчетов кадра будет s16
. То же самое будет делать декодер pcm_s16be
на big-endian
платформах. Для других вариантов несжатого аудио может выполняться несложная работа, например, расширение 24-битных отсчетов до 32-битных или перестановка байтов для превращения big-endian отсчетов в little-endian или наоборот.
2.4.4. Субтитры
Обработка субтитров также следует описанной выше схеме. Для потоков субтитров имеются идентификаторы кодека (например subrip
) и соответствующие декодеры. Пакеты субтитров декодируются не так, как видео или аудио, для декодирования используется специальная функция. На выходе этой функции извлекаются объекты, описываемые структурой AVSubtitle
. Эта структура содержит члены, задающие положение субтитров в кадре, время начала и окончания их показа. Текст субтитров может быть в разных формах: простой текст, текст в специальном формате ASS (Substation Alpha), битовое изображение. Текстовые варианты используют кодировку UTF-8.
Если нужны субтитры на разных языках, то для каждого языка организуется отдельный поток субтитров. Такой поток должен иметь метаданные с ключом language
, значением является трехбуквенный код языка в соответствии с ISO 639-2 (eng, ger, rus, etc.).
Потоки субтитров могут находиться как в одном контейнере с аудио- и видеопотоками, так и в отдельном контейнере. Существует несколько форматов, предназначенных специально для субтитров, например srt
(SubRip subtitle). В файлах этого формата (расширение srt
) хранятся данные с идентификатором кодека subrip
.
2.4.5. Повышение скорости декодирования видео
С приходом тяжеловесного видео, такого как 4K (Ultra HD), проблема эффективности декодирования видеопотока стала достаточно актуальной. На среднем компьютере, возможно, понадобятся специальные меры для того, чтобы можно было декодировать такой видеопоток в реальном масштабе времени.
В FFmpeg есть три способа увеличения скорости декодирования.
- Подключать для декодирования дополнительные потоки выполнения (threads), для этого используется опция декодера
threads
. - Использовать аппаратное ускорение (hardware acceleration). В этом случае декодер открывается в специальном режиме, при котором подключается аппаратное ускорение, основанное на использовании графических процессоров. Конкретный вариант аппаратного ускорения идентифицируется строкой, например
dxva2
. Доступные варианты аппаратного ускорения зависят от операционной системы и установленного оборудования. - Использовать специальные декодеры, которые реализуют декодирование с использованием графических процессоров. В FFmpeg имеются два семейства таких декодеров: декодеры, использующие графические процессоры Intel с технологией QSV и декодеры, использующие графические процессоры NVIDIA с технологией CUVID. Имена таких декодеров имеют суффиксы
_qsv
или_cuvid
соответственно. Такие декодеры есть для самых популярных идентификаторов кодека, в качестве примера можно привестиh264_qsv
,hevc_qsv
,vp9_qsv
,h264_cuvid
,hevc_cuvid
,vp9_cuvid
.
Отметим, что дополнительные потоки и аппаратное ускорение позволяют использовать не все декодеры, но наиболее популярные, например h264
, hevc
, vp9
, эти возможности поддерживают, а вот theora
нет. Более подробно ускорение декодирования обсуждается в предыдущей статье.
Описанная выше схема работы с медиаданными является весьма гибкой, в частности можно обрабатывать файлы, хранящие единичное изображение (*.png
, *.jpeg
, *.bmp
, *.tiff
, etc.) или простую анимацию (*.gif
).
Например, мы можем открыть демультиплексор, передав ему в качестве URL путь к PNG-файлу. Демультиплексор успешно откроется, формат определится как png_pipe
(piped png sequence). Будет доступен один видеопоток, идентификатор кодека этого потока будет png
, соответствующий декодер по умолчанию будет иметь такое же имя. В потоке будет один пакет, после его декодирования получим видеокадр с форматом пикселей rgba
.
В ряде случаев FFmpeg умеет обрабатывать данные, которые на первый взгляд не имеют никакого отношения к мультимедиа. Например, мы можем открыть демультиплексор, передав ему в качестве URL путь к обычному текстовому файлу (расширение txt
). Демультиплексор успешно откроется и в медиапроигрывателе мы сможем увидеть содержимое файла, показанного как видеоролик. В этом случае формат определится как tty
(Tele-typewriter), будет доступен один видеопоток, идентификатор кодека этого потока будет ansi
, соответствующий декодер по умолчанию будет иметь такое же имя, формат пикселей декодированных кадров будет pal8
. По умолчанию размер кадра 640х400, частота 25 к/с, но эти параметры можно изменить с помощью опций.
2.6. Конвертация формата и обработка кадра фильтром
Формат видео- и аудиокадров, извлекаемых из декодера, зачастую довольно специфичен, он удобен для алгоритмов кодирования/декодирования, но может быть неприемлемым для дальнейшего использования. По этой причине после декодирования довольно часто приходится конвертировать кадры в другой формат. Это можно сделать двумя способами.
- Использовать специальные компоненты: rescaler (video scaler) для видеокадров и resampler (audio resampler) для аудиокадров. Эти компоненты находятся в библиотеках
libswscale
иlibswresample
соответственно. Rescaler позволяет изменить формат пикселей и размеры видеокадров. Resampler позволяет изменить формат отсчетов, количество и раскладку каналов, а также частоту дискретизации аудиокадров. - Построить граф фильтров (filter graph). В простейшем варианте граф фильтров делает то же, что и rescaler или resampler, но его возможности гораздо шире — он может подключить фильтры (filters), которые являются специальными компонентами для дополнительной обработки кадров. Фильтры можно соединять в цепочки, а также в более сложные структуры, граф фильтров и сами фильтры могут иметь несколько входов и выходов. Есть даже несколько экзотических фильтров, для которых медиатипы входа и выхода не совпадают. Фильтры могут поддерживать команды, которые позволяют изменять параметры фильтра «на ходу». Граф фильтров и фильтры находятся в библиотеке
libavfilter
. Фильтры из этой библиотеки позволяют выполнять самые разнообразные трансформации кадров. Например, есть фильтрsubtitles
, который накладывает на видеокадры субтитры. Этот фильтр может использовать как один из потоков субтитров проигрываемого контейнера, так и поток субтитров какого-то внешнего контейнера.
Дальнейшая судьба кадра зависит от назначения приложения. Медиапроигрыватели выполняют рендеринг кадра, то есть выводят его на устройство визуализации или устройство воспроизведения звука. В транскодерах кадр кодируется и записывается в целевой медиаконтейнер. В других приложениях может осуществляться какая-то специальная обработка кадра, в качестве примера можно привести системы технического зрения или системы поиска и распознавания лиц.
Изложенный выше материал можно изобразить в виде схемы.
2.7. Bitstream-фильтры
В FFmpeg есть еще компоненты, называемые bitstream-фильтрами. Эти компоненты выполняют преобразования пакетов без их декодирования. Bitstream-фильтры находятся в библиотеке libavcodec
.
С помощью FFmpeg можно создавать медиаконтейнеры и заполнять их данными. Для создания медиаконтейнера используется компонента, называемая мультиплексором (muxer). Мультиплексоры находятся в библиотеке libavformat
. Ключевой характеристикой мультиплексора является все тот же формат. Таким образом, каждый формат, поддерживаемый FFmpeg, имеет демультиплексор или мультиплексор или оба сразу. Для открытия мультиплексора надо задать те же параметры, что и для демультиплексора — URL, формат и опции. Все, что было написано для этих параметров в случае демультиплексора, справедливо и для параметров мультиплексора. После открытия мультиплексора необходимо добавить требуемые потоки. Для каждого потока надо задать медиатип, идентификатор кодека и некоторые другие параметры, зависящие от медиатипа. После открытия потоков в них можно записывать сжатые (закодированные) данные. Отметим, что это сжатие может быть фиктивным, выше мы обсуждали, что некоторые идентификаторы кодека представляют фактически несжатые данные.
Если исходные данные являются несжатыми, то надо открыть кодер (encoder) для соответствующего идентификатор кодека. Кодер еще довольно часто называют энкодером (просто калька с английского). Кодеры находятся в библиотеке libavcodec
. На вход кодера поступают кадры, содержащие несжатые данные. Допустимые форматы кадров каждый кодер определяет самостоятельно. На выходе из кодера извлекаются пакеты со сжатыми данными, которые и передаются мультиплексору для записи в контейнер. Для открытия кодера надо знать его имя. Кроме того, практически всегда надо задать набор опций, которые определяют характеристики сжатых данных и особенности работы кодера.
В ряде случаев имеется возможность управлять скоростью кодирования, для некоторых кодеров можно задавать количество потоков кодирования и определять режим аппаратного ускорения. Также имеются кодеры, которые поддерживают технологии кодирования на графических процессорах — Intel QSV или NVIDIA NVENC. Имена таких кодеров имеют суффиксы _qsv
или _nvenc
соответственно.
В некоторых случаях кодер не используется, пакеты со сжатыми данными извлекаются из одного медиаконтейнера и записываются в другой медиаконтейнер. Данные пакетов могут быть обработаны bitstream-фильтром или не меняться.
2.9. Идентификатор кодека и формат контейнера
Формат как абстрактная концепция не связан жестко с каким-либо медиатипом или идентификатором кодека, но для конкретного формата такая связь может быть.
Для многих идентификаторов кодека существует формат контейнера, который предназначен исключительно для данных с этим идентификатором кодека. В этом случае обычно может быть только один поток, метаданные не поддерживаются. Это так называемые сырые форматы (raw formats), они в основном используются при получении данных с устройств захвата медиаданных. Часто такой формат имеет имя, совпадающее с именем идентификатора кодека, но это не обязательно. Вот примеры, где такое совпадение есть: h264
, hevc
, rawvideo
, aac
, flac
. А вот для многочисленных идентификаторов кодека несжатого (или слабо сжатого) аудио, начинающихся с префикса pcm_
, соответствующие форматы имеют другое имя, оно получается удалением этого префикса.
Для того, чтобы демультиплексор мог разбить поток данных на пакеты, формат rawvideo
и форматы несжатого аудио требуют задания дополнительных опций: для видео это формат пикселей (pixel_format
), размер кадра (video_size
) и частота кадров (framerate
), для аудио это частота дискретизации(sample_rate
) и число каналов (channels
). Дополнительных опций могут потребовать и другие сырые форматы.
Существуют форматы, предназначенные для данных какого-то определенного медиатипа, но позволяющие использовать разные идентификаторы кодека. Самым известным, наверное, является WAV-формат. Он может быть использован для аудиоданных с разными идентификаторами кодека. Эти данные могут быть как несжатые, так и сжатые. Например, несжатые данные могут иметь идентификатор кодека pcm_s16le
(PCM16) или pcm_f32le
(IEEE Float). Для сжатых данных может быть использовано простейшее сжатие типа pcm_mulaw
или pcm_alaw
, а также более сложное, например mp3
.
Наиболее популярные форматы контейнеров, например, форматы, соответствующие расширениям файлов avi
, mp4
, mkv
, ogg
, flv
, mov
, etc., поддерживают несколько потоков с разными медиатипами и разными идентификаторами кодека. Обычно в этом случае есть поддержка метаданных, некоторые форматы поддерживают главы. Но следует иметь в виду, что, несмотря на универсальность, какие-то форматы могут устанавливать свои ограничения как на медиатип потока, так и на идентификатор кодека потока.
Вообще система именования в FFmpeg может иногда запутать. Можно столкнуться с ситуацией, когда идентификатор кодека, декодер, кодер и формат контейнера имеют одно и то же имя (в качестве примера можно привести aac
), но при работе с FFmpeg нужно четко понимать к какой сущности относится имя в том или ином контексте.
2.10. Работа со временем
Наверное, не надо говорить, насколько важна корректная работа со временем в мультимедийных приложениях. Для задания времени в FFmpeg используется единица времени (time base), задаваемая в секундах с помощью рационального числа, например 1/1000 задает миллисекунду. (Аналогичный подход используется в C++11 в стандартной библиотеке chrono
.) Единицу времени используют потоки, кодеки, главы и другие компоненты, в соответствующих структурах имеется член time_base
. Для представления рациональных чисел в FFmpeg используется структура AVRational
.
Кадры, пакеты, главы имеют метки времени (timestamps). В соответствующих структурах имеются члены типа int64_t
, их значения содержат время в некоторых единицах времени. Например, структура AVFrame
имеет член pts
(presentation timestamp), значение которого определяет относительное время сцены, запечатленной в кадре.
В ряде случаев в FFmpeg используется стандартная единица времени — микросекунда (1/AV_TIME_BASE
).
Для видеопотоков частота кадров (frame rate) также задается рациональным числом, например 24000/1001 (NTSC-film frame rate) это почти 24 кадра в секунду.
Подобный подход позволяет вычислять требуемое время максимально точно, избегая накопления ошибок округления. Более подробно работа со временем обсуждается в предыдущей статье про кодеки.
2.11. Разное
В разделе рассматриваются два часто используемых термина, которые, в силу их внешней схожести в английском языке, иногда путают. Также обсуждается проблема «неквадратного пикселя».
2.11.1. Interlacing
При появлении телевидения по техническим причинам кадр формировался в два прохода — отдельно нечетные строки и отдельно четные. (Строки нумеруются с единицы, телевидение появилось раньше C.) По-русски это называется чересстрочной разверткой, по-английски interlaced scan type или просто interlacing. Если кадр формируется за один проход, то это называется прогрессивной разверткой (progressive scan type). В настоящее время практически все аналоговые камеры используют чересстрочную развертку, цифровые камеры не всегда, но все-таки тоже иногда используют. Если кадр получен с помощью чересстрочной развертки, то его можно разбить на две половинки — в одной нечетные строки, в другой четные. Эти половинки называются полями (fields) и обозначаются как верхнее (top) для нечетных и нижнее (bottom) для четных. При кодировании каждое поле кодируется отдельно. После кодирования эти два поля могут быть помещены как в один пакет, так и в два отдельных (separated fields). Порядок формирования полей (scan order) тоже может быть разным, первым может формироваться верхнее поле (top field first), но может быть и наоборот(bottom field first). При декодировании декодер соединяет оба поля в одном кадре. Такие кадры на динамических сценах имеют характерный дефект, называемый эффектом «гребёнки». Он возникает из-за того, что в результате изменения сцены к моменту второго прохода нечетные и четные строки изображения будут «разъезжаться». Это обычно хорошо видно на контрастных участках.
Для уменьшения этого эффекта (полностью его устранить невозможно) такие кадры подвергают специальной обработке, называемой деинтерлейсингом (deinterlacing). В FFmpeg есть несколько фильтров, решающих эту задачу, наиболее известный из них — yadif
(yet another deinterlacing filter).
Фильтры деинтерлейсинга обычно имеют два основных режима: в первом из них на каждый входной кадр генерируется один выходной, во втором выходные кадры генерируется по каждому полю и, таким образом, на каждый входной кадр получается два выходных, что удваивает частоту кадров. Например, в yadif
первый режим задается установкой параметра mode=send_frame
, а второй режим установкой параметра mode=send_field
.
Демультиплексоры могут определить (правда, не всегда) тип развертки в качестве одной из характеристик данных видеопотока. Тип развертки можно также определить непосредственно из декодированного кадра, структура AVFrame
имеет члены interlaced_frame
и top_field_first
.
Иногда можно столкнуться с ситуацией, когда поля в кадре расположены в неправильном порядке, то есть нижнее поле размещает на месте верхнего, а верхнее на месте нижнего (декодер неправильно определил scan order). Это приводит к некоторой деградации изображения (хотя при беглом взгляде это можно и не заметить). В данном случае опять могут помочь фильтры деинтерлейсинга, например yadif
имеет параметр parity
, с помощью которого можно управлять порядком полей. Есть также специальный фильтр fieldorder
, который меняет поля местами.
2.11.2. Interleaving
Для синхронизации потоков с разными медиатипами важно, чтобы в контейнере пакеты из разных потоков, но с близкими временными метками, находились близко друг к другу. В этом случае говорят, что пакеты чередуются (interleaved). (Известный формат AVI как раз и расшифровывается как Audio Video Interleaved.) Если это условие не выполняется, то при синхронизации потоков будут проблемы, придется держать в памяти большие очереди пакетов.
В FFmpeg для записи пакетов в контейнер обычно используется функция av_interleaved_write_frame()
, которая и обеспечивает нужное расположение пакетов. Эта достигается за счет того, что функция записывает пакеты не сразу, сначала они помещаются в очереди пакетов. Но следует иметь в виду, что возможности этой функции не безграничны, при организации записи пакетов следует принимать меры, чтобы избежать сильной рассинхронизации.
2.11.3. Sample aspect ratio
У некоторых видеокамер, физическое разрешение (пиксель/мм) по горизонтали и вертикали не совпадают, что можно интерпретировать как неквадратные пиксели. Соотношение сторон пикселя описывается парой чисел и называется sample aspect ratio (SAR), для квадратного пикселя это будет 1:1, а вот для неквадратного иное. Если устройство отображения видеокадра имеет одинаковое разрешение по вертикали и горизонтали, то кадр с неквадратными пикселями будет отображаться с нарушением пропорций и, таким образом, для правильного отображения необходима коррекция. SAR являются одной из характеристик данных видеопотока и демультиплексоры умеют его определять. Если SAR известен, то необходимую коррекцию несложно выполнить с помощью rescaler или графа фильтров.
3. Сборка FFmpeg
Как и многие другие решения из мира Open Source, FFmpeg можно собрать самостоятельно, из исходных кодов, при этом сконфигурировав под свои задачи.
Процесс сборки FFmpeg достаточно традиционна для Unix-подобных ОС: используется командная оболочка shell, shell-скрипт configure
(shebang #!/bin/sh
), make-файлы и C-компилятор GCC. Но в случае FFmpeg эту задачу нельзя отнести к простым. Рассмотрим основные проблемы.
3.1. Внешние библиотеки
Первая проблема, которая возникает в процессе сборки FFmpeg — это большое количество внешних библиотек, используемых для расширения функционала. Код, который можно скачать с сайта проекта — это далеко не весь FFmpeg, многие важные компоненты находятся во внешних библиотеках и таких библиотек несколько десятков. Например, во внешних библиотеках находятся многие кодеры (libx264
, libmp3lame
), многие фильтры также требуют подключения внешних библиотек. Каждую такую библиотеку надо скачать (надо знать адрес!) и собрать (надо знать с какими опциями!) и только после этого собирать FFmpeg. Эти библиотеки не включаются в виде отдельных разделяемых библиотек, они компонуются статически, их код включается в библиотеки и приложения FFmpeg.
3.2. Конфигурирование и компиляция
Как обычно, для начала сборки самого FFmpeg надо запустить скрипт configure
с необходимыми опциями. Этот скрипт поддерживает несколько сотен опций (их список можно получить, запустив configure
с опцией --help
), в частности каждая подключаемая внешняя библиотека требует своей опции (например --enable-libx264
, --enable-libmp3lame
). Понятно, что правильный выбор среди такого количества опций является не самой простой задачей.
Для успешной работы configure
обычно нужно инсталлировать дополнительные пакеты (autotools
, etc.), какие именно зависит от ОС, нужно искать инструкции для конкретной ОС.
Основная задача configure
— это сгенерировать заголовочный файл определений config.h
, который задает, какие компоненты следует включать в сборку, а также другие параметры компиляции. Этот файл подключается к make-файлам. Также в процессе работы configure
анализирует некоторые исходные C-файлы, после чего генерирует другие исходные C-файлы. Примеры есть в предыдущей статье про кодеки.
После успешного выполнения configure
надо выполнить команду make
и дождаться успешного окончания (или сообщения об ошибке).
3.3. Сборка под Windows
Сборку под Windows можно выполнять в какой-нибудь ОС из семейства Linux с использованием кросс-компиляции, которую осуществляет MinGW. Сборку также можно делать непосредственно в Windows, для этого надо установить среду MSYS (или MSYS2). Эта среда предоставляет консоль, которая является по существу UNIX-подобной оболочкой для поддержки MinGW. В этом случае весь процесс происходит в Windows, управление осуществляется консолью MSYS. Есть еще другие варианты, см. соответствующую страницу сайта FFmpeg. Имеется хорошая статья — «FFmpeg compilation in Windows 10.pdf». Эта статья подробно описывает установку MSYS и сборку FFmpeg с минимальным количеством внешних библиотек (статью можно скачать с помощью поисковика). Под Windows можно скачать готовую сборку, см. раздел 4.3. Другие ссылки можно найти на соответствующей странице сайта FFmpeg.
3.4. Сборка для программирования с использованием FFmpeg API
Функциональность FFmpeg можно включить в проекты, написанные на C или C++. Для этого надо использовать так называемую разделяемую сборку (shared build), которая получается, если при конфигурировании использовать опции --disable-static
и --enable-shared
. В этом случае сборка включает восемь разделяемых библиотек (для Windows это *.dll
файлы) и три приложения — ffmpeg
, ffprobe
и ffplay
(для Windows это *.exe
файлы). Также в состав сборки входят заголовочные C-файлы (*.h
файлы) и файлы, необходимые для компоновки с разделяемыми библиотеками (для Windows это *.lib
файлы). В C++ проектах заголовочные файлы FFmpeg API надо включать в блок extern "C" { }
.
Отметим, что если при конфигурировании использовать опции --enable-static
и --disable-shared
, то в этом случае получается так называемая статическая сборка (static build), собираются только три приложения — ffmpeg
, ffprobe
и ffplay
(код библиотек включается в приложения непосредственно). В этом случае возможности FFmpeg становятся доступными только из командной строки.
4. Разработки автора
4.1. Обертка над FFmpeg API и приложения
Основная разработка автора — это объектно-ориентированная обертка над FFmpeg API. Обертка написана на C++14 и в ней представлены классы для основных компонент FFmpeg — мультиплексоров, демультиплексоров, потоков, кодеков, конвертеров кадров, фильтров и графов фильтров. Есть классы, предназначенные для построения мультимедийных приложений разного уровня. Эта обертка реализована в виде разделяемой библиотеки FFmpegWrapper.dll
. Конечным потребителем мультимедийной функциональности в основном были .NET приложения, поэтому были написаны необходимые .NET сборки для взаимодействия с FFmpegWrapper.dll
и предоставляющие к ней более комфортный интерфейс. Также были написаны три GUI приложения (использовался WPF). Эти приложения позволяют получить информацию о компонентах FFmpeg, экспериментировать с разными медиаконтейнерами, кодеками, фильтрами, осуществлять транскодирование. Рассмотрим эти приложения более подробно.
4.1.1. Explorer
Приложение позволяет получить информацию о компонентах FFmpeg — демультиплексорах, мультиплексорах (форматах), протоколах, кодеках, фильтрах, bitstream-фильтрах. Также можно получить информацию о поддерживаемых форматах пикселей, форматах аудиоотсчетов, стандартных раскладках аудиоканалов и версиях библиотек и самой сборки.
Можно получить список всех форматов и соответствующих демультиплексоров и мультиплексоров. Можно получить информацию о демультиплексоре или мультиплексоре: имя, краткое описание, ассоциированные расширения файлов, опции для настройки и некоторые другие сведения.
Можно получить список всех протоколов. Для каждого из них можно получить имя, поддерживаемые направления (входной/выходной), опции для настройки.
Можно получить список всех идентификаторов кодеков и соответствующих декодеров и кодеров. Для идентификаторов кодеков можно получить имя, краткое описание и флаги. Для декодеров и кодеров можно получить имя, флаг «Experemental», форматы кадров, поддерживаемые режимы аппаратного ускорения, опции для настройки.
Можно получить список всех фильтров. Для каждого из них приводится количество имя, медиатип входов/выходов, поддержка команд, описание.
Можно получить список всех bitstream-фильтров. Для каждого из них приводится имя, поддерживаемые идентификаторы кодеков, опции для настройки.
Можно получить информацию о поддерживаемых форматах пикселей, форматах аудиоотсчетов и стандартных раскладках аудиоканалов.
Можно получить версию FFmpeg, версии библиотек, а также размеры библиотек.
4.1.2. Player
Это медиапроигрыватель, позволяющий воспроизвести любой медиаконтейнер, поддерживаемый FFmpeg. Доступны файлы, устройства видео- и аудиозахвата, а также сетевые источники. При необходимости можно задать формат и опции для медиаконтейнера, выбрать и настроить альтернативный декодер, задать фильтры. Отображается подробная информация о медиаконтейнере.
Есть возможность указать альтернативный декодер и для него формат выходного кадра и опции.
Для видеопотоков можно задать режим многопоточного декодирования, режим аппаратного ускорения или использование QSV/CUVID декодеров.
Можно задать фильтры для обработки кадров. (В частности можно задать фильтр для отображения субтитров.)
Можно просмотреть достаточно подробную информацию о проигрываемом контейнере: формат и другие характеристики контейнера, потоки и их основные характеристики, метаданные контейнера и потоков, главы.
Для исследования производительности видеодекодеров есть специальный режим benchmark.
Для аудиопотока можно отобразить осциллограмму. Есть возможность выбрать альтернативные устройства вывода звука.
4.1.3. Transcoder
Это приложение позволят извлечь пакеты из одного контейнеры и записать их в другой контейнер, при необходимости произведя перекодирование и обработку с помощью фильтра.
Можно использовать любой медиаконтейнер, поддерживаемый FFmpeg, при необходимости имеется возможность явно указать формат и опции.
В качестве целевого контейнера можно указать любой, который поддерживает FFmpeg. При необходимости имеется возможность явно задать формат и опции. Можно указать медиапотоки, которые необходимо переместить в целевой контейнер и при необходимости перекодировки задать имя и опции кодера.
При перекодировании можно изменить характеристики кадра (размер, частоту дискретизации, число каналов), а также использовать фильтр для дополнительной обработки.
В целевой контейнер можно добавить метаданные (как в сам контейнер, так и в потоки).
4.2. Справка, логи
Каждое приложение имеет справочный HTML-файл (вызывается по F1). Для справки по самому FFmpeg лучше всего воспользоваться документацией на сайте FFmpeg (вызывается из приложений по Ctrl+F1). Есть также offline документация, она находится в папке ffmpeg/doc
, но она не такая удобная, как на сайте. В папке ffmpeg/dev/examples
находятся примеры программирования на C с использованием FFmpeg API.
Работа приложений подробно логируется. Логи находятся в папке C:\Users\<user_name>\AppData\Local\dm-frox\FFmpegSuite\<app_name>\_LOGS
, где <user_name>
— это имя текущего пользователя, а <app_name>
— это explorer
или player
или transcoder
. Логи полезны для изучения логики работы приложений, также они необходимы для анализа ошибок. Логи являются простыми текстовыми файлами в кодировке UTF8.
4.3. Где скачать
Описанные решения организованы в проект FFmpegSuite, который можно скачать с облака по адресу https://disk.yandex.ru/d/DY_d6OL4wb7FsA
или https://cloud.mail.ru/public/auqr/WnBxcujCE
. После распаковки получим корневую папку FFmpegSuite
, в которой находятся папки bin
, doc
, ffmpeg
, params
, sources
и файл README.md
. Исполняемые модули приложений и необходимые разделяемые модули находятся в папке bin/x64
. Требования к окружению: ОС Windows 10, .NET Framework 4.8, Microsoft Visual C++ Redistributable package for Visual Studio 2022 (x64). Скорее всего, все будет работать под Windows 11 и Windows 7. Папка doc/help
содержит справочные файлы для приложений. Папка ffmpeg
содержит библиотеки FFmpeg и необходимые файлы для сборки приложений. Папка params
содержит xml-файлы для настройки приложений. В папке sources
находится исходный код проекта, из которого исполняемые модули можно собрать самостоятельно. Сборка осуществляется с помощью IDE Microsoft Visual Studio 2022. Приложения можно запускать непосредственно из IDE. Более подробное описание содержимого папок проекта находится в файле README.md
.
Проект (кроме готовых модулей из bin/x64
) можно также клонировать с GitVerse по адресу https://gitverse.ru/dm-frox/ffmpegsuite.git
и далее собрать самостоятельно.
Используется версия FFmpeg 7.1 «Péter», выпущенная 2024-09-30. Готовая сборка скачана с www.gyan.dev, раздел release builds, latest release version: 7.1 2024-09-30, ссылка ffmpeg-release-full-shared.7z
, скаченный файл ffmpeg-7.1-full_build-shared.7z
.
4.4. Дисклеймер
FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые распространяется по лицензиям GNU LGPL или GNU GPL, но без какой-либо гарантии. Вот текст, который присутствует в каждом заголовочном файле FFmpeg API:
FFmpeg is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
(FFmpeg распространяется в надежде, что он будет полезен, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. Дополнительные сведения см. в GNU Lesser General Public License.)
Ресурсы
- Общие вопросы
Сайт FFmpeg (eng).
Википедия (рус).
Wikipedia (eng).
Большая коллекция ссылок (eng).
Документация по UBUNTU (рус). - Компиляция и сборка
Руководство по компиляции и сборке (eng).
«FFmpeg compilation in Windows 10.pdf» (загружается через поисковик, eng). - Устройство видеокодеков
Ян Ричардсон. Видеокодирование. H.264 и MPEG-4 — стандарты нового поколения. Москва: Техносфера, 2005.
Как работает видеокодек. Часть 1. Основы.
Как работает видеокодек. Часть 2. Что, для чего, как.
Разбираем процесс видеокодирования на примере кодека H.264/AVC. - Статьи автора
Как добавить кодек в FFmpeg.
Как повысить скорость декодирования видеопотока в FFmpeg.
FFmpeg – продвинутый конвертер видео и аудио файлов. У него нет графического интерфейса, управляется командами из консоли, зато функционал программы и качество итогового материала превосходят другие конвертеры.
Базовые возможности FFmpeg:
- конвертация файлов (со сжатием или без потерь качества);
- изменение разрешения;
- кадрирование;
- обрезка и склейка файлов;
- замена, добавление, извлечение аудиодорожек и субтитров;
- наложение водяного знака;
- кодирование или стриминг потокового видео.
FFmpeg выручит и там, где не справятся другие программы. Например, при конвертации видео из устаревшего DV в современный HD формат, FFmpeg преобразует чересстрочное (25i) видео в прогрессивное (50p), повысит частоту кадров, увеличит разрешение с 720×576 до 1920×1080 и при этом сохранит оригинальное качество картинки.
Несмотря на отсутствие графического интерфейса, FFmpeg прост в использовании и будет полезен как профессионалам работающих с видео, так и любителям решившим обработать домашний видеоархив.
Подробности о FFmpeg читайте на Wikipedia или ffmpeg.org, а ниже рассмотрим как установить конвертер, основные команды и примеры использования.
FFmpeg распространяется в исходных кодах, но на официальном сайте есть ссылки на собранные бинарники для MaxOS и Windows.
Как установить FFmpeg в Windows
Скачайте сборку FFmpeg для Windows.
Разархивируйте содержимое скачанного архива, например в Program Files/ffmpeg (или в другую папку, например, где у вас хранятся портативные программы).
В PowerShell выполните следующую команду.
c:\"program files"\ffmpeg\bin\ffmpeg.exe -version
Для cmd немного модифицированная команда.
"C:\Program Files\ffmpeg\bin\ffmpeg.exe" -version
Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.
Чтобы каждый раз не вводить длинный путь к программе C:\Program Files\ffmpeg\bin\ffmpeg.exe рекомендую добавить ее в системную переменную Path, для этого:
- перейдите в параметры Windows, в поиске введите Панель управления
- перейдите в Панель управления – Система и безопасность – Система;
- выберите пункт Дополнительные параметры системы;
- нажмите кнопку Переменные среды;
- в поле Системные переменные выберите значение Path и нажмите кнопку Изменить, чтобы добавить новое значение;
- укажите путь к папке с FFmpeg содержащую ffmpeg.exe;
- перезагрузите компьютер.
Теперь для того, чтобы вызвать FFmpeg используйте в консоли следующую команду.
ffmpeg
Как установить FFmpeg в MacOS
Самый простой способ установить FFmpeg на MacOS, это Homebrew.
brew install ffmpeg
Либо можно поставить FFmpeg вручную. Для этого, скачайте сборку FFmpeg для MacOS.
Перейдите в папку с загрузками, распакуйте скачанный архив, а затем переместите исполняемый файл ffmpeg в папку /usr/local/bin
sudo cp /путь/до/ffmpeg /usr/local/bin
Далее введите пароль и FFmpeg будет скопирован в директорию к остальным бинарникам.
Попробуйте выполнить следующую команду.
ffmpeg -version
Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.
Как установить FFmpeg в Linux
Для Linux можно самостоятельно собрать FFmpeg из исходников, либо установить его, используя менеджер пакетов входящий в состав операционной системы.
Например, для Ubuntu это можно сделать через репозиторий mc3man ppa, поддерживаемый сообществом Ubuntu.
sudo apt-get install -y software-properties-common
add apt-repository ppa:mc3man/trusty-media
apt-get update
apt-get dist-upgrade
apt-get install ffmpeg
В Debian 9 FFmpeg доступен в официальном репозитории, поэтому для установки достаточно одной команды.
apt install ffmpeg
CentOS не предоставляет официальный репозиторий для FFmpeg, поэтому, как и в случае с Ubuntu, его можно установить с помощью стороннего репозитория.
yum install epel-release -y
yum update -y
В CentOS 7 и RHEL 7 используйте следующую команду:
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
В CentOS/RHEL 6/5 команда отличается.
rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
Далее установите FFmpeg.
yum install ffmpeg ffmpeg-devel -y
После установки попробуйте выполнить следующую команду.
ffmpeg -version
Если в консоли появилось сообщение о версии FFmpeg, значит программа работает.
FFmpeg: быстрый старт
После установки FFmpeg можно творить магию преобразования видео в консоли.
ffmpeg -i input.avi output.mp4
Указанная команда сконвертирует видео из файла input.avi в output.mp4. По умолчанию для файлов mov и mp4 используется кодек H.264. Размер кадра и fps будут взяты из исходного файла.
В примере выше параметры по умолчанию могут не обеспечить желаемые качество или результат. Поэтому параметры можно задавать явно. Однако не обязательно указывать все, в этом случае FFmpeg возьмет их из исходного файла (например частоту кадров) или значение используемое по умолчанию.
Ниже перечислены основные параметры FFmpeg:
- -i имя исходного файла, который предстоит сконвертировать, если файлов несколько перед каждым из них нужно указать -i;
- -y ответит Да (yes) на все вопросы от FFmpeg, если они возникнут в процессе кодирования, например при для перезаписи файла, если тот уже существует;
- -vcodec или кратко c:v – параметры видеокодека, либо copy (если перекодирование не требуется), либо пустой параметр (по умолчанию);
- -f – формат контейнера;
- -b:v (-vb, -b) – битрейт видео в килобитах или мегабитах в секунду задаётся буквой K или M;
- -aspect – соотношение сторон картинки (4:3, 16:9, 1.3333, 1.7777);
- -r – частота кадров;
- -s – разрешение, поддерживаются как числовые значения (например, 640×480, 1920×1080), так и буквенные обозначения (например, qcif, qvga);
Обозначение размеров:
sqcif – 128 × 96
qqvga – 60 × 120
uxvga – 1600 × 1200
qcif – 176 × 144
qvga – 320 × 240
qxga – 2048 × 1536
cif – 352 × 288
vga – 640 × 480
sxga – 1280 × 1024
4cif – 704 × 576
svga – 800 × 600
qsxga – 2560 × 2048
16cif – 1408 × 1152
xvga – 1024 × 768
hsxga – 5120 × 4096
- -vf (или -filter:v) — опция со списком фильтров, которые будут применены к видео;
- -c:a (или -acodec) – параметры аудиокодека, либо copy (если аудио дорожку нужно оставить как есть), либо пустой параметр (по умолчанию);
- -f – формат аудио;
- -af (или -filter:a) — опция со списком фильтров, которые будут применены к аудио;
- -ab (или -b:a) – битрейт аудио;
- -ar – частота дискредитации;
- -ac – количество каналов.
Для примера рассмотрим следующую команду.
ffmpeg -y -i input.avi -c:v libx264 -preset medium -b:v 17000K -aspect 16:9 -r 25 -c:a aac -b:a 256K output.mp4
Данная команда перекодирует файл input.avi в output.mp4. В случае если в конечной папке будет содержаться файл output.mp4, он будет перезаписан (опция -y). В качестве кодека будет использован libx264 со среднем соотношением скорость/качество (-preset medium). Конечный битрейт 17000kbps, соотношение сторон картинки 16:9, частота 25 кадров в секунду. В качестве аудиокодека будет использован AAC с битрейтом 256kbps.
А так можно быстро перепаковать файл из одного контейнера в другой без пересжатия и потери качества.
ffmpeg -i input.mkv -vcodec copy -acodec copy output.mov
или аналогичная (сокращенная запись)
ffmpeg -i input.mkv -c copy output.mov
Это может оказаться полезным, когда устройство, на котором вы хотите воспроизвести видео, не поддерживает исходный формат. Или, например программа видеомонтажа не умеет работать с каким либо форматом и не хочет импортировать его в проект (например Adobe Premiere не работает с mkv, хотя внутри – все тот же H.264). С помощью перепаковки проблема решиться.
С полным списком команд FFmpeg можно ознакомиться на странице официальной документации, а ниже разберем полезные примеры их использования.
Полезные команды FFmpeg
Чтобы получить информацию о видеофайле, передайте FFmpeg название файла без дополнительных опций.
ffmpeg -i video.mp4
Каждый раз при запуске ffmpeg, программа показывает информацию о себе. С помощью опции -hide_banner лишнюю информацию можно скрыть.
ffmpeg -i video.mp4 -hide_banner
Чтобы получить информацию о ключах и параметрах FFmpeg.
ffmpeg -help
Исходные и конечные файлы могут быть любого формата, FFmpeg работает почти со всеми из существующих. Список поддерживаемых форматов можно получить следующей командой.
ffmpeg -formats
Список поддерживаемых кодеков.
ffmpeg -codecs
Обрезка видео
ffmpeg -i input.mp4 -ss 00:00:05 -t 00:05:15 -c copy output.mp4
Выше уже был пример с перепаковкой файла, когда исходный поток остается не тронутым. Добавив пару опций, можно без пересжатия и потери качества обрезать или нарезать видео на фрагменты. Опция -ss задаёт начало обрезки, а опция -t продолжительность фрагмента. Время задаётся в формате «часы:минуты:секунды».
Склейка видео
ffmpeg -i "concat:file1.avi|file2.avi" -vcodec copy -acodec copy output.avi
Для склейки используется оператор concat. После двоеточия ему передаются входные файлы, разделённые вертикальной чертой. Соединяемые файлы обязательно должны быть одного формата (видео и аудио), их параметры должны совпадать. Если это не так, то предварительно нужно произвести перекодирование файлов к единому формату.
Файлы mp4 нельзя объединить напрямую с помощью concat, но можно предварительно преобразовать, например, MPEG-TS без перекодирования видео и звука.
ffmpeg -i video1.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts video1.ts ffmpeg -i video2.mp4 -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts video2.ts
А уже затем объединить в итоговый файл mp4.
ffmpeg -i "concat:video1.ts|video2.ts" -vcodec copy -acodec copy out.mp4
Важно учесть, что, если в одном из фрагментов звуковая дорожка короче по времени чем видеопоток, то звуковые дорожки остальных фрагментов сдвинутся и произойдёт рассинхронизация звука.
Когда входных файлов много, возможно окажется удобным не писать их все в консоль, а создать текстовый файл, как в примере ниже, который затем передать в FFmpeg.
file /home/sk/myvideos/part1.mp4
file /home/sk/myvideos/part2.mp4
file /home/sk/myvideos/part3.mp4
file /home/sk/myvideos/part4.mp4
Команда для объединения будет выглядеть следующим образом.
ffmpeg -f concat -i join.txt -c copy output.mp4
Если получите ошибку.
[concat @ 0x555fed174cc0] Unsafe file name '/path/to/mp4'
join.txt: Operation not permitted
Попробуйте добавить опцию -safe 0.
ffmpeg -f concat -safe 0 -i join.txt -c copy output.mp4
Конвертация видео
При конвертации видео контейнер выходного файла определяется его расширением (avi, mkv, mp4, mov и тд). По умолчанию кодек для кодирования, определяется автоматически, в зависимости от выбранного контейнера (например H.264 для mp4 и mkv, MPEG-2 для mpg). Однако вы можете изменить его, исходя из своих требований или стандартов.
Для видео популярные и широко поддерживаемые видеокодеки H.264, H.265, VP9, а самые известные аудио кодеки — это AAC и MP3.
Кодек и его параметры задаются опциями -c:v для видео, и -c:a для аудио. Для некоторых форматов (MPEG и DV) вместо указанных, используется опция -target.
Пример конвертации h.264 в h.265 без изменения аудиодорожки.
ffmpeg -i input.mp4 -c:v libx265 -vtag hvc1 -c:a copy output.mp4
Пример использования libx265 для видео и aac для аудио.
ffmpeg -i input.avi -c:v libx265 -c:a aac -b:v 15000k -b:a 320k output.mp4
Пример использования libx264 для видео и aac для аудио.
ffmpeg -i input.avi -c:v libx264 -c:a aac -b:v 15000k -b:a 320k output.mp4
Пример использования vp9 для видео и mp3 для аудио.
ffmpeg -i input.avi -c:v vp9 -c:a libmp3lame -b:v 7000k -b:a 256k output.mp4
Вслед за кодеком указывается битрейт для видео и аудио потоков (опции -b:v и -b:a). Чем выше битрейт, тем выше качество, однако и больше размер файла.
Вместо битрейта можно указать опцию -crf (кофициент качества).
ffmpeg -i input.avi -c:v libx264 -preset medium -c:a aac -crf 15 output.mp4
Изменяется в пределах от 0 до 51. Чем ниже значение -crf, тем выше качество будет у выходного файла, однако, как и в случае с высоким битрейтом, увеличится его размер. При значениях 14-17 результат визуально почти неотличим от оригинала. Значение -crf равное 0, будет означать кодирование без потери качества.
У каждого кодека могут быть свои специфические параметры. Например, у H.264 и H.265 часто используется опция -preset влияющая на соотношение скорость кодирования/качество. Значения -preset могут быть: ultrafast, superfast, veryfast, faster, fast, medium (по умолчанию), slow, slower, veryslow. Для чернового варианта можно использовать «быстрые настройки» из категории fast, а для продакшена рекомендуется не ниже slow.
Для VP9 кодирование без потери качества задается опцией -lossless 1.
ffmpeg -i input.mp4 -c:v vp9 -lossless 1 output.webm
Подробнее с настройками кодеков H.264, H.265 и VP9 и можно ознакомится в документации.
Аппаратное ускорение
Владельцы видеокарт NVIDIA могут повысить скорость кодирования в H.264 за счет ресурсов GPU. Для этого попробуйте использовать кодек h264_nvenc.
ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy output.mp4
Сборка FFMpeg должна поддерживать кодек h264_nvenc и быть совместима с драйвером видеокарты.
Двухпроходное кодирование
При двухпроходном кодировании, на первом проходе кодек анализирует видео и пишет log-файл, а на втором сжимает видеозапись, используя полученную на первом проходе информацию. На простые (статические) сцены выделяется минимальное количество битрейта, а на сложные (динамические) — максимальное. Такой подход дает оптимальное распределение битрейта и соответственно лучшее качество картинки в сравнении с однопроходным кодированием.
Чтобы выполнить первый проход используйте следующую команду (с опцией -pass 1).
ffmpeg -y -i input.avi -c:v libx264 -b:v 17000K -pass 1 -f mp4 /dev/null
На первом проходе файл не создается, поэтому вместо него указанно /dev/null (или NULL если работаете в Windows).
На втором проходе (-pass 2), пример команды будет иметь следующий вид.
ffmpeg -y -i input.avi -c:v libx264 -b:v 17000K -pass 2 -f mp4 -c:a aac -b:a 256K output.mp4
Двухпроходное кодирование удобно выполнять, используя скрипт. Примеры скриптов приведены в конце заметки, в разделе Пакетная обработка FFmpeg.
Конвертация для MPEG-совместимых устройств
Для устройств, работающих с форматом MPEG, параметры выходного файла рекомендуется задавать опцией -target. Значения могут быть следующими: vcd, svcd, pal-vcd, ntsc-svcd и должны иметь префикс pal-, ntsc- или film-. В этом случае битрейт, кодек и размер кадра будут подобраны автоматически в соответствии с указанным стандартом. При необходимости можно указать соотношение сторон экрана (опция -aspect), как правило 16:9 или 4:3.
Пример для DVD плееров.
ffmpeg -i input.avi -target pal-dvd -ps 2000000000 -aspect 16:9 output.mpeg
Опция -ps 2000000000 задает здесь максимальный размер конечного файла.
Пример для VCD (pal и ntsc).
ffmpeg -i input.avi -target pal-vcd output.mpg ffmpeg -i input.avi -target ntsc-vcd output.mpg
Пример для SVCD (pal и ntsc).
ffmpeg -i input.avi -target pal-svcd output.mpg ffmpeg -i input.avi -target ntsc-svcd output.mpg
Конвертация AVI в DV
Как и в случае с форматом MPEG, параметры для DV файла рекомендуется задавать опцией -target. Значения могут быть следующими: dv, dv50 и должны иметь префикс pal-, ntsc- или film-. В этом случае битрейт, кодек и размер кадра будут подобраны автоматически в соответствии со стандартом.
ffmpeg -i input.avi -target pal-dv output.dv
Однако параметры можно указать и явно.
ffmpeg -i input.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 output.dv
Конвертация в MJPEG
Если при монтаже привыкли использовать формат MJPEG, то следующая команда преобразует в него исходное видео. Опция -qscale 1 означает, что видео будет закодировано с максимальным качеством.
ffmpeg -i input.mp4 -vcodec mjpeg -qscale 1 -an output.avi
Конвертация AVI в DivX
Пример для некогда популярного формата DivX (mpeg4v2). Может пригодиться владельцам старых устройств.
ffmpeg -i input.avi -s 320x240 -vcodec msmpeg4v2 output.avi
Конвертация видео в формат PSP
ffmpeg -i input.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac output.mp4
Изменение разрешения и кадрирование
Чтобы изменить разрешение конечного видео можно воспользоваться опцией -s.
ffmpeg -i input.mp4 -s 1280x720 output.mp4
Однако использование фильтра scale даст более качественный результат.
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
Преобразовать 4K в 1080:
ffmpeg -i input4kvid.mp4 -vf scale=1920:1080 -c:a copy output1080vid.mp4
Для кадрирования изображения предназначен фильтр crop. Его параметры имеют следующий вид crop=w:h:x:y, где w — ширина прямоугольника, который нужно вырезать из исходного видео, h — высота прямоугольника, x и y — x координаты точки начала обрезки.
$ ffmpeg -i input.mp4 -filter:v "crop=640:480:200:150" output.mp4
Команда выше вырежет из кадра прямоугольник шириной 640 и высотой 480 пикселей, начиная с позиции (200,150).
Но мне привычна, другая запись.
ffmpeg -i input.mp4 -vf crop=in_w-2*2:in_h-2*4 output.mp4
В данном примере видео будет обрезано на 4 пикселя сверху и снизу, а так же на 2 пикселя слева и справа.
Фильтры можно комбинировать.
ffmpeg -i input.mp4 -vf crop=in_w-2*2:in_h-2*4,scale=1280:720 output.mp4
Соотношение сторон
Соотношение сторон устанавливаются опцией -aspect.
ffmpeg -i input.mp4 -aspect 16:9 output.mp4
Еще пример.
ffmpeg -i input.mp4 -aspect 16:9 -vf scale=1280:720 output.mp4
Самые популярные соотношения сторон:
- 16:9
- 4:3
- 16:10
- 5:4
- 2:21:1
- 2:35:1
- 2:39:1
Деинтерлейсинг
Для деинтерлейсинга в FFmpeg есть фильтр yadif (yet another deinterlacing filter).
ffmpeg -i input.mp4 -vf yadif output.mp4
По умолчанию, фильтр преобразует чересстрочное видео в прогрессивное, создавая полные кадры из соседних полукадров. Дает хороший результат, однако при таком преобразовании частота кадров снижается вдвое. Это заметно при воспроизведении видео, поэтому я предпочитаю способ, описанный ниже.
Преобразование 25i в 50p
Чтобы не терять кадры при деинтерлейсинге и чересстрочное видео осталось таким же плавным как в оригинале, рекомендуется способ, при котором частота кадров удваивается, а недостающие строки в каждом поле восстанавливаются при помощи интерполяции. Видео 25i фактически будет преобразовано в 50p (30i в 60p соответственно).
Для преобразования используется уже знакомый фильтр yadif.
ffmpeg -i input.avi -vf yadif=1:-1:0 -r 50 output.mp4
Параметры 1:-1:0 переданные yadif выполнят деинтерлейсинг по методу описанному выше.
Полностью команда для преобразования чересстрочного широкоэкранного DV видео 25i в прогрессивное HD 50p будет выглядеть следующим образом.
ffmpeg -i input.dv -c:v libx264 -preset slow -b:v 20000K -aspect 16:9 -vf yadif=1:-1:0,crop=in_w-2*0:in_h-2*4,scale=1920:1080 -r 50 -c:a aac -b:a 256K output.mp4
Небольшое пояснение: crop я здесь использую, потому что во многих моих исходниках на DV видео есть артефакт в виде полоски внизу, от которой я избавляюсь, обрезая видео на 4 пикселя снизу и сверху.
Потоки
Для обращения к потокам (видео, аудио, субтитрам) используется опция -map.
Количество и идентификаторы потоков можно увидеть, запросив информацию о файле.
ffmpeg -i video.mp4
Среди прочей информации о файле будет выдано примерно следующее:
Stream #0:0(und): Video … Stream #0:1(ger): Audio … Stream #0:2(eng): Audio … Stream #0:3(rus): Subtitle …
Потоки обозначаются двойным номером, через двоеточие — 0:0, 0:1, 1:0, 2:1 и т.д. Цифра до двоеточия — номер по порядку каждого выходного файла, нумерация ведется с нуля. А номер после двоеточия обозначает номер потока внутри файла.
В примере выше, 0 перед двоеточием означает, что это первый по порядку файл — video.mp4. А номера после двоеточия означают номера внутренних потоков этого файла. 0:0 — видео дорожка, 0:1 — первая аудиодорожка на немецком языке, 0:2 — вторая аудиодорожка на английском языке, 0:3 — дорожка с русскими субтитрами.
Конвертация аудиодорожек
Если аудиодорожка одна, изменить ее формат (битрейт/качество аудио по желанию), без перекодирования видео можно следующей командой:
ffmpeg -i input.mkv -c:v copy -c:a ac3 -b:a 320k output.mkv
Если аудиодорожек несколько, хочется оставить их без изменений, но сконвертировать только одну. Пример команды ниже, сконвертирует только третью аудиодорожку, первые две и видео останутся оригинальными.
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -c:v:0 copy -c:a:0 copy -c:a:1 copy -c:a:2 ac3 -b:a 320k output.mkv
Пояснение: в примере -map 0:0 это видеодорожка, к ней будет применена опция -c:v:0 copy, что означает, что видео не будет перекодироваться. -map 0:1 -map 0:2 -map 0:3 это 3 аудиодорожки. К первым двум будут применены -c:a:0 copy -c:a:1 copy, что означает, что дорожки останутся в оригинальном формате. А к 3 дорожке будет применена опция -c:a:2 ac3 -b:a 320k, что означает, что она будет сконвертирована в формат AC3 с битрейтом 320k.
Если какие-то дорожки не нужны, просто не указывайте к ним обращение. Например, чтобы убрать аужиодорожки с 4 по 6 из 7 доступных, воспользуйтесь примером ниже.
ffmpeg -i input.mkv -map 0:0 -map 0:1 -map 0:2 -map 0:3 -map 0:7 -c:v:0 copy -c:a:0 ac3 -c:a:1 ac3 -b:a 320k -c:a:2 ac3 -b:a 320k -c:a:3 ac3 -b:a 320k -c:a:7 ac3 -b:a 320k output.mkv
Добавление, извлечение и удаление и аудио
Чтобы добавить звуковую дорожку в видеофайл используйте опцию -i, в которой укажите путь к аудиофайлу.
ffmpeg -i noaudio.mpg -i audio.acc -vcodec copy -acodec copy output.mpg
Удалить из видеофайла звуковую дорожку можно с помощью опции -an (audio not).
ffmpeg -i input.mpg -vcodec copy -an noaudio.mpg
Сохранить аудиодорожку из видеофайла.
ffmpeg -i input.mpg audio.wav
Если требуется сохранить дорожку в определенный формат, укажите параметры явно, как в примере ниже.
ffmpeg -i input.avi -vn -ar 44100 -ac 2 -ab 192K -f mp3 audio.mp3
Опция -ar указывает частоту дискретизации, -ac — количество каналов, -ab — битрейт.
Опция -vn означает, что видео информация будет отброшена, а опция -f указывает формат полученного файла (в примере — это mp3). В новых версиях FFmpeg эти две опции можно не указывать, FFmpeg разберется сам.
Если звуковых дорожек несколько, чтобы сохранить отдельную звуковую дорожку из видеофайла (демультиплексация) воспользуйтесь опцией -map и укажите ее идентификатор потока.
ffmpeg -i input.avi -map 0:2 audio.wav
В примере ниже показано, как добавить несколько звуковых дорожек в видеофайл (мультиплексация).
ffmpeg -i video.avi -i audio1.mp3 -i audio2.mp3 -map 0:0 -map 0:1 -map 0:2 output.mkv
Так как в примере выше только один выходной файл, 0 перед двоеточием можно опустить.
ffmpeg -i video.avi -i audio1.mp3 -i audio2.mp3 -map 0 -map 1 -map 2 output.mkv
Изменение громкости
Для изменения громкости в FFmpeg существует аудиофильтр volume.
Следующая команда в половину уменьшит громкость.
$ ffmpeg -i input.mp3 -af 'volume=0.5' output.mp3
Аналогично, громкость можно увеличить (в примере ниже в полтора раза).
$ ffmpeg -i input.mp4 -c:v copy -af 'volume=1.5' output.mp4
Конвертация аудиофайлов
Аудио файлы можно конвертировать независимо от видео.
ffmpeg -i input.wav -ar 44100 -ac 2 -ab 192K -f mp3 output.mp3
Изменение скорости воспроизведения
Скорость воспроизведения видео и аудио изменяется раздельно.
Чтобы увеличить или уменьшить скорость видео, используется видеофильтр «setpts».
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
Команда выше удвоит скорость видео.
Не очевидно, но чтобы замедлить видео, нужно использовать множитель больше 1. Команда ниже замедлит исходное видео в 4 раза.
ffmpeg -i input.mp4 -vf "setpts=4.0*PTS" output.mp4
Чтобы увеличить или уменьшить скорость аудио, используется аудиофильтр «atempo». Следующая команда удвоит скорость звука.
ffmpeg -i input.mp4 -af "atempo=2.0" -vn output.mp4
Допустимы значения от 0.5 до 2.0.
Чтобы одновременно удвоить скорость воспроизведения для видео и аудио придется скомбинировать оба фильтра.
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
Добавление субтитров
Ниже приведен пример добавления субтитров для файла формата MKV.
ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s copy output.mkv
В примере, к исходному видеофайлу video.mp4 будут добавлены субтитры из файла subtitles.srt. Опция -c copy означает, что видео и аудио потоки из video.mp4 будут скопированы как есть (без пересжатия), опция -c:s copy, означает, что титры будут вставлены без изменений.
Если нужно вставить несколько дорожек субтитров команда может выглядеть так.
ffmpeg -i input.mp4 -i ru_subtitles.srt -i en_subtitles.srt -map 0:0 -map 1:0 -map 2:0 -c:v copy -c:a copy -c:s copy output.mkv
Формат MKV, может использовать субтитры форматов srt, subrip, ssa или ass, за исключением mov_text.
ffmpeg -i input.mp4 -i subtitles.ass -map 0:0 -map 0:1 -map 1:0 -c:v copy -c:a copy -c:s copy output.mkv
В свою очередь MP4 поддерживает только один формат субтитров — mov_text. Прочие форматы можно использовать в качестве исходных, но обязательно укажите кодек для субтитров, чтобы на выходе сконвертировать их в mov_text (-c:s mov_text).
ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
Пример для нескольких потоков субтитров.
ffmpeg -i input.mp4 -i ru_subtitles.srt -i en_subtitles.srt -map 0:0 -map 1:0 -map 2:0 -c copy -c:s mov_text output.mp4
FFmpeg умеет конвертировать субтитры из одного формата в другой.
ffmpeg -i subtitles.srt subtitles.ass
Чтобы извлечь субтитры из видеофайла можно использовать следующую команду.
ffmpeg -i input.avi -txt_format text output.srt
А если необходимо удалить субтитры используйте опцию -sn.
ffmpeg -i input.mkv -c copy -sn output.mkv
Разбить видео на кадры
Следующая команда разобьет видео на кадры с именами image1.jpg, image2.jpg, image3.jpg и т.д.
ffmpeg -i video.mp4 image%d.jpg
В некоторых случаях, рекомендуют явно указывать выходной формат, опция -f image2 для изображений. В качестве конечного формата можно использовать jpg, jpeg, png и другие.
ffmpeg -i video.mp4 -f image2 image%d.jpg
После выполнения в конечной папке окажется огромное количество файлов изображений. Чтобы уменьшить их можно, понизить частоту кадров (опция -r).
ffmpeg -i video.mp4 -r 1 image%d.png
Собрать видео из изображений
Операция обратная предыдущей. В некоторых случаях, рекомендуют явно указывать входной формат (опция -f image2 для изображений).
ffmpeg -r 12 -f image2 -i image%d.jpg output.mpg
Создание превью
Следующая команда создаст графический файл в формате JPEG, взяв один кадр на 30 секунде.
ffmpeg -i video.mp4 -an -ss 30 -vframes 1 -s 340x180 -y -f mjpeg screenshot.jpg
А ниже приведен пример создания анимированного превью в формате GIF.
ffmpeg -i input.avi -an -pix_fmt rgb24 -ss 30 -vframes 64 -s 340x180 -loop_output 0 -f gif screenshot.gif
Опция -loop_output задает количество повторов, по умолчанию равен 1. Если указать 0, то анимация будет бесконечной.
Конвертировать FLV в видео (и наоборот)
Чтобы конвертировать флеш-ролик в видео, воспользуйтесь следующей командой.
ffmpeg -i video.flv video.mpg
Конвертацию можно выполнить и в обратную сторону.
ffmpeg -i video.mpg video.flv
Параметры можно указать явно.
ffmpeg -i video.mpg -ab 26k -f flv video.flv
Или более конкретно.
ffmpeg -i video.mpg -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video.flv
Преобразовать видео в GIF
Чтобы сконвертировать видео в гифку (без сжатия).
ffmpeg -i input.avi output.gif
Флеш-ролики тоже можно конвертировать.
ffmpeg -i input.flv output.gif
Оптимизация для WEB
Для потоковой передачи видео, может оказаться полезным перенести moov-атомы в начало файла. Это позволит при передачи по сети декодировать видео частями, и начать показ ролика, не заставляя пользователя ждать, пока он скачается целиком.
ffmpeg -i input.avi -c:v libx264 -c:a aac -movflags +faststart output.mp4
Пакетная обработка FFmpeg
Если необходимо сконвертировать не один, а несколько десятков файлов, очевидным неудобством станет то, что придется множество раз вводить одну и ту же команду и прежде, чем поставить кодироваться следующий файл, нужно будет дождаться завершения предыдущего.
Написание скриптов, тема для отдельной статьи, здесь же приведу примеры для Windows и MacOS, с помощью которых за раз можно сконвертировать всю папку с файлами.
Примеры скриптов FFmpeg для Windows
Создайте текстовый файл, с расширением .bat, поместите в него содержимое указанное ниже и скорректируйте по своему усмотрению.
Чтобы воспользоваться скриптом, потребуется указать путь до папки с файлами, которые хотите сконвертировать, расширение исходных файлов, выходной формат и расширение (контейнер) выходных файлов.
@Echo off
Pushd "C:\folder\"
for %%f in (*.avi) do (
ffmpeg -y -i "%%~f" -c:v libx264 -b:v 17000K -pass 1 -f mp4 NULL
ffmpeg -y -i "%%~f" -c:v libx264 -b:v 17000K -pass 2 -f mp4 -c:a aac -b:a 256K "%%~nf.mp4"
)
PopD
Pause
Скрипт из примера возьмет все файлы из папки ( C:\folder\ ) с расширением .avi и сконвертирует их (используя двухпроходное кодирование) в формат mp4, расширение выходных файлов так же будет mp4. Выходные файлы будут помещены в ту же папку, что и исходные.
Ниже приведен аналогичный пример для конвертации аудио. Cкрипт конвертирует файлы с расширением .wav в .mp3.
@Echo off
Pushd "C:\folder\"
for %%f in (*.wav) do (
ffmpeg -y -i "%%~f" -ar 44100 -ac 2 -ab 320K -f mp3 "%%~nf.mp3"
)
PopD
Pause
Примеры скриптов FFmpeg для MacOS
Создайте текстовый файл, с расширением .sh, поместите в него содержимое указанное ниже и скорректируйте по своему усмотрению.
Чтобы воспользоваться скриптом, потребуется указать расширение исходных файлов, расширение (контейнер) выходных файлов, выходной формат, а также путь до папки с файлами, которые хотите сконвертировать.
#!/bin/bash
input=avi
output=mp4
format=mp4
cd ~/Desktop/folder/
for i in *."$input";
do
ffmpeg -y -i "$i" -c:v libx264 -b:v 17000K -pass 1 -f $format /dev/null;
ffmpeg -y -i "$i" -c:v libx264 -b:v 17000K -pass 2 -f $format -c:a aac -b:a 256K "${i%.*}.$output";
done
Не забудьте сделать скрипт исполняемым.
chmod 755 YourScript.sh
Скрипт из примера возьмет все файлы из папки ( ~/Desktop/folder/ ) с расширением .avi и сконвертирует их (используя двухпроходное кодирование) в формат mp4, расширение выходных файлов так же будет mp4. Выходные файлы будут помещены в ту же папку, что и исходные.
Ниже приведен аналогичный пример для конвертации аудио. Cкрипт конвертирует файлы с расширением .wav в .mp3.
#!/bin/bash
input=wav
output=mp3
format=mp3
cd ~/Desktop/folder/
for i in *."$input";
do
ffmpeg -y -i "$i" -ar 44100 -ac 2 -ab 320K -f $format "${i%.*}.$output";
done
Полезные ссылки
Официальный сайт FFmpeg
Документация FFmpeg
Документация по командам FFmpeg
Документация по фильтрам
На этом всё. Но вы можете поддержать проект. Даже небольшая сумма поможет нам писать больше полезных статей.
Если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.
If you’d ask anyone which is the most popular software project or library to handle audio and video processing. Chances are that most of them would mention FFmpeg. It is widely used for tasks such as transcoding, packaging, video playback, basic editing, video scaling, etc. It is one of the most popular tools used for video and image processing. Many video platforms use FFmpeg as part of their project.
Table Of Content:
- What is FFMPEG?
- How to Install FFmpeg on Windows?
- How to install FFMpeg on Mac?
- What Are The Uses of FFmpeg ?
- Video Processing
- Video compression
- Video Packaging Support
- Audio and Video Container Support
- How To Use FFMPEG?
- Getting File information from a video file
- Cut/Trim a video file
- Resize the video file
- Split a video into multiple parts
- Convert images into a video sequence
- Convert a video to x images
- Convert a video file from one format to another format
- Split a video into multiple parts
What is FFMPEG?
FFmpeg is a free and open-source software project consisting of different libraries and programs for handling video, audio, and other multimedia files and streams. FFMPEG is a command-line tool used for processing video and audio files. It is widely used for format video transcoding, basic editing (trimming and concatenation), video scaling, and video post-production effects.
Installing FFMPEG is fairly straightforward. You can head to this link to download from gyan.dev.
For a much detailed installation guide, you can see the instructions in our blog on setup and install FFMPeg on Windows.
You can even watch this video and follow instructions on how to install FFMPEG on Windows.
How to install FFMpeg on Mac?
- Go to https://ffmpeg.org/download.html and click the Apple logo in the “Get packages & executable files” section.
2.Click “Static builds for macOS 64-bit”.
3.You’ll see two options for downloading ffmpeg. Choose the one with the shorter filename; this will look like ffmpeg-<versionNumber>.7z, where <versionNumber> is something like 4.3.1.
- When you extract the file and click on the file, you’ll see this message.
- You will have to go to the system preferences and go to the general tab
You can also install FFmpeg using homebrew on mac. This is the mac installation program using homebrew
brew install ffmpeg
What Are The Uses of FFmpeg ?
It is used for a wide range of tasks such as video transcoding, packaging,and video playback. Various software projects use FFmpeg and it’s libraries are currently the part of several software projects, such as VLC, YouTube, and more.
These are the popular use cases of FFmpeg:
Video Processing
You can use FFmpeg for video processing tasks such as denoising, rotation, extraction of frames, blurring, color conversion, letter-boxing, etc
Video compression
It provides excellent support for video compression. Its an open secret that most streaming companies use or have used FFmpeg for their production systems
Video Packaging Support
For OTT or eLearning platform providers or developers, FFmpeg also has complete support for packaging your videos in both HLS and MPEG-DASH protocols. It can also be configured to stream the videos using RTMP or other protocols.
VdoCipher empowers course creators, event organizers and broadcasters with secure video streaming, ensuring smooth playback globally.
Audio and Video Container Support
FFmpeg also has extensive support for containers and can be used to read, write, and convert between containers such as avi, mp4, mp3, wma, wav, ts, flv, mkv, and so many other obscure formats.
How To Use FFMPEG?
Getting File information from a video file
To access all the file information including metadata of a video you can use the following command.
Cut/Trim a video file
You can trim a video starting from a specific time using ffmpeg,To trim a video using ffmpeg use the following command.
ffmpeg -ss 00:00:05 -i sample.mp4 -to 00:00:10 -c:v copy -c:a copy trim_sample.mp4
-ss parameter:
This is used to seek the video to time from where you want to start the trimming.
-t parameter:
You can specify the duration of the required clip using the -t parameter.
-to parameter:
You can specify the end-time using the -to parameter.
Resize the video file
You can resize a video using the below command, -s is used to resize the video in below command.
ffmpeg -i sample.mp4 -s 640×480 -c:a copy resizedSample.mp4
Split a video into multiple parts
Using FFMPEG you can split a large video file into smaller parts. You can use below command to split a video
ffmpeg -i sample.mp4 -t 00:00:30 -c copy fragment1.mp4 -ss 00:00:30 -c copy fragment2.mp4
In the above command -t 00:00:59 represents a part that is created from the start of the video to the 30th second of the video. -ss 00:00:30 shows the starting time stamp for the video. It means that the 2nd part will start from the 30th second and will continue up to the end of the original video file.
Convert images into a video sequence
The below command will transform all the images in a directory to a video file.
ffmpeg -framerate 30 -i filename-%03d.jpg output.mp4
Convert a video to x images
The below command will generate images named image1.jpg, image2.jpg, etc, from a given video file. The following image formats are available: PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.
ffmpeg -i video.mpg image%d.jpg
Convert a video file from one format to another format
This command will convert a video file from one format to another.
ffmpeg -i sample.wmv-c:v libx264 sample.mp4
Crop a video file
FFMPEG provides a crop parameter for specific purposes.
ffmpeg -i sample.mp4 -filter:v “crop=out_w:out_h:x:y” output.mp4
- out_w is the width of the output rectangle
- out_h is the height of the output rectangle
- x and y specify the top left corner of the output rectangle
- output.mp4 is the output file
Resize a video
To resize a video to desired size you can use -vf parameter.
ffmpeg -i sample.mp4 -vf scale=320:240 sample.mp4
Extracting audio from a video file
Use the below command to extract audio from a video file.
ffmpeg -i sample.mp4 -vn -ab 128 audio.mp3
Here -vn is used to extract audio and -ab is used to save audio as a 128Kbps MP3 file. You can change the bitrate to 256Kbps or something else. Just change the value after -ab.
Mute audio in a video file
The below command will mute audio in a video file.
ffmpeg -i sample.mp4 -an mutesample.mp4
Adding Poster image to video file
Adding a poster image with FFMPEG is an easy task, The below command will add a poster to a video file.
ffmpeg -i video.mp4 -i image.png -map 1 -map 0 -c copy -disposition:0 attached_pic out.mp4
Add text subtitles to a video
Using FFMPEG it is easy to add subtitles to a video file. The below command will add subtitles to a video file.
ffmpeg -i input.mp4 -i subtitles.srt -c copy -c:s mov_text output.mp4
Basic conversion
With FFmpeg, you can easily convert videos file without worrying about picking the right format and container. FFmpeg automatically selects the right codec and container without any need to configure it.
Let’s say you want to convert an mp4 file to avi file, you can easily do so :
ffmpeg -i original.mp4 convert.webm
This command takes the mp4 file called original.mp4 and converts it to the WebM file called convert.webm. In this case, as WebM is a well-known video format, FFmpeg already knows which video and audio stream it supports and thus will convert the streams into a valid WebM file.
Although FFmpeg might not pick the right container you’d need every single time. In the case of containers such as Matroska, it might result in the converted file using the same codec. For example, let’s take this case.
ffmpeg -i original.mp4 output.mkv
Here the file might have the same codec as the original video, which in certain cases might not be what you want.
Changing the Quality of the Video File
With FFmpeg you can change the video bitrate and frame rate of the input file as well
You can use the following command to change the video bitrate of the output file to 64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
And use this command to restrict the frame rate of the output file to 30 fps:
ffmpeg -i input.avi -r 30 output.avi
You can also adjust the dimensions of your video using FFmpeg. The simplest way is to use a predetermined video size:
You can even change the dimensions of yout videos using FFmpeg, one of the ways it to use a standard video size
ffmpeg -i inital.mkv -c:a copy -s hd720 final.mkv
This changes the video to, 120×720, you can even change the width and height manuall as well.
ffmpeg -i inital.mkv -c:a copy -s 1280×720 final.mkv
This command acts the same as the earlier one, just be wary of the fact that width always comes before height.
Selecting your codecs
With FFmpeg, you can select any codec you want by using the -c flag. With this flag, you can set different codecs for different streams. So in case you want to set the audio stream to Vorbis, you can use the following command:
Ffmpeg -i original.mp4 -c:a libvoris convert.mkv
If you want to change the video stream along with the audio stream. You can do this as well. Here it’ll make a Matroska container with a VP9 video stream and Vorbis audio stream using this command:
Ffmpeg -i original.mp4 -c:v vp9 -c:a libvorbis convert.mkv
The command FFmpeg -codecs will print every codec FFmpeg knows about. The output will change according to the FFmpeg version you have.
Changing a single stream
More often than you’d like, the file you have is partially correct with only a single stream in the wrong format. It can be very time-consuming to re-encode the correct stream. FFmpeg can help with this situation:
At time there might be some cases where the file might have a single stream which is in the wrong format. Re-encoding it completely can be time consuming, at times like this ffmpeg comes to your rescue:
ffmpeg -i initial.webm -c:v copy -c:a flac final.mkv
This command takes the same video stream from initial.webm into final.mkv and encodes the audio stream into FLAC.
Changing a container
You can use the above command to allow you to use the same audio and video streams for the different container format without any need to additional encoding
ffmpeg -i initial.webm -c:av copy final.mkv
Conclusion
FFmpeg is a great library to have in your video processing and compression toolbox. FFmpeg has endless capabilities and being open-source, you are more than welcome to modify the source and extend it’s capabilities.
Supercharge Your Business with Videos
At VdoCipher we maintain the strongest content protection for videos. We also deliver the best viewer experience with brand friendly customisations. We’d love to hear from you, and help boost your video streaming business.
Free 30-day trial →