Сжатие видео кодеком AV1
Несколько месяцев назад @belbous рассказывал мне про видеокодек AV1 — какой он классный. Недавно я решил поэкспериментировать с ним. Обнаружил, что у меня на ноутбуке с Ubuntu есть нужное железо — видеокарта NVIDIA с поддержкой аппаратного кодирования AV1 через NVENC. Эта возможность появилась только в RTX 40-й серии: на 30-й и старше NVENC умеет AV1 только декодировать, а для кодирования остаётся софт на процессоре. К счастью, всё это интегрировано в ffmpeg, бери и пользуйся.
С помощью Claude Code я на примере нескольких видеофайлов подобрал подходящие настройки. Цель была — сохранить качество, но уменьшить размер файла. В итоге в настройках даже не фигурирует битрейт. На выходе получился bash-скрипт, который анализирует видеофайл через ffprobe и, в зависимости от разрешения и цветовой схемы, выставляет CQ и прочие настройки.
Claude Code не просто подобрал значения наугад: он сделал несколько прогонов на куске видео, сравнил входной и выходной файл, повырезал кадры и сам оценил качество, даже описывая сцены, которые сравнивал — след на снегу, пейзаж с деревьями, лицо Декстера 😁.
Изначально Claude Code исходил из сравнения трёх кодеков — H.264, H.265 (он же HEVC) и AV1. Базовый расчёт был такой: H.264 → H.265 даёт сжатие около 50%, а H.265 → AV1 — ещё около 30% при том же качестве. Правда, эти 30% относятся к софтовым кодировщикам (libaom, SVT-AV1) — аппаратный AV1 в NVENC работает в разы быстрее, но при том же битрейте проигрывает им в качестве. Я хотел сэкономить место на диске, так что такой компромисс меня устроил.
Звук попутно я пережимал в стерео кодеком Opus, так как смотреть всё равно собираюсь на телевизоре с обычным (и довольно средним) стереозвуком, а запускать планировал с iPad, который почему-то исторически не умеет выводить звук 5.1 через HDMI (вместо звука — шипение).
Результат впечатляющий. Серия «Основания» — 4K, HEVC, HDR — ужалась с 10,2 ГБ до 2 ГБ. В пять раз! При визуально том же качестве картинки. Правда, надо честно оговориться: пятикратное сжатие здесь — это не столько чистая эффективность AV1, сколько следствие очень высокого битрейта у исходника (рипы обычно делают с большим запасом). На файлах, изначально сжатых плотнее, выигрыш будет скромнее.
Одна 45-минутная серия перекодировалась около 15 минут. Для видео в 4K это очень быстро. А одна 50-минутная серия «Декстера» в 1080p в SDR и вовсе перекодируется за пять минут. Красота.
Но есть и минусы — из коробки NVENC не поддерживает HDR10+ и Dolby Vision, так что эти динамические метаданные при перекодировании теряются. Обычный HDR10 со статическими метаданными пробрасывается нормально, то есть базовый HDR на месте — проблемы только с расширенными форматами. Есть какой-то обходной путь: эту часть конвертировать отдельно и потом склеивать, но я решил не заморачиваться — телевизор у меня не такой уж крутой, HDR10+ и Dolby Vision он всё равно бы не показал. Можно ещё использовать другой кодек, который всё сделает на процессоре — там и качество выше, и метаданные сохраняются, — но тогда эта же серия в 4K конвертировалась бы не 15 минут, а много часов. Так что у меня, похоже, получилось идеальное соотношение качество/время.