FFmpeg пугает количеством ключей, но девяносто процентов повседневных задач решается десятком шаблонов: заменить контейнер, уменьшить битрейт, вытащить звук, обрезать фрагмент. Если понимать разницу между кодеком и контейнером, команды перестают быть магией. Ниже — проверенные рецепты с пояснениями, когда перекодирование действительно нужно, а когда достаточно копирования потоков.
Контейнер, кодек и главное правило
MP4, MKV и WebM — контейнеры, упаковка для видеопотока, аудио и субтитров. Внутри может лежать H.264, H.265, AV1, AAC или Opus. Смена контейнера не требует перекодирования, если кодеки совместимы; само перекодирование всегда меняет картинку и занимает время.
Не масштабируйте видео вверх и не указывайте битрейт наугад. Для архива удобен режим постоянного качества CRF: кодер сам распределяет биты между простыми и сложными сценами. Битрейт фиксируют для стриминга или требований площадки.
Анализ файла до конвертации
ffprobe показывает кодеки, разрешение, частоту кадров, битрейт и длительность. Эти данные определяют, можно ли обойтись копированием потоков и какой уровень качества разумен.
ffprobe -v error -show_entries format=duration,bit_rate:stream=index,codec_type,codec_name,width,height,r_frame_rate -of default=noprint_wrappers=1 input.mkv
Смотрите на частоту кадров: 23.976, 25 и 29.97 — норма. При переменном frame rate стоит привести его к постоянному фильтром fps, иначе возможны рывки в плеере.
Remux: смена контейнера без потери качества
Когда кодеки уже подходят, достаточно перепаковать файл. Ключ -c copy копирует потоки без декодирования, поэтому операция выполняется за секунды и не портит картинку. Флаг +faststart переносит индекс MP4 в начало файла — это ускоряет старт воспроизведения в браузере.
ffmpeg -i input.mkv -map 0 -c copy -movflags +faststart output.mp4
Флаг -map 0 переносит все дорожки. Если контейнер не поддерживает часть кодеков, FFmpeg завершится с ошибкой: выберите потоки явно через -map 0:v:0 и -map 0:a:0. В WebM нельзя скопировать H.264 — нужен VP9 или AV1.
Сжатие H.264: CRF, preset и совместимость
H.264 остаётся самым совместимым вариантом: его понимают старые телевизоры, браузеры и мобильные устройства. Разумный диапазон CRF — от 18 до 28. Значение 20–23 даёт хороший баланс для домашнего архива, 26–28 заметно экономит место на второстепенном материале.
ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset slow -pix_fmt yuv420p -c:a aac -b:a 160k -movflags +faststart output.mp4
Параметр preset меняет скорость кодирования, а не качество напрямую: slow даёт меньший файл при том же CRF, но считает дольше. yuv420p нужен для совместимости с большинством плееров и площадок. Для 10-битного исходника преобразование в 8 бит может испортить градиенты — проверяйте такой материал отдельно.
H.265 и AV1: когда экономия оправдана
H.265 даёт примерно на 25–40 процентов меньший размер при сопоставимом качестве, но хуже поддерживается старой техникой и требует больше вычислительных ресурсов. AV1 ещё эффективнее, однако кодирование заметно медленнее, а совместимость зависит от браузера и аппаратного декодера.
ffmpeg -i input.mp4 -c:v libx265 -crf 26 -preset slow -tag:v hvc1 -c:a aac -b:a 160k output-hevc.mp4
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 32 -preset 6 -c:a libopus -b:a 128k output-av1.mkv
Шкалы CRF у кодеков не совпадают: CRF 26 для x265 примерно соответствует 20–21 у x264, а для SVT-AV1 ориентируйтесь на 30–35. Тег hvc1 помогает технике Apple распознавать H.265 в MP4. Перед массовой конвертацией проверьте двухминутный фрагмент.
Аппаратное кодирование: скорость против качества
VAAPI, NVENC и Quick Sync работают в разы быстрее программного x264, но при одинаковом битрейте обычно проигрывают в детализации. Их смысл — быстрый экспорт черновиков, запись экрана и обработка больших объёмов, где важнее время.
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i input.mp4 -vf scale_vaapi=w=1920:h=1080 -c:v h264_vaapi -qp 22 -c:a copy output-vaapi.mp4
Команда предполагает, что драйвер VAAPI уже работает: проверьте его через vainfo. Для NVIDIA используется h264_nvenc или hevc_nvenc с параметром -cq. Часть программных фильтров заставит скачивать кадр в память и сведёт выигрыш к нулю.
Извлечение и обработка звука
Если звук уже в нужном кодеке, достаточно -vn и копирования. Когда нужен MP3 для старого плеера или нормализация громкости, поток придётся перекодировать. Однопроходный loudnorm подгоняет громкость под целевой уровень, но для точной работы лучше двухпроходный режим.
ffmpeg -i video.mp4 -vn -c:a copy audio.m4a
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 audio.mp3
ffmpeg -i video.mp4 -vn -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:a aac -b:a 192k normalized.m4a
Для речи хватает 96–128 kbps AAC или Opus, для музыки — 192 kbps и выше. Копирование AAC в M4A сохраняет качество и занимает секунды.
Обрезка, склейка и субтитры
При обрезке без перекодирования ключевой кадр может оказаться раньше указанной секунды, поэтому начало сдвинется. Для точного монтажа с перекодированием ставьте -ss после -i: FFmpeg декодирует от начала и обрежет кадр в кадр, но потратит больше времени.
ffmpeg -ss 00:01:20 -i input.mp4 -t 30 -c copy clip.mp4
printf "file '%s'\n" part1.mp4 part2.mp4 > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy joined.mp4
Склейка через concat требует одинаковых кодеков, разрешения и параметров звука. Если файлы различаются, сначала приведите их к общему виду, иначе получите рассинхронизацию. Встроенные субтитры можно перенести копированием или вжечь фильтром subtitles, а для кадра-обложки достаточно -frames:v 1.
Пакетная обработка и проверка результата
Цикл по файлам экономит время, но должен быть безопасным: флаг -n запрещает перезапись существующих файлов, а каталог назначения создаётся заранее. Имена с пробелами обязательно заключайте в кавычки.
mkdir -p done
for f in *.mkv; do ffmpeg -n -i "$f" -c:v libx264 -crf 22 -preset medium -c:a aac -b:a 160k "done/${f%.mkv}.mp4"; done
После пакета сравните размер и проверьте несколько файлов через ffprobe. Если сборка содержит libvmaf, оцените качество метрикой VMAF: падение ниже 90 обычно заметно на деталях.
Чек-лист
- Сначала ffprobe, потом решение о копировании или перекодировании.
- Для архива — CRF, для площадки — заданный битрейт и совместимый профиль.
- Разрешение не увеличивается, стороны кадра остаются чётными.
- Звук копируется, если кодек подходит; иначе выбирается разумный битрейт.
- Перед пакетной обработкой проверен короткий фрагмент.
- Результат открыт в другом плеере, проверены длительность и синхронизация.
Итог
FFmpeg удобно воспринимать как набор из четырёх операций: анализ, перепаковка, перекодирование и извлечение дорожек. Начните с ffprobe, используйте -c copy везде, где это возможно, а CRF подбирайте на коротком тесте. Такой подход даёт предсказуемый размер файлов и сохраняет качество там, где перекодирование не требуется.