FFmpeg Media Encoder: как кодировать видео и аудио через FFmpeg

Ошибка Unknown encoder 'libx264' при запуске FFmpeg означает, что сборка скомпилирована без поддержки нужного кодировщика — проверить список доступных энкодеров можно командой ffmpeg -encoders до того, как начинать конвертацию. Именно с такой диагностики стоит начинать любую работу с FFmpeg Media Encoder: сначала убедиться, что нужный кодек и обёртка присутствуют в вашей сборке, и только потом строить команду кодирования.

FFmpeg — это кроссплатформенный набор библиотек и консольная утилита для записи, конвертации и потоковой передачи аудио и видео. Термином «media encoder» в контексте FFmpeg обычно называют связку из энкодера (кодека, сжимающего поток) и муксера (контейнера, упаковывающего результат). Ниже разберём, как выбрать энкодер, задать качество, использовать аппаратное ускорение и что делать при типичных сбоях.

Что такое энкодер в FFmpeg и как он устроен

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

Энкодеры в FFmpeg делятся на две группы: встроенные (native), например aac или mpeg4, и обёртки над внешними библиотеками — libx264, libx265, libvpx-vp9, libopus. Внешние библиотеки должны быть подключены при компиляции, поэтому их наличие зависит от конкретной сборки. Проверить конфигурацию можно командой:

ffmpeg -hide_banner -encoders | findstr "264 265 vpx opus"

На Linux вместо findstr используется grep. Если нужного энкодера в списке нет, понадобится другая сборка FFmpeg — например, полная статическая сборка с официального сайта проекта.

Базовая команда кодирования

Минимальная команда перекодирования видео в H.264 с аудио AAC выглядит так:

ffmpeg -i input.mov -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

Разберём параметры. Флаг -i задаёт входной файл. Опция -c:v libx264 выбирает видеоэнкодер, -crf управляет качеством (меньше значение — выше качество и больше размер; типичный рабочий диапазон для x264 — примерно от 18 до 28), -preset регулирует баланс скорости и степени сжатия. Аудиодорожка кодируется в AAC с битрейтом 128 кбит/с.

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

ffmpeg -i input.mkv -c copy output.mp4
  • 🎬 -c:v — выбор видеоэнкодера (libx264, libx265, libvpx-vp9)
  • 🎧 -c:a — выбор аудиоэнкодера (aac, libopus, libmp3lame)
  • ⚙️ -crf — режим постоянного качества для видео
  • 📦 -c copy — копирование потоков без перекодирования
📊 Для какой задачи вы чаще всего используете FFmpeg?
Конвертация видео в другой формат
Сжатие видео для экономии места
Извлечение или замена аудиодорожки
Запись и стриминг

Выбор кодека: H.264, H.265, VP9 и AV1

Выбор энкодера зависит от того, где будет воспроизводиться результат. H.264 (libx264) — самый совместимый вариант: его аппаратно декодирует практически любое устройство. H.265/HEVC (libx265) при том же качестве даёт файл заметно меньшего размера, но кодируется медленнее и поддерживается не всюду. VP9 и AV1 (libvpx-vp9, libaom-av1, libsvtav1) ориентированы на веб и открытые платформы.

КодекЭнкодер FFmpegСовместимостьЭффективность сжатия
H.264libx264МаксимальнаяБазовая
H.265 (HEVC)libx265Современные устройстваВыше H.264
VP9libvpx-vp9Браузеры, AndroidСопоставима с HEVC
AV1libaom-av1 / libsvtav1Новые устройства и браузерыОдна из самых высоких
⚠️ Внимание: поддержка HEVC и AV1 зависит от устройства воспроизведения. Перед массовым перекодированием архива проверьте результат на целевом плеере или телевизоре — иначе можно получить файлы, которые не откроются.

Для аудио универсальный выбор — AAC для контейнера MP4 и Opus для MKV/WebM. Opus при низких битрейтах звучит заметно лучше MP3, но старая техника может его не воспроизводить.

Управление качеством и битрейтом

Существует два принципиальных подхода: режим постоянного качества (-crf) и режим заданного битрейта (-b:v). CRF удобен для архива и домашнего использования — энкодер сам распределяет биты между сценами. Жёсткий битрейт нужен, когда есть лимит канала или размера, например для стриминга или загрузки на площадку с ограничениями.

Двухпроходное кодирование (2-pass) даёт более точное попадание в целевой битрейт:

ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -an -f null NUL

ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 128k output.mp4

На Linux вместо NUL указывается /dev/null. Первый проход анализирует видео и пишет статистику в лог-файл, второй — кодирует с учётом этих данных.

Аппаратное ускорение кодирования

Программные энкодеры вроде libx264 полностью нагружают процессор. Если в системе есть совместимый GPU, можно использовать аппаратные энкодеры: h264_nvenc и hevc_nvenc для NVIDIA, h264_qsv для Intel Quick Sync, h264_amf для AMD, h264_videotoolbox на macOS. Наличие конкретного энкодера зависит от сборки FFmpeg и драйверов — проверяйте через ffmpeg -encoders.

ffmpeg -i input.mp4 -c:v h264_nvenc -preset p5 -cq 23 -c:a copy output.mp4

Аппаратное кодирование работает в разы быстрее, но при одинаковом битрейте качество обычно уступает программному x264/x265. Для быстрых задач — транскодирования «на лету», стриминга, черновых превью — это оправданный компромисс. Для финального архивного мастера программный энкодер предпочтительнее.

⚠️ Внимание: ошибка вида «Cannot load» или «No capable devices found» при вызове NVENC/AMF/QSV чаще всего означает устаревший драйвер GPU или отсутствие поддержки нужного кодека в самой видеокарте. Обновите драйвер с сайта производителя и сверьте возможности чипа с его официальной спецификацией.

☑️ Проверка перед аппаратным кодированием

Выполнено: 0 / 4

Типичные ошибки и их решение

Разберём сбои, с которыми чаще всего сталкиваются при работе с FFmpeg Media Encoder. Важно читать полный текст ошибки в консоли — последние строки вывода обычно содержат конкретную причину.

  • 🔍 Unknown encoder — энкодер отсутствует в сборке; установите полную версию FFmpeg или выберите доступный аналог
  • 📉 Conversion failed без деталей — запустите команду с флагом -v verbose для расширенного лога
  • 🧩 Invalid argument — несовместимость кодека и контейнера, например VP9 нельзя упаковать в AVI
  • ⏱️ Рассинхрон аудио и видео — попробуйте добавить -async 1 или перекодировать звук вместо копирования

Отдельный случай — повреждённые исходники. Если входной файл содержит битые кадры, FFmpeg может останавливаться посередине. Проверить целостность можно командой ffmpeg -v error -i input.mp4 -f null -: она декодирует файл и выводит только ошибки, не создавая результата.

Почему FFmpeg «не видит» файл по пути с кириллицей или пробелами

Заключайте путь в кавычки: ffmpeg -i "C:\Видео\мой файл.mp4" out.mp4. В некоторых окружениях также помогает запуск из терминала с корректной кодировкой (chcp 65001 в Windows) или переименование файла латиницей.

Практические сценарии: извлечение аудио, нарезка, изменение разрешения

Энкодер пригодится не только для полной конвертации. Вот несколько частых задач. Извлечение звуковой дорожки в MP3:

ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 4 audio.mp3

Уменьшение разрешения до 1280 пикселей по ширине с сохранением пропорций (значение -2 подбирает чётную высоту автоматически):

ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 -crf 23 -c:a copy output.mp4

Вырезать фрагмент без перекодирования можно так: ffmpeg -ss 00:01:30 -to 00:02:45 -i input.mp4 -c copy clip.mp4. Учтите, что при копировании потока нарезка происходит по ключевым кадрам, поэтому границы фрагмента могут немного смещаться. Для покадровой точности уберите -c copy и перекодируйте фрагмент.

Часто задаваемые вопросы

Чем отличается кодек от контейнера?

Кодек (H.264, AAC, AV1) — это алгоритм сжатия потока, а контейнер (MP4, MKV, WebM) — обёртка, объединяющая видео, аудио и субтитры в один файл. Один и тот же кодек может находиться в разных контейнерах, и не каждый контейнер принимает любой кодек.

Какое значение CRF выбрать для libx264?

Диапазон 18–28 считается рабочим: 18 — почти без визуальных потерь, 23 — значение по умолчанию, 26–28 — заметное сжатие с умеренной потерей качества. Оптимум подбирается экспериментально на коротком тестовом фрагменте.

Почему аппаратный энкодер даёт файл хуже по качеству при том же битрейте?

Аппаратные энкодеры (NVENC, QSV, AMF) оптимизированы под скорость и используют упрощённые алгоритмы анализа кадра. При ограниченном битрейте это даёт менее эффективное сжатие, чем у программных x264/x265. Компенсировать можно повышением битрейта или выбором более качественного пресета энкодера.

Можно ли кодировать видео без потери качества?

Да, у libx264 есть режим -crf 0 (lossless), а также существуют специальные кодеки вроде FFV1. Однако размер таких файлов очень велик. На практике CRF 16–18 визуально неотличим от оригинала при существенно меньшем объёме.

FFmpeg выдаёт ошибку при упаковке HEVC в MP4 — что делать?

Проверьте, что используется актуальная версия FFmpeg, и при необходимости добавьте параметр -tag:v hvc1 — он повышает совместимость HEVC-видео в MP4 с рядом плееров и устройств Apple. Альтернатива — контейнер MKV, который принимает HEVC без дополнительных тегов.