Практическое руководство по FFmpeg

Описание пакета FFmpeg и практических примеров его использования.

FFmpeg — это набор библиотек и утилит, (в основном) предназначенных для обработки видео, аудио и графических файлов. Пакет свободно распространяется в бинарном виде и в исходных кодах. На момент публикации данной статьи бинарные пакеты были доступны для платформ Linux, Windows и macOS. На базе библиотек FFmpeg построено множество свободных (например, VLC и HandBrake) и коммерческих (например, Гугл Хром и Ютуб) систем.

И, все-таки, почему FFmpeg?

Мои потребности совсем невелики:
  1. Вырезать фрагменты из существующего видео материала.
  2. Комбинировать их несложным образом.
  3. Добавлять небольшое количество собственного контента.
  4. Приводить результат в стандартный вид.
  5. По-возможности все это делать без особых усилий.

Описываемая процедура называется видеомонтаж, с технической стороны она в значительной степени стандартизирована и ее умеет делать практический любой пакет подобного направления, свободный или коммерческий. Однако раз за разом я упирался в невозможность выполнить самые тривиальные операции или это требовало таких усилий, что я предпочитал их избегать. Все стандартно еле шевелилось и постоянно валилось. Визуальные редакторы требовали напряжения сил, совершенно несоразмерных полученному результату.

Надо отметить, что в обсуждениях ссылки на FFmpeg (чаще на Libav, но это одно и то же, см. подраздел «FFmpeg против Libav» ниже) появлялись с завидной регулярностью. Вначале отсутствие графического интерфейса FFmpeg/Libav мне казалось неустранимым препятствием, тем более, что большинство использованных мной утилит все равно базировались на одном из этих пакетов. Зачем пользоваться чем-то базовым и сложным, если работу уже сделали до меня?

Я потратил массу времени и сил, чтобы освоить десятки кривых пакетов. Примерно год назад я перестал парить мозги и наконец-то занялся FFmpeg. Первое время это вызывало жуткую головную боль. Моя статья как раз предназначена для тех, кто пойдет по тому же пути, что и я.

Дополнение. Вводная статья о FFmpeg с сайта Softpedia (РАСКРЫТЬ)

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

FFmpeg предназначена для сравнительно небольшой группы пользователей из-за ее сложности и отсутствия удобного пользовательского интерфейса. Хотя она, по факту, является аудио/видео конвертером, FFmpeg достаточно далека от того типа программного обеспечения, к которому привыкли пользователи.

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

Но как только вы потеряли интерес к программному обеспечению, которое не делает ничего полезного, кроме предоставления пользовательского интерфейса, так FFmpeg сразу становится угрозой. Функциональность многих популярных пакетов жестко ограничена немногими предопределенными сценариями и они проигрывают при сравнении с FFmpeg. Хотя FFmpeg определенно рассчитана на фриков командной строки, которые желают держать под контролем весь процесс обработки медиафайлов, тратя громадное время на подбор параметров и создание сценариев работы в различных ситуациях.

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

Источник: Alexandru Pintilie (ed.), FFmpeg, Softpedia, 2021.
[Перевод (с небольшими сокращениями) мой.]

Что умеет FFmpeg?

  • Автоматически распознавать форматы медиа файлов.
  • Для контейнерных форматов, таких как видео файлы, извлекать их элементы (например, изображение, звук и субтитры) и оперировать ими как отдельными потоками.
  • Вырезать фрагменты видео и аудио с точностью до кадра/сэмпла (если вы не знакомы с этой проблемой, то удивитесь, какой редкостью является такая возможность).
  • Применять фильтры к видео и аудио, такие как видео масштабирование, изменение яркости и громкости, добавление эффекта затухания и многие-многие другие. На настоящий момент в стандартной библиотеке FFmpeg имеется около 400 различных фильтров.
  • Комбинировать потоки различными способами: соединять последовательно один за другим, возможно с различными эффектами перехода, накладывать один на другой в определенную пространственную и временную позицию и прочие.
  • Преобразовать видео в набор графических файлов (или в GIF формат) и обратно.
  • Создавать видео, аудио и графические файлы в заданном формате, используя промежуточные результаты обработки.
  • И еще многое другое.

Содержимое бинарного пакета

  • ffmpeg.exe — основная утилита, предназначенная для обработки файлов как описано в предыдущем подразделе.
  • ffplay.exe — медиаплеер с возможностями, специфичными для FFmpeg.
  • ffprobe.exe — утилита для анализа и отображения структуры и параметров медиа файлов.
  • вспомогательные файлы.

Простейший пример

Проблема заключалась в том, что основные видео редакторы и возможности HTML не позволяют создать эффект окантовки вокруг букв. Однако такая возможность имеется в формате субтитров .ASS. Как справиться с задачей?
  1. Создаем файл субтитров с помощью пакета Aegisub.
  2. Налагаем созданные субтитры на графический файл с помощью FFmpeg.

Сложный пример

Все выполняется с помощью FFmpeg.
  1. Создаем из набора картинок анимацию няшки (см. начало видео).
  2. В конце анимации няшки делаем эффект затухания.
  3. Комбинируем анимацию няшки с графическим файлом, содержащим текст приглашения.
  4. Вырезаем из исходных видео файлов 1-секундные клипы.
  5. Подправляем их палитру так, чтобы они смотрелись одинаково хорошо.
  6. Собираем из клипов видео последовательность, при этом располагая каждый из них в своей части экрана.
  7. Создаем переходную анимацию между завершением анимации няшки и первым кадром последовательности клипов.
  8. Собираем общее видео в разрешении 4K и добавляем музыкальное сопровождение.

Установка FFmpeg

В данной статье обсуждение будет ограничено бинарным пакетом FFmpeg и операционной системой Windows 10. Тестировались версии пакета 4.3.1, 4.3.2 и 4.4. Исполнение FFmpeg утилит всегда производится или из командной строки Far Manager, или с помощью командного файла в формате Windows, запускаемого в Far Manager, или из среды Far Manager.

Установка пакета

  1. Идем на сайт FFmpeg.
    Нажимаем кнопку «Download».
    Пролистываем вниз до секции «Get packages & executable files».
    Нажимаем кнопку, на которой нарисована «Windows» картинка.
    В секции «Windows EXE Files» переходим по ссылке «Windows builds from gyan.dev».
    Скачиваем пакет «ffmpeg-release-full.7z».
  2. Создаем каталог в любом удобном месте у себя на компьютере. В дальнейшем мы будем считать, что это «C:\Bin».
  3. Копируем в созданный каталог файлы «ffmpeg.exe», «ffplay.exe» и «ffprobe.exe» из «ffmpeg-release-full.7z».
  4. Копируем файл «C:\Windows\Fonts\calibri.ttf» (или любой другой файл шрифтов по вашему усмотрению) в тот же каталог, он позже понадобится.

Версии бинарных пакетов

Бинарные пакеты FFmpeg могут компилироваться в разных вариантах. В некоторых случаях вы видите описание конкретной возможности в документации FFmpeg или ее обсуждение в специализированных блогах, но в вашем экземпляре бинарного пакета она будет отсутствовать. К сожалению, если возможность не включена в компиляцию, то FFmpeg полностью про нее «забывает» и вы скорее всего получите невнятное сообщение вроде «неизвестный параметр». Дальше вы должны угадать, то ли вы ошиблись в описании параметра, или его поддержка не была включена в компиляцию.

В FFmpeg имеется обширный набор опций для отображения списков поддержанных возможностей. Откройте раздел документации «5.2 Generic options» и ищите там слова «print» и «show».

🗈
Здесь и далее мы будем ссылаться на нумерацию разделов по документу ffmpeg-all «ffmpeg Documentation».

Дополнительные пакеты

Ни один из них не является принципиально необходимым — так, чтобы без какого-то из них FFmpeg не был способен исполнять свои собственные операции. Для выполнения дополнительных действий вы можете использовать как пакеты из списка ниже, так и те, которые вам более удобны и привычны. Также отсутствует необходимость в каких-то специальных настройках Windows.
  • Far Manager — консольный файловый менеджер. Вместо него для запуска утилит и командных файлов вы можете воспользоваться, например, PowerShell.
  • VLC — видео плеер. Он вам прежде всего понадобится для независимой проверки исходных и выходных аудио/видео файлов, сохранения скриншотов «на лету» и для проверки синхронизации субтитров, где возможности FFplay не очень удобны.
  • Paint.NET — графический редактор. Независимая проверка графических файлов и вычисление некоторых вспомогательных параметров, например для определения размера черной зоны вокруг видео или для исправления палитры.
  • Aegisub — редактор субтитров. Кроме собственно работы с субтитрами он удобен для подбора параметров синхронизации звука.

Интеграция FFmpeg в Far Manager

Мы будем использовать 2 возможности:
  • При нажатии Alt-F3 показать параметры аудио, видео или графического файла.
  • Alt-F3 командная строка для всех групп:

    C:\Bin\ffprobe -hide_banner -v info "!.!" 2>&1 | more

    Пример вывода параметров видео файла «Сложного примера» выше:

    Input #0, matroska,webm, from 'Sakuga Affection - Invitation-v3.mkv':
    Metadata:
    ENCODER         : Lavf58.29.100
    Duration: 00:00:35.01, start: 0.000000, bitrate: 15455 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 3840x2160, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
    Metadata:
    ENCODER         : Lavc58.54.100 libx264
    DURATION        : 00:00:35.011000000
    Stream #0:1: Audio: aac (LC), 96000 Hz, stereo, fltp (default)
    Metadata:
    ENCODER         : Lavc58.54.100 aac
    DURATION        : 00:00:34.982000000

    Пример вывода параметров аудио файла:

    Input #0, flac, from '01 - Lum no Love Song.flac':
    Metadata:
    ALBUM           : Urusei Yatsura Complete Music Box CD 1 [KTCR-9018]
    ARTIST          : Yuuko Matsutani
    DATE            : 1994
    GENRE           : Anime
    TITLE           : Lum no Love Song
    track           : 01
    TOTALDISCS      : 15
    Duration: 00:02:42.00, start: 0.000000, bitrate: 919 kb/s
    Stream #0:0: Audio: flac, 44100 Hz, stereo, s16

    Пример вывода параметров графического файла «Простейшего примера» выше:

    Input #0, image2, from 'Angry girl.jpg':
    Duration: 00:00:00.04, start: 0.000000, bitrate: 12515 kb/s
    Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 380x640 [SAR 96:96 DAR 19:32], 25 tbr, 25 tbn, 25 tbc

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

  • При нажатии F3 проиграть (показать) аудио, видео или графический файл.
  • F3 командная строка для группы видео:

    C:\Bin\ffplay -v error -y 540 -seek_interval 1 -vf "drawtext=text='%{pts\:hms}':fontfile='C\:\\Bin\\calibri.ttf':fontsize=h/24:box=1:boxborderw=8:y=8" "!.!"

    F3 командная строка для группы аудио:

    C:\Bin\ffplay -v error -y 540 -f lavfi amovie="!.!",asplit[a][out1];[a]showcqt=axis_h=0[out0]

    F3 командная строка для группы графики:

    C:\Bin\ffplay -v error -y 540 -vf "drawtext=text='%{eif\:w\:d}x%{eif\:h\:d}':fontfile='C\:\\Bin\\calibri.ttf':fontsize=h/24:box=1:boxborderw=8:y=8" "!.!"

Откройте в Far Manager пункт меню Commands/File associations и поменяйте настройки Video, Audio и Image групп. Если у вас этих групп еще нет, создайте их (с помощью клавиши Ins).

Пример установок группы видео файлов в Far Manager

Не забудьте после завершения изменений сохранить настройки Far Manager с помощью Shift-F9.

Сравнение пакетов

FFmpeg против Libav

Большинство пользователей знакомо с Libav по его основной утилите avconv. Разработка пакета FFmpeg началась в 2000 году. В 2011-м часть команды отделилась, основав новый проект Libav, целью которого было кардинальное улучшение пользовательского интерфейса и качества кода. В 2015-м было принято решение об интеграции изменений, выполненных за прошедшие годы, в проект FFmpeg. Однако оно так и не воплотилось в реальность. В настоящий момент развитие проекта Libav практически полностью прекратилось.

На 2011 год проекты Libav и FFmpeg были идентичны по своим возможностям. Затем их разработка стала идти параллельно и в значительной степени независимо. На настоящий момент основные возможности Libav и FFmpeg продолжают совпадать. Однако:
  • FFmpeg с бо́льшей готовностью, чем Libav, исключал из своего пакета части по требованию правообладателей. В результате в стандартном бинарном пакете FFmpeg отсутствует поддержка некоторых возможностей, имеющихся в Libav.
  • В то же время темпы разработки новых возможностей FFmpeg были выше, чем у Libav, и ошибки исправлялись быстрей и с бо́льшей готовностью. В результате FFmpeg работает более надежно, в целом у него имеется больше возможностей и лучшая поддержка самых последних стандартов.
Информация приведена на основании статьи Википедии и обсуждений в специализированных блогах. Автор данной статьи не имеет существенного опыта работы с Libav и не может гарантировать достоверность вышеизложенного.

FFmpeg против MKVToolNix

  • С точки зрения основных возможностях FFmpeg позволяет сделать все то же, что и MKVToolNix, и несравненно больше.
  • Единственный выходной контейнер MKVToolNix — MKV (Матроска). Для исходных файлов MKVToolNix не имеет таких ограничений. FFmpeg поддерживает множество различных выходных контейнеров (например, AVI и MP4), включая Матроска.
  • MKVToolNix не умеет разрезать файлы на отрезки по времени, если они включают дорожки в популярном аудио формате FLAC. Любая конверсия такого видео может производиться только с целыми файлами.
  • MKVToolNix — активно развивающийся проект, исправляющий баги и поддерживающий самые последние возможности Матроска. FFmpeg поддерживает только основные возможности контейнера.
  • MKVToolNix гарантирует преобразование аудио и видео без потери качества. Работая с FFmpeg, вы должны предпринимать определенные усилия, не всегда очевидные для рядового пользователя, чтобы достичь того же эффекта.
  • MKVToolNix умеет разрезать дорожки субтитров по времени, FFmpeg — нет.
  • MKVToolNix имеет удобную графическую оболочку MKVToolNix GUI, в FFmpeg вы можете работать только из командной строки.

FFmpeg против HandBrake

  • HandBrake построен на базе FFmpeg и поэтому, теоретически, FFmpeg способен делать все то же, что и HandBrake, и несравненно больше. Однако код HandBrake содержит значительный know-how. Если вы не знаете, как достичь какого-то эффекта с помощью существующего пакета, его возможности для вас не представляют ценности.
  • Выходные файлы HandBrake практически всегда меньше по размеру, чем при использовании стандартных возможностей FFmpeg.
  • FFmpeg практически всегда выполняет быстрее (нередко в десятки и сотни раз) те же операции, что HandBrake.
  • HandBrake имеет удобную графическую оболочку, в FFmpeg вы можете работать только из командной строки.

Вторая часть статьи находится здесь.

Marple Mashu Marces AnimationОпубликовано 8 сентября 2020 г.
Последние изменения 1 марта 2021 г.