Привет, Хабр! Мы – техническая команда «МТС веб-сервисы», работаем с направлением ТВ-решений для онлайн-кинотеатра KION: Андрей Агарков – эксперт в области видеокодирования и CDN, Дмитрий Пискунов – team lead группы технического сопровождения и Александр Шаталов – главный эксперт в области ТВ-платформ. В этой статье расскажем о поисках золотой середины между качеством видео и техническими ресурсами на его кодирование, хранение и доставку по транспортным сетям до клиентского устройства. История этого вопроса для нас началась с… Дальнего Востока. Статистика и метрики CDN обратили наше внимание на то, что на удаленных узлах значительное количество просмотров ТВ-каналов и фильмов в KION происходит в низком качестве видео. Анализ ситуации показал, что: скорость мобильного интернета в отдаленных регионах не всегда позволяет смотреть видео в высоком качестве; в условиях нестабильного интернета устройство не может перейти на более высокий профиль видео из-за большого интервала между битрейтами в соседних профилях; динамичному контенту не всегда хватает битрейта для сохранения приемлемого качества на больших экранах ТВ. Появилась задача – улучшить качество воспроизведения Live- и VOD-контента (адаптивный стриминг). Погрумив ее с командой, мы выделили 3 основных вопроса, на которые предстояло найти ответы: Как найти оптимальные параметры соотношения разрешений видео и битрейтов, не потеряв при этом в качестве? Как подобрать набор профилей в пресете кодирования, необходимый для плавного переключения в условиях нестабильного интернета? Как не забыть о производительности транскодеров, сокращении объемов видео трафика в сети и экономии места на origin (центральное хранилище контента)? Конечно, для кодека h.264 при 25 кадрах в секунду в интернете есть информация по стандартным разрешениям с рекомендованными битрейтами. Вот, к примеру, такая табличка: Разрешение Битрейт 1080p: 1920 x 1080 8 – 10 Mbps 720p: 1280 x 720 5 – 7 Mbps 480p: 854 x 480 2,5 – 4,5 Mbps 360p: 640 x 360 1 – 3 Mbps 240p: 426 x 240 200 – 500 kbps Однако контент на разных каналах сильно отличается по динамике, да и разбежка в битрейте в 20% нас не устраивает. Ведь каналов у нас более 600, а видеофайлов VoD – порядка 170 000. Это избыточная утилизация origin, CDN, транспортной сети и мощностей кодеров. Мы решили самостоятельно протестировать все разрешения и битрейты для определения оптимальных параметров. Для начала мы определили коэффициент качества транскодированного потока, приняв за верхнюю границу разрешение 1920х1080 (FullHD), 25 кадров/секунду и битрейт 8 Mbps. Именно это соотношение оптимально для HD контента даже с высокой динамикой, например, спортивных трансляций: Критерий Bits-per-Pixel (BPP) = битрейт (бит в секунду) / (ширина х высота х FPS) BPP = 8000000 / (1920 х 1080 х 25) = 0,1543 Полученный BPP = 0,1543. Фактически, это удельное количество бит на 1 пиксель изображения. Мы будем стремиться к нему при расчете всех остальных профилей видео. Далее можно рассчитать битрейты для любого разрешения по формуле: Битрейт = ширина * высота * FPS * коэффициент качества И тут возникла первая трудность – какие же разрешения взять? И более глобальный вопрос – а какие они вообще бывают? Сервис KION поддерживает всевозможные разновидности девайсов: телевизоры, смартфоны и планшеты на Android и IOS. На рынке сейчас огромное количество разновидностей устройств, с абсолютно разными размерами экрана и, как следствие, с поддержкой разных разрешений.   Проведя анализ девайсов и форматов вещания телеканалов, мы выделили 2 основных параметра:  разрешение должно быть пропорционально 16:9; разрешение должно быть кратно 8. Почему так? 95% вещателей отдают телеканалы в формате 16:9. А те, кто еще вещает в формате 4:3, скоро все равно перейдут на широкоформатное вещание. Если углубиться в работу кодека MPEG при YUV 4:2:0 (который мы используем в своем решении), то становится понятно, что размер макроблока равен 8х8. Мы написали небольшой скрипт, который помог нам рассчитать все подходящие под эти критерии разрешения. Код скрипта приведен ниже на случай, если кто-то захочет нас перепроверить ;) В результате же его работы мы получили следующий список: 128:72 256:144 384:216 512:288 640:360 720:576 768:432 896:504 1024:576 1152:648 1280:720 1408:792 1536:864 1664:936 1792:1008 1920:1080 Получилось 15 разрешений, к которым мы добавили еще одно – 720:576. Это стандартное SD-разрешение, оно используется в большинстве исходных SD-потоков. Код скрипта для интересующихся: width = 16 height = 9   count = 1  while count <= 120:      if (width  count) %8 == 0 and (height  count)%8 == 0:          w = (width  count)          h = (height  count)      print(str(w)+':'+str (h))  count = count + 1 Получив набор разрешений, который нас устраивает, нам нужно определить, какие из них войдут в пресеты и с какими битрейтами. При этом мы держали в голове тот факт, что контент может кардинально отличаться. Например, для футбольного матча на большом экране не хватит 6 mbps на FullHD-разрешении, а для передачи новостей на маленьком экране смартфона вполне подойдет и 2 mbps. То есть параметр BPP будет отличаться для разного типа контента. И набор пресетов для них также должен отличаться. Подумав над задачкой, мы пришли к тому, что правильно будет разделить весь наш контент на 3 категории: статический контент («говорящие головы», документальное кино); динамический контент (спортивные мероприятия, блокбастеры); что-то среднее по скорости. Далее мы перешли к задаче оценки качества картинки при разных разрешениях и битрейтах (как говорится, «не поверю, пока сам не попробую»). Тут нам на помощь пришли метрики качества видеопотока: Объективные: SSIM (Structural Similarity Index) – метрика структурного сходства. VMAF (Video-Multimethod-Assessment Fusion)  – разница между эталонной и искаженной видеопоследовательностью. Субъективные: Фокус группа и зрительное восприятие картинки. Для тестирования мы взяли по одному самому яркому представителю из каждой категории контента и начали длительный процесс оценки качества. Методика: Берем исходные (не транскодированные) видеопотоки с битрейтом 30 Mbps для HD и 5 Mbps для SD, принимаем их за эталонные. Транскодируем эти потоки на одном разрешении, но с разными битрейтами и сравниваем с эталонными, снимаем метрики по каждому значению битрейта. Повторяем процедуру со всеми разрешениями, которые мы получили выше Сводим получившуюся информацию и определяем, на каком битрейте оценка качества более низкого разрешения становится выше, чем у более высокого. Этот битрейт определяет точку перехода в нашем целевом пресете от более высокого разрешения на более низкое, а также показывает нам значение битрейта, которое дает максимальную оценку качества на этом разрешении. Для наглядности приведем полученный график, на котором сведены наши измерения для динамичного HD-контента (футбольный матч): В результате для динамичного HD контента мы получили следующие точки перехода: Разрешение Видео битрейт, кбит/сек Значение VMAF 1920x1080 5000 98,42 1280x720 2500 91,01 1024x576 1400 82,34 896x504 900 73,23 768x432 500 59,28 Подобрав таким образом набор профилей для SD/HD-контента по каждой категории, мы стали проверять результат глазами. Провели слепые тесты на фокус-группе по тому списку битрейтов, на которых мы получили ранее устраивающие нас значения метрик. При этом дополнительно поигрались со значениями битрейтов, уменьшая и увеличивая их на 10%-15% относительно расчетных, чтобы убедиться в отсутствии разницы качества для глаз. По итогам этих тестов окончательно определили битрейты, выше которых для конкретного разрешения уже нет роста ни метрик, ни визуального качества.  Интересно, что по результатам визуальных тестов для динамичного HD-контента было решено сохранить максимальный профиль с 8 Мбит/сек для больших экранов ТВ, так как разница на серьезных диагоналях (>50’’) оказалась заметной для участников фокус-группы. Вот здесь мы и вернулись к тому значению BPP, с которого начинался расчет и к которому мы стремились – 0,154 для 1920х1080 и 8 Мбит/сек. Вот, что в итоге у нас получилось для HD-контента динамичной категории: Разрешение Видео битрейт, кбит/сек BPP 1920x1080 8000 0,154 1920x1080 5000 0,096 1280x720 2500 0,109 1024x576 1400 0,095 896x504 900 0,080 768x432 500 0,060 Профилей в пресете транскодера у нас стало на два больше, что привело к увеличению мощности транскодеров на 30%. В результате:  абонент получает максимальное качество изображения при доступной ему полосе пропускания; в пресете у нас появляются дополнительные профили, которые облегчают клиентскому устройству переход между ними, а также становятся менее заметны потери в качестве при переключении на низкие разрешения в условиях нестабильного интернета. Поэтому рост нагрузки на транскодеры полностью окупается удовлетворенностью абонентов. Все наши эксперименты сначала проводились на транскодерах собственной разработки, обкатывались и пропускались через фокус-группы. После выработки финальных пресетов мы применили их в коммерческой среде и получили то, к чему и стремились:  зафиксировали улучшения по нашей статистике профилей: на отдаленных узлах CDN доля высоких профилей выросла на 20%, а количество просмотров на самом низком профиле сократилось с 53% до 3% (по результатам измерений на CDN Дальнего Востока); сократилось количество времени, когда абонент смотрит на разваливающуюся картинку или колесики загрузки на черном экране, за счет увеличения разрешений на существующих битрейтах; уменьшился разрыв по битрейту, что дало плавность при переключении между профилями. Вот так с помощью смеси опыта, математики и объективного анализа мы получили качественный сервис для наших абонентов. Надеемся, что эта статья была вам интересна и полезна. Если у вас есть вопросы или вы хотите рассказать о своем опыте работы с видео – ждем вас в комментариях!