Прямой ответ
Сжатие определяется режимом контроля битрейта, поэтому постоянный битрейт даёт предсказуемый объём, а постоянный уровень качества — предсказуемое качество.
| Режим | Что фиксируется |
|---|---|
| Постоянный битрейт | Объём данных в секунду |
| Постоянный уровень качества | Степень сжатия кадра |
| Переменный битрейт | Объём, зависящий от сложности кадра |
| Разрешение | Число пикселей кадра |
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac output.mp4
Уровень качества задаёт степень сжатия, поэтому объём файла зависит от сложности кадра, а качество остаётся равномерным. О кодеках — в статье про конвертацию видео.
Режимы контроля битрейта
Режим контроля определяет, фиксируется ли объём либо качество, поэтому выбор режима зависит от требования к предсказуемости.
Постоянный битрейт. Объём данных в секунду фиксирован, поэтому размер файла вычисляется по длительности, но качество меняется со сложностью кадра.
Постоянный уровень качества. Степень сжатия фиксирована, поэтому качество равномерно, а объём зависит от сложности кадра.
Переменный битрейт. Объём распределяется по сложности кадра, поэтому простые сцены сжимаются сильнее, а сложные получают больше данных.
Практическое следствие: постоянный битрейт на сложной сцене даёт заметные артефакты, поскольку объём данных не увеличивается вместе со сложностью кадра.
Отдельный аспект — скорость кодирования. Параметр скорости определяет, сколько времени кодируется кадр, поэтому более медленный режим даёт меньший объём при том же качестве, но увеличивает время обработки.
Подбор параметров под задачу
Параметры сжатия подбираются по требованию к объёму и качеству, поэтому значение уровня качества определяется целевым результатом.
Уровень качества. Значение параметра определяет степень сжатия, поэтому меньшее значение даёт больший объём и меньшее число артефактов.
Скорость кодирования. Более медленный режим подбирает параметры точнее, поэтому объём сокращается при том же уровне качества.
Целевой объём. Требование к размеру файла задаёт верхнюю границу битрейта, поэтому уровень качества подбирается под ограничение.
Практическое следствие: уровень качества, подобранный для одного разрешения, даёт иной объём при другом разрешении, поскольку число пикселей кадра меняется.
Разрешение и проверка объёма
Разрешение определяет число пикселей кадра, поэтому объём сжатого файла растёт с разрешением при том же уровне качества.
Число пикселей. Кадр большего разрешения содержит больше данных, поэтому объём сжатого потока увеличивается.
Снижение разрешения. Уменьшение размера кадра сокращает объём сильнее, чем изменение уровня качества, поэтому размер файла падает заметно.
Проверка объёма. Размер выходного файла читается по факту, поэтому соответствие требованию подтверждается, а не предполагается.
Практическое следствие: сжатие без снижения разрешения может не обеспечить требуемый объём, поскольку число пикселей остаётся прежним.
О командах обработки — в статье про FFmpeg; о потоковом транскодировании — в статье про транскодирование видео.
Практика: настройка сжатия видео
1. Выбирайте режим контроля под требование. Постоянный битрейт даёт предсказуемый объём, постоянный уровень качества — равномерное качество.
2. Подбирайте уровень качества под целевой результат. Меньшее значение даёт больший объём и меньшее число артефактов.
3. Используйте более медленный режим при достаточном времени. Объём сокращается при том же уровне качества.
4. Снижайте разрешение при жёстком ограничении объёма. Число пикселей влияет на размер сильнее, чем уровень качества.
5. Задавайте верхнюю границу битрейта при требовании к размеру. Объём файла не превышает установленный предел.
6. Читайте размер выходного файла. Соответствие требованию подтверждается по факту.
7. Сравнивайте варианты на сложной сцене. Артефакты сжатия заметнее на сценах с движением, поэтому сравнение выполняется на них.
Рекомендации:
- Не подбирайте уровень качества по одному файлу. Сложность кадра различается, поэтому объём меняется между файлами.
- Учитывайте время кодирования при выборе скорости. Более медленный режим сокращает объём, но увеличивает время обработки.
- Сопоставляйте разрешение с требованием к объёму. Снижение размера кадра сокращает объём заметнее, чем изменение уровня качества.
- Фиксируйте параметры сжатия в скрипте. Повторная обработка даёт одинаковый результат.
- Пересматриваем параметры при изменении целевого объёма. Новое ограничение требует иного уровня качества либо разрешения.
Практический сценарий: файл не помещался в ограничение объёма
Контекст: сжатое видео превышало требуемый размер, при этом качество было приемлемым и снижать его не планировалось.
- Диагностика. Чтение параметров показало, что разрешение кадра оставалось исходным, а уровень качества был подобран под другое разрешение. Объём файла превышал ограничение, поскольку число пикселей не изменялось.
- Причина. Сжатие выполнялось только изменением уровня качества, при этом разрешение сохранялось, поэтому сокращения объёма оказалось недостаточно.
- Действия. (а) Снизили разрешение кадра до значения, соответствующего целевому объёму; (б) подобрали уровень качества под новое разрешение, чтобы качество оставалось равномерным; (в) применили более медленный режим кодирования, чтобы сократить объём при том же уровне качества; (г) добавили чтение размера выходного файла в скрипт, чтобы соответствие ограничению подтверждалось; (д) сравнили результат на сложной сцене и убедились в отсутствии заметных артефактов.
- Результат. Файл помещается в ограничение объёма, поскольку разрешение и уровень качества подобраны совместно.
Вывод: изменение только уровня качества может не обеспечить требуемый объём, поскольку число пикселей кадра остаётся прежним. Снижение разрешения с последующим подбором уровня качества даёт файл в заданном ограничении при равномерном качестве.
FAQ
Чем постоянный битрейт отличается от постоянного уровня качества? Постоянный битрейт фиксирует объём данных в секунду, постоянный уровень качества — степень сжатия. Объём во втором случае зависит от сложности кадра.
Как сократить размер файла без заметной потери качества? Снижением разрешения и применением более медленного режима кодирования. Число пикселей влияет на объём сильнее, чем уровень качества.
Почему качество падает на сложных сценах при постоянном битрейте? Объём данных фиксирован, поэтому сложная сцена получает столько же данных, сколько простая, и артефакты становятся заметны.
Зачем читать размер выходного файла? Соответствие требованию к объёму подтверждается по факту. Команда может выполниться без ошибки, но с результатом большего размера.
Источники: FFmpeg H.264 encoding guide, FFmpeg codecs, ffprobe — ссылки в шапке.