Видеокодек VP9 — преимущества и недостатки

Приветствую всех читателей блога navertel.net. Это будет совсем небольшая заметка, скорее для себя. Сегодня мы поговорим на тему видеокодеков. На данный момент существует довольно большое их количество, в которые можно кодировать/рендерить видео. Самым популярным, пожалуй, считается кодек h264, а само видео в этом кодеке находится в контейнере (расширении) mp4. Вы спросите, а что с ним не так? С ним всё замечательно, несмотря на почтенный возраст, этот кодек дает прекрасное качество в сочетании с хорошей скоростью кодирования. И если вам нужно отрендерить какое-то видео для домашней коллекции, можете использовать его и не вдаваться в детали. Однако, есть одно «НО» — эффективность сжатия.
Современный, технологичный кодек VP9 (webm), разработанный компанией Google, жмет видео на 40% эффективнее, чем H264. То есть выдает сравнимое качество при значительно более низком битрейте. Почему это имеет значение? С одной стороны, битрейт — качество получаемого видео, а с другой — полоса пропускания как клиентского интернет-канала, так и серверного. Приведу простой пример: я закодирую видео в кодек h264 (mp4) с битрейтом 50 мегабит/c и выложу его на какой-либо сайт (ютуб, vimeo и т.д не учитываем). Качество, при таком битрейте, будет просто восхитительное, однако, далеко не у каждого зрителя тариф обеспечит требуемые 50 мегабит входящего канала. Видео будет постоянно буферизироваться, что неизбежно рассердит любого смотрящего. Так же, имеет смысл подсчитать, какой же требуется интернет-канал серверу, чтобы хотя бы 10 человек могли одновременно смотреть это видео? Путем нехитрых вычислений понимаем, что серверу нужно 500 мегабит. Это очень жестко.

Исходя из имеющихся данных, становится очевидно, что главная задача любого видеосервиса — жать видео максимально, настолько, насколько это возможно. Это позволит сразу убить двух зайцев — экономить дисковое пространство хранилища и одновременно обслуживать намного больше клиентов.

Если ваша задача — получить лучшее качество при наименьшем битрейте, то тут кодек VP9 и приходит на помощь. С помощью него можно кодировать, например, 1080p видео с битрейтом 2500k (2,5 мегабита) и иметь вполне приличное качество. Если видео очень динамичное, битрейт следует поднять до 3000-4000k. Если же с таким битрейтом мы будем кодировать в кодек h264 — получим пиксельную кашу, примерно как на Ютубе. Ютуб далеко не всё видео кодирует в VP9 (webm), многие видео хранятся в кодеке h264/avc — смотреть на них больно.

Однако, кодек VP9 не идеален и есть у него небольшой изъян, связанный с цветовым пространством. Условно, два основных цветовых пространства — это TV (bt601) и PC (bt709). Чем они отличаются? Уровнями черного и белого. Цветовое пространство TV имеет более узкий диапазон цветов 16-235, где 16 — белый, а 235 — черный. Если просматривать такое видео на мониторе ПК, то оно будет блеклое, тусклое, с низким контрастом. Потому что правильное цветовое пространство для PC — 00-255, где 00 — абсолютный белый, а 255 — абсолютный черный. Простыми словами, телевизионное цветовое пространство имеет ограниченный диапазон RGB. А компьютерное — полный.

Ну и что?

Проблема кодека VP9 состоит в том, что он умеет работать только с TV пространством, обозначаемое так же, как yuv420. Для многих современных фото и видеокамер — это не проблема, они снимают точно в таком же цветовом поле с поправкой на контраст, картинка с них вполне хорошо смотрится. Но есть старые модели фото-видео камер, которые снимают в цветовом пространстве yuvj420 (pc, bt709) и с них необработанное видео смотрится отлично, сочно, контрастно. Но вот при кодировании в VP9 подобных видео со старых камер, кодек обрезает диапазон цвета с 00-255 до 16-235 и мы получаем тусклую, неконтрастную картинку. Абсолютно черный 255 превращается в тёмно-серый 235.

Как решать эту проблему?

Облазив огромное количество интернет-сайтов, как российских, так и зарубежных, я не нашел практически никакой полезной информации. И вывод напрашивается сам собой: раз кодек не поддерживает yuvj420 (pc, bt709), то и бороться с потерей цвета никак нельзя. Тем не менее, я нашел небольшую уловку, которая работает в актуальных версиях ffmpeg (4.2) и позволяет с помощью фильтра подкрутить контраст на 10%. Вероятно, Ютуб пользуется подобными методами, так как конвертировать PC-стандарт (yuvj420) в TV (yuv420) и не потерять часть цвета — невозможно. Делюсь командой для ffmpeg под Linux, чтобы закодировать видео yuvj420 и не лишиться контраста. Конечно, это лишь уловка, но закодированное видео в yuv420 практически не будет визуально отличаться от исходника и большинство вообще не заметит никакой разницы.

Решение:


ffmpeg -i MVI_9360.MOV -c:v vp9 -vf «eq=contrast=1.1:brightness=0:saturation=1» -b:v 2000k -c:a libopus -b:a 256k -y 1080p.webm

eq=contrast=1.1 в данном примере означает, что контраст выставлен на 110%. На 10% выше, чем в исходнике видео. Кавычки нужно поправить на нормальные. Для тех, кто особенно не разбирается в параметрах кодирования, поясню:

-i — входной файл
MVI_9360.MOV — название входного файла, включая расширение
-c:v vp9 — кодек видео VP9
-vf «eq=contrast=1.1:brightness=0:saturation=1» — видеофильтр, контраст, яркость, насыщенность. Единица — это 100%.
-b:v 2000k — примерный битрейт видео установлен в 2000 килобит/c
-c:a libopus — кодек аудиодорожки, кроме libopus может использоваться libvorbis
-b:a 256k — битрейт аудиодорожки установлен в 256 килобит/c
-y — означает yes, полезно в случае перезаписи существующего в каталоге файла с тем же названием.

По поводу кодирования различных видеофайлов с помощью ffmpeg я как-нибудь напишу отдельный пост. А пока, на этом всё. Спасибо за внимание :)


На правах автора хочу напомнить, что у нас есть группа вк и телеграм-чат, где можно пообщаться на компьютерную и сетевую тематику.


    Добавить комментарий

  • Хочу обсудить с вами возможность публикации гостевой статьи. Буду очень признателен за ответ на email.