Одно и то же -crf 23 — а один ролик сжимается до 200 МБ, а другой до 100. Почему на форумах все пишут «CRF 23 — это дефолт», а у вас на 23 картинка получается мыльной? В этой статье разберём, как x264 управляет битрейтом через CRF, какие значения когда ставить, и в конце — шпаргалка, которую можно копировать целиком.
CRF — это не битрейт, а целевое качество
У FFmpeg два принципиально разных подхода к сжатию видео:
Постоянный битрейт (CBR): кодировщик выдаёт одинаковое количество бит каждую секунду — независимо от того, происходит ли в кадре взрыв или просто чёрный экран. На статике биты расходуются впустую, на динамике их не хватает и появляется блочность.
CRF (Constant Rate Factor): подход обратный — вы задаёте целевое качество, а кодировщик сам распределяет биты по сценам. Простая сцена получит меньше бит, сложная — больше. Итог: качество постоянное, размер файла плавает.
# CRF-режим: задаём качество, не битрейт
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# Для сравнения: CBR (как контраст — обычно не рекомендуется)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M output.mp4
Именно поэтому один и тот же -crf 23 даёт файлы в несколько раз разного размера для спортивной съёмки и для анимации — выход CRF зависит от содержимого. Это фича, а не баг.
Диапазон значений: меньше — резче, больше — меньше вес
У x264 CRF лежит в диапазоне 0–51, где 0 — математически без потерь, а 51 — смотреть невозможно. Каждое +6 примерно вдвое снижает битрейт, каждое −6 — удваивает:
| CRF | Восприятие | Когда использовать |
|---|---|---|
| 0 | Без потерь | Промежуточная обработка, мастер-копии |
| 16–18 | Визуально без потерь (разница видна только при покадровом сравнении) | Архивное хранение |
| 20–23 | Высокое качество, стандартный диапазон | Повседневное кодирование, публикация |
| 24–27 | Незначительная потеря, заметно меньше файл | Бэкап в облако, не критичный обмен |
| 28–35 | Видимые артефакты сжатия | Черновые превью |
| 36+ | Мыло | Практически нет разумных сценариев |
Дефолт x264 — 23. Если вы не указали ничего, FFmpeg использует -crf 23.
Цифры x265 нельзя копировать в x264 (и наоборот)
x265 (HEVC) тоже использует шкалу 0–51, но калибровка другая — x265 CRF 28 примерно соответствует x264 CRF 23. Если привычные значения x264 перенести на x265 как есть, получите файл заметно меньшего размера с ощутимо худшим качеством:
# Чтобы x265 выглядел как x264 -crf 23, ставьте примерно -crf 28
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
И наоборот: при переходе с x265 обратно на x264 уменьшайте значение примерно на 5.
Шпаргалка по сценариям
Если не хочется вникать — просто копируйте (для x264):
# Запись экрана / текстовый контент — текст страдает первым
ffmpeg -i input.mp4 -c:v libx264 -crf 18 output.mp4
# Повседневное сжатие — баланс качества и размера
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
# Нужно срочно уменьшить — терпимая потеря
ffmpeg -i input.mp4 -c:v libx264 -crf 28 output.mp4
# Не спешим, нужен минимальный размер при том же качестве
ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset veryslow output.mp4
Практический совет: сначала подберите подходящий CRF с -preset fast, а на финальном прогоне переключитесь на медленный preset — эти два параметра независимы.
Частые заблуждения
«CRF 23 — это 23 Мбит/с» — нет. CRF напрямую не переводится в битрейт; выходной битрейт определяется сложностью контента.
«Чем ниже CRF, тем лучше» — не совсем. После CRF 18 глаз разницу уже не видит, а файл растёт. Плюс плееру может быть тяжело декодировать избыточно высокий битрейт.
«Не понравился результат — сжимаю ещё раз» — каждый повторный проход через lossy-кодек накапливает потери. Старайтесь сжимать один раз из исходника; если нужно перекодировать — пересматривайте CRF заново.
«Поменял CRF, а размер не изменился» — проверьте, что указан -c:v libx264 (или что пресет его не перезаписал). У разных кодировщиков шкала CRF совершенно разная.
Попробуйте сами
Конечный арбитр — ваши глаза и целевой размер файла. Откройте видео-компрессор и покрутите CRF прямо в браузере; если нужен полный контроль над параметрами включая preset — заходите в конструктор FFmpeg-команд. Всё обрабатывается локально, без загрузки на сервер.
FAQ
В: После CRF файл получился больше оригинала. Что делать? О: Значит, исходный битрейт ниже того, что нужно для CRF-качества (типично для съёмки на телефон). Дальнейшее сжатие сделает только хуже. Правильно — поднять CRF или снизить разрешение.
В: Чем -crf отличается от -qp?
О: -qp — фиксированный параметр квантования, он игнорирует содержимое кадра. CRF адаптирует qp по модели восприятия. Если вы не тестируете покадрово — используйте CRF.
В: Можно ли применить CRF к GIF? О: Нет. CRF — понятие видеокодеков (H.264/H.265). GIF устроен иначе: 256 цветов, LZW, покадровое хранение. Его сжимают уменьшением палитры, частоты кадров и оптимизацией.