Учимся сжимать видео для Telegram

Учимся сжимать видео для Telegram

Verum Corner


Наглядный скрин для тех, кто хочет спросить зачем это делать

Мотивация

К сожалению, встроенная сжималка видео у мессенджера работает из вон рук плохо, а большинство каналов видео никак не сжимает.

Оригинал до сжатия

Встроенная сжималка в мобильной версии телеги просто увеличило размер оригинала в два раза и уменьшив его разрешение

Я хочу уважать трафик людей и их терпение, если кто-то отмазывается быстрым\безлимитным интернетом то это ошибка выжившего.


Это видео весит 3.1 мегабайта, кодек h264. Оригинал весил 10мегабайт, разрешение не менялось. Видео только для демонстрации как можно эффективно использовать кодек.


Почему видео сжимаются плохо

Большинство сервисов и программ используют стандартные настройки энкодера, потому что под каждое видео нужны свои конфигурации и решения, иногда можно пойти на компромиссы чтобы сжать видео ещё сильнее с минимальными шакалами. Телеграм или Дискорд хорошо пожатое видео даже может раздуть своим "пережаитем" как в примере выше. Поэтому, например, ютуб рекомендует самостоятельно кодировать видео чтобы оно у пользователей выгрузилось без шакалов и перекосов при перекодировании.

Мы будем сжимать в h264

Почему мы будем использовать именно h264? Есть ведь vp9 который сжимает в разы лучше, даже есть av1 который сжимает ещё экстремальнее почти не портя картинку. Согласно отчетам Bitmovin от 2019 года  h264 используется в 91% случаев. Все видео в телеге тоже грузятся кодеком h264, телефоны тоже пишут видео в h264. Если посмотреть на рекомендации ютуба то тоже предлагается кодировать в h264. Причина тому: хорошо обкатанная технология с обратной совместимостью древних девайсов (айпод например), то есть аппаратное декодирование поддерживается с большой вероятностью всеми девайсами. Поэтому он идеальный вариант для сжатия.

Более того, у h264 проще алгоритм чем например у h265. От чего он меньше пожирает ресурсов и быстрее кодирует.

Сжимаем

Нам нужны инструменты для сжатия. Ставим Handbrake. Это самый продвинутый и удобный софт для сжатия видео на данный момент.

Почему не FFMPEG?

У ffmpeg отсутствует GUI и в нем не удобно работать для тех кто не прогромист. Никто не будет сидеть в cmd\cli и разбираться в ошибках и подборе параметров кроме закоренелых линуксоидов. В конце будет готовый шаблон параметров для ffmpeg

Запускаем HandBrake

После загрузки файла мы теперь можем приступать к работе

В первом окне сразу ставим галочки "Web Optimized" и "Align A/V Start", остальные галочки убираем. В первом случае нам это необходимо так как mp4 хранит метаданные в конце файла а не в начале. Телеграм умеет открывать видео в потоке (показывать видео пока оно загружается), но на это заточены не все видео. Либо видео просто будет открываться не правильно при просмотре в потоке. В FFMPEG это делается добавлением аргумента:
-movflags +faststart

У некоторых видео могут быть проблемы с синхронизацией аудио и видео. Просто галочкой "Align A/V Start" решаем эту проблему. Юзерам ffmpeg приготовится к пердолингу.

Разрешение

У нас в картинке нет никаких проблем с разрешением, мы можем все здесь оставить как есть.
UPD: многих напугало это окно, можно в документации HandBrake почитать за что отвечают параметры. Но мне они пока нигде не пригодились, хватает только дергать "resolution limit" и галочку "optimal size" (оно может удалять черные полоски как "лишние", поэтому можно выключить если полоски нужны)

Фильтры

Detelecine, Deinterlace, это параметры которые вам не потребуются. Если вы работаете на телевидении с старым оборудованием или снимаете на старую камеру и ваше видео выглядит вот так:

То эти параметры для вас.

С параметром Sharpen можно поиграться после настройки энкодера, он позволяет сделать какие-то детали более четкими. В моем случае подходят настройки на скрине.

Энкодер

Выбираем h264 кодек. У нас в картинке не очень много кадров, поэтому оставим 24 и Peak Framerate. Ничего страшного если их меньше в анимации, опция peak framerate определит сколько кадров нужно показывать.

UPD: частоту кадров у оригинала можно не менять при условии если в исходном видео много статики, так как выигрыша в размерах сжатия почти нет. Например если это классическая анимация.

Мы не будем вручную прописывать битрейт видео, мы будем использовать параметр Constant Quality. В ffmpeg это параметр CRF. Чем выше число тем больше шакалов. Для сжатия хватит в диапазоне от 30 до 20.

Пресет энкодера ставим VerySlow. Возможно картинка будет рендерится дольше со скоростью 0.5 или 2.5 (в зависимости от мощности процессора), но результат будет хорошим.

Encoder Tune ставим Animation, потому что у нас это анимация, duh.

Какой подойдет если это не анимация? Ответ дает вики ffmpeg:

Encoder Profile можно оставить main для совместимости со старыми девайсами.

Encoder Level оставляем 4.0. Что это такое можно ознакомится тут.


Аудио

У старых произведений обычно аудиосистема с сильно порезанным частотным спектром, и стерео не играет для нас никакой критичной роли. Поэтому мы можем понизить битрейт до 64kbps (Для AAC это будет приемлемо) и сократить канал до одного (моно), всё равно это будут смотреть с смартфона. Если это какое-то музыкальное произведение то можно поставить 96kbps и оставить стерео, ещё экстремальнее жать аудио нет смысла.

Тестируем результаты

Теперь нам надо посмотреть как кодируется видео по нашим параметрам.
Жмем Preview выше. Вылетит окошко, жмем live preview и смотрим первые 30 секунд рендера (рендерится в то же место где вы указали куда сохранять полное кодирование видео). Если видно какие-то проблемы то играемся с параметром Constant Quality и фильтрами и проверяем ещё раз на веру и на глазок. Остальные параметры можно не трогать. Если разрешение слишком большое то можно попробовать его уменьшить и тем самым выиграть в размере.

Для пользователей ffmpeg все параметры должны получится примерно так:
-c:v libx264 -r 24 -preset veryslow -tune animation -crf 30 -pix_fmt yuv420p -movflags +faststart -c:a aac -ac 1 -b:a 64k -async 1 -strict -2 -y

Кодируем

Жмем Start Encode. Всьо.

Результат кодирования. Видео только для демонстрации.


Теперь у нас есть относительно небольшого размера, относительно не шакалистое видео и пользователи на вас не будут плеваться за размеры. Теперь вы познали дзен в сжатии видео для телеги, поздравляю!

С вас подписька на мой канал:
https://t.me/verumcraft


Report Page