ffmpeg -i in.mp4 -c:v libx264 -crf 28 -preset fast out.mp4 сжимает видео в MP4, немного жертвуя качеством ради заметно меньшего файла — CRF это регулятор, и диапазон 18–28 единственный, который стоит запомнить. Дальше — шкала CRF в реальных цифрах, пакетная конвертация целой папки и шаг, который обычно пропускают: посмотреть длительность и кодеки файла, прежде чем запускать перекодирование на час.
1. Что вообще внутри файла
$ clai покажи длительность этого видео→ ffprobe -v error -show_entries format=duration -of csv=p=0 in.mp42.000000
ffprobe идёт в комплекте с ffmpeg и ничего не перекодирует. Прежде чем запускать конвертацию, которая может занять час, посмотрите, с чем вы имеете дело.
2. Сжать, управляя качеством
$ clai сожми это видео, качество важнее размера→ ffmpeg -i in.mp4 -c:v libx264 -crf 28 -preset fast out.mp4
На тестовом ролике исходник весил 13074 байта, а на выходе получилось 10861 байт. CRF — шкала качества от 0 до 51, где меньше значит лучше и больше. Диапазон, который стоит запомнить, — 18–28: 18 визуально неотличимо от оригинала, 23 разумный вариант по умолчанию, 28 заметно мягче, но годится для большинства случаев.
3. Уменьшить разрешение, если сжатия мало
$ clai сожми сильнее и уменьши высоту до 144 пикселей→ ffmpeg -i in.mp4 -vf "scale=-2:144" -crf 30 small.mp4
Тот же ролик, теперь 8130 байт против исходных 13074. -2 в ширине значит «посчитай сам, сохрани пропорции и округли до чётного» — кодекам нужны чётные размеры, и именно на этом падает половина команд из интернета.
4. Поменять контейнер, не трогая содержимое
$ clai переложи это видео из mov в mp4 без перекодирования→ ffmpeg -i input.mov -c copy output.mp4
-c copy копирует потоки как есть. Занимает секунды вместо минут и не теряет качества — если кодеки внутри совместимы с новым контейнером, а для mov в mp4 обычно так и есть.
5. Обработать всю папку
$ clai сконвертируй все mov в этой папке в mp4, имена сохрани→ for f in *.mov; do ffmpeg -i "$f" -c:v libx264 -crf 23 "${f%.mov}.mp4"; done
${f%.mov} отрезает расширение. Кавычки вокруг $f не опциональны — без них первый же файл с пробелом в имени сломает цикл.
6. Вырезать кусок без перекодирования
$ clai вырежи из видео кусок с 30 секунды длиной в минуту→ ffmpeg -ss 30 -i input.mp4 -t 60 -c copy clip.mp4
-ss до -i работает быстро, потому что ffmpeg перематывает, а не декодирует. С -c copy рез идёт по ближайшему ключевому кадру, поэтому начало может съехать на секунду. Нужна точность до кадра — уберите -c copy и заплатите перекодированием.
Грабли
-presetменяет скорость, а не качество.ultrafastкодирует быстро и даёт файл побольше,slowнаоборот. На качество при том же CRF влияет слабо — это чистый обмен времени на размер.- Звук молча перекодируется. Если про
-c:aничего не сказано, ffmpeg решает сам. Добавьте-c:a copy, когда со звуком ничего делать не нужно. - CRF не значит одно и то же для всех кодеков. Для libx265 та же цифра даёт более высокое качество: CRF 28 у x265 примерно равен CRF 23 у x264.
Похожие вопросы
Какой CRF выбрать? Начните с 23. Файл слишком большой — берите 28. Для архива, который не должен деградировать — 18.
Чем ffmpeg лучше онлайн-конвертера? Ролик не покидает вашу машину, нет ограничений по размеру, и одна команда обрабатывает целую папку.
Как ускорить кодирование? Аппаратный кодер: -c:v h264_nvenc на NVIDIA, -c:v h264_videotoolbox на macOS. Заметно быстрее, качество при том же битрейте чуть хуже.
Читайте также
- Переименовать сотни файлов: от циклов for к обычным словам
- Сжать эту папку и загрузить в S3
- От однострочника к закоммиченному скрипту
CliAI подберёт нужные флаги ffmpeg под то, что вы опишете, включая CRF и фильтр масштабирования. Установка одной строкой.