FFmpeg давно стал тем инструментом, который вроде бы знают все, но мало кто помнит точные команды наизусть. Это понятно - сам по себе он умеет столько всего, что документация занимает сотни страниц. Зато для повседневных задач (вытащить звук из видео, перегнать MKV в MP4, обрезать кусок ролика, уменьшить вес файла) хватает буквально полутора десятков команд. Эта статья - практический сборник того, что чаще всего нужно. Сначала установка на популярных дистрибутивах, потом разбор реальных сценариев конвертации с пояснениями, что именно делает каждый ключ.
Установка на Ubuntu, Debian и производных
В Ubuntu, Debian, Linux Mint, Pop!_OS, elementary OS и других дистрибутивах семейства Debian менеджер пакетов apt. FFmpeg есть в стандартных репозиториях, версия не самая свежая, но для большинства задач её хватает с запасом. Стандартный путь установки:
sudo apt update
sudo apt install ffmpeg
Проверить, что всё установилось и работает, можно командой получения версии:
ffmpeg -version
Эта команда выведет номер версии и длинный список флагов, с которыми собран бинарник. Список флагов полезен в редких случаях - например, когда нужно убедиться, что в сборку включён libfdk-aac или libx265. Если в выводе есть строка с --enable-libx264 и --enable-libmp3lame, значит большинство популярных кодеков на месте.
Если стандартная версия в репозиториях кажется слишком старой (на старых LTS-релизах Ubuntu бывает FFmpeg 4.x, а актуальная ветка уже 7.x), можно подключить PPA. Один из проверенных - savoury1/ffmpeg:
sudo add-apt-repository ppa:savoury1/ffmpeg6
sudo apt update
sudo apt install ffmpeg
После такой установки в системе окажется свежая версия со всеми последними фильтрами и поддержкой кодеков. Платой за это становится зависимость от внешнего репозитория, который теоретически может перестать обновляться.
Установка на Fedora, RHEL, CentOS Stream, Rocky Linux, AlmaLinux
В семействе Red Hat ситуация отличается. FFmpeg формально содержит код, лицензированный под GPL, и поэтому в стандартные репозитории корпоративных дистрибутивов не входит. Решением является подключение стороннего репозитория RPM Fusion, который как раз и поставляет такие пакеты.
Для Fedora установка выглядит так:
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install ffmpeg
Первые две команды добавляют сами репозитории RPM Fusion (free и nonfree), третья ставит непосредственно FFmpeg со всеми зависимостями. Подстановка $(rpm -E %fedora) автоматически подставит номер версии текущей Fedora, что удобно при работе на разных машинах.
Для RHEL, CentOS Stream, Rocky Linux и AlmaLinux подход похожий, но сначала нужно подключить ещё и EPEL:
sudo dnf install epel-release
sudo dnf install --nogpgcheck https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm
sudo dnf install --nogpgcheck https://mirrors.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-$(rpm -E %rhel).noarch.rpm
sudo dnf install ffmpeg
После установки проверка той же командой:
ffmpeg -version
Установка на Arch Linux, Manjaro, EndeavourOS
В Arch и его производных всё максимально просто. FFmpeg есть в основном репозитории, ставится одной командой:
sudo pacman -S ffmpeg
Arch отличается тем, что в репозитории всегда лежит свежая версия. Если хочется ещё свежее (например, ночную сборку с самыми последними фильтрами), можно поставить ffmpeg-git из AUR через любой AUR-хелпер:
yay -S ffmpeg-git
Для большинства задач это избыточно, но если занимаетесь чем-то экспериментальным вроде кодирования в AV1 на новейших версиях SVT-AV1, такой подход даёт доступ к последним улучшениям до их попадания в стабильные релизы.
Установка на openSUSE
В openSUSE Tumbleweed и Leap менеджер пакетов zypper. FFmpeg доступен через основной репозиторий и через дополнительный Packman, который содержит полную версию с большим набором кодеков:
sudo zypper addrepo -cfp 90 'https://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Tumbleweed/' packman
sudo zypper refresh
sudo zypper install ffmpeg
Если включить только основной репозиторий без Packman, можно столкнуться с тем, что в FFmpeg не будет поддержки некоторых проприетарных кодеков. Packman решает этот вопрос радикально.
Установка на Alpine Linux
Alpine использует менеджер apk, очень распространён в Docker-образах. Установка лаконичная:
sudo apk add ffmpeg
В минимальных Docker-образах с Alpine это часто единственный вариант получить FFmpeg, и работает он отлично. Версия обычно свежая, потому что в Alpine быстрая ротация пакетов.
Базовый принцип работы FFmpeg в терминале
Прежде чем переходить к конвертациям, стоит запомнить общую схему. Любая команда FFmpeg в общем виде выглядит так:
ffmpeg [глобальные опции] -i входной_файл [опции вывода] выходной_файл
Ключевые опции, которые встречаются практически везде:
- -i указывает входной файл (можно несколько, для каждого свой -i);
- -c:v задаёт кодек видео (libx264, libx265, libvpx-vp9 и так далее);
- -c:a задаёт кодек аудио (libmp3lame, aac, libopus);
- -b:v и -b:a задают битрейт видео и аудио соответственно;
- -vn убирает видео из выходного файла;
- -an убирает аудио из выходного файла;
- -ss задаёт точку начала обработки во времени;
- -t задаёт длительность обработки;
- -y разрешает перезапись выходного файла без вопросов.
FFmpeg часто умеет сам определить нужный кодек по расширению выходного файла. Если на выходе указать audio.mp3, он поймёт, что нужен MP3-энкодер, даже без явного указания -c:a libmp3lame. Это удобно для быстрых операций, но в скриптах лучше указывать кодеки явно для предсказуемости.
Извлечение аудио из видео (MP4 в MP3)
Самая частая задача - вытащить звук из видеофайла. Минимальная команда:
ffmpeg -i input.mp4 output.mp3
FFmpeg сам определит, что нужно убрать видеопоток и переконвертировать аудио в MP3 с битрейтом по умолчанию (обычно 128 kbps). Этого достаточно для подкастов и большинства разговорного контента. Если нужно явно контролировать качество, добавляются параметры:
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3
Здесь -vn выключает видеопоток (чтобы FFmpeg не тратил время на его декодирование), -c:a libmp3lame явно указывает использовать качественный энкодер LAME, -b:a 192k задаёт битрейт 192 kbps. Для музыки этого обычно более чем достаточно, для аудиокниг и подкастов хватит и 96k.
Если хочется максимально гибкий вариант с переменным битрейтом (VBR), используется опция -q:a:
ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
Значение -q:a варьируется от 0 (лучшее качество, больший размер) до 9 (худшее качество, меньший размер). Значение 2 даёт хорошее соотношение качества и размера, выходной файл получается заметно компактнее, чем при фиксированном битрейте 192k, при сравнимом качестве.
Если аудио в исходном файле уже в нужном формате и хочется просто извлечь его без перекодирования (это в десятки раз быстрее), используется -acodec copy:
ffmpeg -i input.mp4 -vn -acodec copy output.aac
Внимание - расширение выходного файла должно соответствовать реальному формату аудио в контейнере. Если в MP4 лежит AAC-аудио, на выходе нужен .aac или .m4a, но не .mp3. Узнать, что лежит внутри, можно командой:
ffmpeg -i input.mp4
Она ничего не сделает (потому что не указан выходной файл), но напечатает информацию о потоках, включая кодеки аудио и видео.
Конвертация видео между контейнерами и кодеками
Перевод MKV в MP4 без перекодирования (если кодеки внутри уже совместимы с MP4):
ffmpeg -i input.mkv -c:v copy -c:a copy output.mp4
Опция copy для обоих потоков говорит FFmpeg просто переупаковать данные в новый контейнер без их декодирования и повторного кодирования. Операция занимает секунды независимо от длительности видео. Работает, если кодеки уже подходят (H.264 + AAC обычно совместимы с MP4, а вот VP9 + Vorbis из WebM не пойдут).
Если кодеки несовместимы или нужно сменить кодек, добавляется явное перекодирование:
ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4
Параметр -crf (Constant Rate Factor) для x264 принимает значения от 0 до 51, где 0 это lossless-кодирование (огромный файл), 23 это значение по умолчанию (визуально близкое к оригиналу), а значения выше 28 уже дают заметную потерю качества. Разумные значения для большинства случаев - от 18 (почти неотличимо от оригинала) до 26 (умеренная компрессия). Параметр -preset управляет тем, насколько усердно энкодер старается оптимизировать сжатие. Возможные значения от ultrafast до veryslow, по умолчанию medium. Чем медленнее preset, тем меньше получается файл при том же CRF, но дольше идёт обработка.
Для современного HEVC (H.265) команда аналогична, но другой кодек:
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a copy output.mp4
H.265 даёт файлы примерно вдвое меньше, чем H.264 при сравнимом качестве, но требует больше времени на кодирование и не везде поддерживается аппаратно. Параметр -crf для H.265 имеет другую шкалу - значение 28 для H.265 примерно соответствует 23 для H.264.
Для конвертации в WebM с современным VP9-кодеком:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 32 -b:v 0 -c:a libopus -b:a 128k output.webm
Параметр -b:v 0 в сочетании с -crf переключает VP9 в режим качества вместо режима фиксированного битрейта. Это рекомендованный способ кодирования VP9 для веба.
Конвертация аудио между форматами
Перегон WAV в MP3 с высоким качеством:
ffmpeg -i input.wav -c:a libmp3lame -b:a 320k output.mp3
Значение 320k это максимально возможный битрейт для MP3, выше уже бессмысленно. Для большинства треков 192k или 256k неотличимы на слух.
WAV в FLAC (lossless сжатие, файл примерно вдвое меньше WAV без потерь):
ffmpeg -i input.wav -c:a flac output.flac
FLAC в MP3:
ffmpeg -i input.flac -c:a libmp3lame -q:a 0 output.mp3
MP3 в OGG Vorbis:
ffmpeg -i input.mp3 -c:a libvorbis -q:a 6 output.ogg
WAV в современный Opus, который при том же размере звучит значительно лучше MP3:
ffmpeg -i input.wav -c:a libopus -b:a 96k output.opus
Opus при 96 kbps звучит примерно как MP3 при 192 kbps, и это не маркетинг, а вполне измеримый факт. Для подкастов, аудиокниг и любого контента, который слушают через современные плееры, Opus оптимален.
Обрезка и склейка файлов
Вырезать кусок видео с 1 минуты 30 секунд длиной 2 минуты:
ffmpeg -i input.mp4 -ss 00:01:30 -t 00:02:00 -c copy output.mp4
Параметр -ss указывает точку начала, -t - длительность. Использование -c copy делает операцию быстрой, но точность обрезки ограничена ключевыми кадрами. Если нужна точность до миллисекунды, нужно перекодировать:
ffmpeg -i input.mp4 -ss 00:01:30.500 -t 00:02:00 -c:v libx264 -crf 23 -c:a aac output.mp4
Склейка нескольких видеофайлов одного формата делается через специальный concat-протокол. Сначала готовится текстовый файл со списком:
cat > files.txt << EOF
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
EOF
Затем сама склейка без перекодирования:
ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4
Способ работает только если все файлы имеют одинаковые параметры (кодек, разрешение, частота кадров). Если параметры отличаются, придётся перекодировать с фильтром concat, что заметно медленнее.
Изменение размера и частоты кадров видео
Уменьшение разрешения до 720p с сохранением пропорций:
ffmpeg -i input.mp4 -vf scale=-2:720 -c:a copy output.mp4
Значение -2 говорит FFmpeg вычислить ширину автоматически так, чтобы она была чётным числом и сохраняла исходные пропорции. Для строгого 1280x720:
ffmpeg -i input.mp4 -vf scale=1280:720 -c:a copy output.mp4
Изменение частоты кадров до 30 FPS:
ffmpeg -i input.mp4 -r 30 -c:a copy output.mp4
Комбинация - уменьшение разрешения и FPS одновременно:
ffmpeg -i input.mp4 -vf scale=-2:720 -r 30 -c:v libx264 -crf 23 -c:a copy output.mp4
Извлечение кадров и создание GIF
Сохранить кадры видео как картинки (по одной картинке в секунду):
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
Подстановка %04d создаст файлы frame_0001.png, frame_0002.png и так далее.
Один кадр в определённый момент времени:
ffmpeg -i input.mp4 -ss 00:00:15 -vframes 1 thumbnail.jpg
Создание GIF из куска видео с приемлемым качеством делается в два прохода (для палитры):
ffmpeg -i input.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i input.mp4 -i palette.png -filter_complex "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
Двухпроходный способ через генерацию палитры даёт GIF в несколько раз лучшего качества, чем простое преобразование. Без палитры GIF выходит зернистым и с грязными цветами.
Регулировка громкости и нормализация звука
Усилить громкость в два раза:
ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3
Уменьшить громкость наполовину:
ffmpeg -i input.mp3 -filter:a "volume=0.5" output.mp3
Нормализация громкости по стандарту EBU R128 (то, что используется на радио и стриминговых сервисах):
ffmpeg -i input.mp3 -filter:a loudnorm=I=-16:LRA=11:TP=-1.5 output.mp3
Параметры I=-16 (integrated loudness), LRA=11 (loudness range), TP=-1.5 (true peak) соответствуют стандартам для подкастов. Для музыкальных сервисов используются другие значения (обычно I=-14).
Захват рабочего стола и веб-камеры
Запись всего экрана в Linux через X11:
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -c:v libx264 -preset ultrafast -crf 23 screen.mp4
Если в системе используется Wayland, x11grab не сработает - нужны другие подходы через wf-recorder или pipewire. Это уже выходит за рамки базового FFmpeg.
Запись с веб-камеры на /dev/video0 со звуком:
ffmpeg -f v4l2 -i /dev/video0 -f pulse -i default -c:v libx264 -preset ultrafast -c:a aac webcam.mp4
Эти команды работают в большинстве дистрибутивов с PulseAudio или PipeWire. Список доступных видеоустройств можно получить так:
v4l2-ctl --list-devices
Несколько практических привычек
Опыт повседневной работы с FFmpeg показывает несколько приёмов, которые экономят время:
- Перед длинной операцией над важным файлом стоит проверить команду на небольшом куске. Параметры -ss 0 -t 10 в начале команды ограничат обработку первыми десятью секундами, и можно убедиться, что результат именно тот, что нужен;
- При пакетной обработке нескольких файлов разумно завернуть FFmpeg в простой shell-цикл. Например, конвертировать все MP4 в текущем каталоге в MP3 одной строкой - for f in *.mp4; do ffmpeg -i "$f" -vn -q:a 2 "${f%.mp4}.mp3"; done;
- Опция -hide_banner убирает длинную шапку с информацией о версии и сборке, оставляя только полезный вывод о ходе обработки. Удобно для скриптов и парсинга вывода;
- Опция -loglevel error скрывает прогресс-бар и обычные сообщения, оставляя только ошибки. Полезно в CI-пайплайнах и скриптах, где избыточный вывод мешает;
- При работе с большими файлами полезен флаг -threads 0, который разрешает FFmpeg использовать все доступные ядра процессора для кодирования. По умолчанию он и так часто использует многопоточность, но явное указание гарантирует поведение;
- Если перекодирование занимает много времени, имеет смысл добавить опцию -progress pipe:1, которая выводит прогресс в более удобном для парсинга формате, чем стандартный.
FFmpeg на первый взгляд выглядит сложно из-за обилия опций и фильтров, но повседневные задачи решаются примерно тем набором команд, что разобран выше. Освоить эти полтора десятка вариантов один раз - и потом годами не нужно лезть в документацию для типичной обработки медиа. Для нестандартных случаев всегда остаётся официальная документация на ffmpeg.org, которая, при всей своей объёмности, очень детальна и содержит примеры почти на любой вообразимый сценарий.