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 подбирайте на коротком тесте. Такой подход даёт предсказуемый размер файлов и сохраняет качество там, где перекодирование не требуется.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте