@l4m3r

Почему конвертация двух похожих файлов из mp4 в webm дает очень разные результаты?

Есть 2 похожих mp4-файла. Одинаковый размер видео, почти одинаковые продолжительность, fps, кол-во фреймов, кодек. Размер файлов тоже: один 30 (битрейт 1.9М), другой 35 (битрейт 1.3М).
Конвертирую их в webm (vp9). При одних параметрах - один сжимается, другой многократно увеличивается с 30 мб до 160. (битрейт выходного файла становится из 1.3M в 9M, хотя я задавал b:v 1M). При других - наоборот. Почему такое может происходить? Как получить похожий результат сжатия для обоих?

На скрине можно заметить, какие разные результаты для 1 и 2 при одинаковых параметрах конвертирования:
sfDwLXm.png
  • Вопрос задан
  • 1079 просмотров
Решения вопроса 1
nidalee
@nidalee
Во-первых, если ваш энкодер умеет CRF, CQP и прочие адаптивные битрейты \ стратегии энкодера, нужно использовать их. О стратегиях энкодера (Encoder Strategy \ Rate Control \ и прочее названия одного и того же) можно почитать здесь.
Вы не можете знать, какой битрейт нужен каждому отдельному кадру видео, поэтому ваши попытки указать битрейт вручную практически обречены на провал:
1) Если указанный вами битрейт ниже реально необходимого, вы получите ухудшение качества картинки и артефакты сжатия.
2) Если указанный вами битрейт выше реально необходимого, то качество видео останется неизменным, но файл будет "весить" больше, чем мог бы.
Более того, вы указываете битрейт на все видео, в то время как переменный битрейт может быть больше в начале файла (например, где много движения, и требуется больше битрейт), а в конце файла могут быть длинные статичные планы - там битрейт нужен сильно меньше.

Таким образом, поскольку вы используете VP9 (WEBM), вам следует использовать CRF (Constant Quality):
To trigger this mode, you must use a combination of -crf and -b:v 0. Note that -b:v MUST be 0. Setting it to anything higher or omitting it entirely will instead invoke the Constrained Quality mode.

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

The CRF value can be from 0–63. Lower values mean better quality. Recommended values range from 15–35, with 31 being recommended for 1080p HD video.

Поэтому все -b:v без CRF сразу выкидывайте.

Поскольку в задаче не было указано, какой вам нужен размер файла, это самый адекватный подход. Если же вы хотите сжать файл и готовы смириться с потерями качества, нужно использовать Constrained Quality - работает примерно так же, но дополнительно ограничен сверху указанным вами битрейтом:
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 2000k output.webm

The quality is determined by the -crf, and the bitrate limit by the -b:v where the bitrate MUST be non-zero.

У вас, кроме того, достаточно нескромный для VP9 CRF - 20 - это для 4К без видимых потерь качества. Уверены, что вам нужно такое? Посмотрите гайд от гугла по VP9 - для 1080P они предлагают устанавливать CRF в 31.
Второй файл с CRF 30 без ограничения битрейтом почти не увеличился. Что по качеству? Просело?

Я не знаю, какой именно кодек используется в вашем MP4 исходнике, но если это HEVC\H.265, то там можно наколдовать более эффективное и качественное сжатие, особенно если есть много лишнего времени на медленные пресеты или ручной их тюнинг. Такой файл после конвертации в VP9 раздует наверняка.
Если исходник H264, то он практически всегда должен сжимать хуже VP9, и значит проблема в ваших настройках.

В общем и целом, при прочих равных, файлы с минимальными изменениями в кадре сжимаются лучше, чем экшн-сцены. То есть если у вас 20 минут абстрактного видео, 2\3 которого - статичное изображение, он будет легче, чем 5 минут абстрактной экшн-сцены.
Опишите или покажите оба видео, и тогда картина наверняка прояснится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы