Видео — это вам не фото: о чём нужно знать разработчикам видеостриминговых сервисов

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

Привет, меня зовут Антон Кортунов, я техлид Yandex Infrastructure. В 2017 году мы запустили новый для Яндекса проект — платформу потокового видео Яндекс Эфир. Сам проект закрылся, но на основе платформы работают Кинопоиск, видеокарточки товаров в Яндекс Маркете, Реклама и множество других сервисов.

Как разработчик тогда я столкнулся с чудным дивным миром телевидения и кино, и понял, что видео — не просто последовательность кадров на фоне звуковой дорожки. Под катом расскажу о тонкостях, о которых я узнал от видеоинженеров за последние 5 лет.

Видеостриминг: какой опыт уже накоплен в Яндексе 

В 2017 году у Яндекса уже была своя система поиска видео и собственная платформа видеохостинга —, но они не позволяли вещать потоковое видео. После запуска проекта Яндекс Эфир уже в 2018 году Яндекс впервые транслировал в прямом эфире крупное мероприятие — Зимние Олимпийские игры.

Летом того же года на платформе проекта прошла трансляция не менее крупного события — Чемпионата мира по футболу, который проходил в России. По мере того как российская команда проходила в следующие раунды, у нас становилось всё больше зрителей. Поэтому иногда мы даже болели, чтобы наши проиграли, — расширять инфраструктуру с такой скоростью было просто физически невозможно. Мы улучшали ситуацию алгоритмически: пытались использовать ресурсы эффективнее. Но российская команда вышла в полуфинал, а Эфир прошёл проверку: справился с потоками данных более 1 Тб/c и аудиторией более 1 миллиона зрителей одновременно.

Новая эра проекта началась в 2019 году с игр НХЛ. Мы были второй компанией в мире, которая транслировала все игры, в то время как одновременно в эфире шло до 13 соревнований. Тогда мы перешли от стримингового сервиса к миру профессионального телевещания:

  • работали с компаниями, передающими телевизионный сигнал между континентами;

  • создавали конвейер для передачи видео из США в Россию, а затем из наших дата‑центров — в партнёрские профессиональные телестудии и обратно;

  • сотрудничали с телеканалами, которые сделали студию и будки для переводов комментаторам российских команд;

  • доставляли сигнал из студии обратно в наши дата‑центры, а далее — в интернет.

Этот проект изменил правила игры. Как IT‑специалист и разработчик, я понял, что видеостриминг — совершенно иной мир, где очень многое делают совсем не так, как принято в IT. Новый опыт показал, что команде Yandex Infrastructure нужно учиться:

  • правильно создавать видео;

  • правильно транскодировать видео;

  • измерять качество видео и следить за этим.

Все эти наработки мы реализовали в нашей платформе, и теперь все сервисы Яндекса, которые воспроизводят видео на основе Эфира, могут переиспользовать эти решения.

Ниже вкратце расскажу о способах оценить качество видео и пяти факторах, на которые разработчики редко обращают внимание.

Как обычно оценивают качество потокового видео

В мире видеостриминга есть множество метрик для оценки качества видео: PSNR, SSIM, VQM, MSAD и множество других. Некоторые из них оценивают качество сжатия изображений, например, PSNR — пиковое отношение сигнала к шуму. Но видео — не просто последовательность изображений, хоть его и можно механически разделить на отдельные кадры. Если вы попробуете склеить из фотографий видео, результат вас вряд ли обрадует: чётко воссоздать движения не получится, они будут рваными.

Поэтому важно учитывать изменение изображения во времени — при оценке качества для этого применяются более сложные методики. Один из популярных способов выполнить такую комплексную оценку — разработанная Netflix методика VMAF. Она оценивает исходное видео по трём критериям:

  • точность воспроизведения визуальной информации (Visual information fidelity, VIF);

  • потеря детализации (Detail Loss Metriс, DLM);

  • учёт составляющей изменений во времени (Mean Co‑Located Pixel Difference), который измеряет временную разницу между кадрами.

Технически, видеопоток состоит из отдельных кадров, которые меняются с определённой частотой (Frames per second, FPS). Допустим, стандарт телевещания PAL подразумевает FPS в 25 кадров в секунду (на самом деле, всё чуть сложнее, но об этом позже). VMAF помогает дать оценку как отдельным кадрам, так и их соотношению в потоке. Итоговая оценка приводится на один кадр, в баллах от 1 до 100, где 100 — идеальное совпадение с оригинальным видео.

Но подобные методики не дают точного понимания, что мы можем улучшить на этапе производства видео. И первое, что не учитывают большинство подобных метрик — это (внезапно!) качество аудио.

Почему аудиодорожка важнее видеодорожки

Как бы абсурдно это ни звучало, но звук бывает важнее видео. Особенно в том, что касается двух проблем: потерь и задержек кадров.

Для сравнения, допустим, у нас есть видеопоток с определённой частотой кадров в секунду: при разных фреймрейтах в 25, 30 или 60 кадров/сек один видеокадр может длиться от 40 мс до 16,7 мс соответственно. Вместе с этим у нас есть и аудиопоток со своей частотой звуковых кадров: для разных кодеков аудиокадр длится разное время — как правило, около 20–24 миллисекунд. Если потерять всего один видеокадр, вы вряд ли заметите разницу: что‑то похожее постоянно происходит с вами при моргании. Но если потерять звуковой кадр, вы обязательно это заметите — будет слышен характерный щелчок. В целом, не очень сложно следить за тем, нет ли в контенте таких потерянных аудиокадров. А если вдруг они появились, нужно идти и искать проблему.

Есть ещё более серьёзная проблема, связанная с распространением звука. Скорость звука довольно низкая — всего 340 метров в секунду. Это значит, что на расстоянии 30 метров задержка звука составляет примерно 100 миллисекунд. Но мы этого не замечаем, поскольку наш мозг всегда делает поправку на расстояние, если мы видим источник звука.

Кроме того, наш мозг неплохо справляется с чтением по губам, даже если на самом деле вы не умеете этого делать. Например, в шумной комнате часто бывает сложно расслышать, что говорит собеседник. Но стоит только начать смотреть ему в лицо, как мозг начинает видеть губы, а речь становится значительно понятней и отчётливей (на эту тему есть много исследований).

Какие практические выводы можно сделать из этих особенностей восприятия? Если звук отстаёт от видео на 300 миллисекунд (например, при использовании некачественной громкой связи Bluetooth), вы ничего не заметите. Однако если звук идёт на 300 миллисекунд раньше видео, вы, скорее всего, заподозрите неладное. При этом на самом деле вы не заметите, что именно не так с видео. Но оно будет выглядеть для вас очень странным и неправильным. Я подготовил специальный ролик, в котором сначала звук идёт синхронно, затем запаздывает, а затем опережает видео. Для того, чтобы было заметнее — сосредоточьтесь на лице.

Так что звук обязательно должен быть синхронизирован с видео. На телевидении действуют очень жёсткие требования: звук может отставать от видео не более чем на четыре кадра, а видео от звука — не более чем на один кадр.

Без тренировки заметить однокадровую задержку на глаз довольно сложно. Можно схитрить и использовать специально подготовленное видео, например, с Twitch. В таких роликах по временной шкале перемещается специальная рамка, которая помогает определить миллисекунды задержки.

Что важно помнить о выдержке, ISO и других параметрах съёмки

Теперь поговорим о том, что влияет на качество видеокадров. Если вы когда‑нибудь имели дело с зеркальным фотоаппаратом или камерой с похожим принципом действия, то наверняка знаете о таком понятии, как экспозиция — это количество света, которое можно «поймать» в кадр: то, что попадёт на матрицу фотоаппарата через его объектив. Чёткость и шумность изображения сильно зависят от того, как мы управляем количеством пойманного света. Есть четыре способа повлиять на экспозицию:

  • Диафрагма (или апертура) — это часть объектива, с помощью которой можно регулировать его пропускную способность. Диафрагму можно закрывать и открывать. Чем меньше света, тем больше глубина резкости изображаемого пространства (или ГРИП) кадра, поэтому диафрагму обычно используют для того чтобы контролировать резкость, а не экспозицию.

Tiyr, CC BY-SA 3.0, via Wikimedia Commons

  • Выдержка (или скорость затвора) — время, в течение которого открывается затвор фотоаппарата открывается и пропускает свет к матрице. От выдержки зависит, сколько света уловит камера, а значит, насколько освещённой будет фотография. Именно этот параметр чаще всего используют для контроля экспозиции. Но чем меньше скорость затвора, тем больше шанс получить размытый, нерезкий снимок. Оптимальные значения выдержки для чётких снимков — от 100 до 500.

  • ISO (или светочувствительность) — в аналоговой фотографии под этим подразумевалась чувствительность плёнки, а сейчас мы говорим скорее про цифровое усиление светочувствительной матрицы. Как правило, для каждой матрицы есть одно (реже — два) наиболее подходящих значения ISO.

  • ND‑фильтры — светопреломляющие линзы. Их надевают на объектив, чтобы увеличить количество света, которое в него попадёт.

Все эти правила хорошо работают для фотосъёмки. Но видеокамера фиксирует непрерывное движение, даже если всё равно делит его на отдельные кадры. Как она это делает?

На помощь приходит motion blur — контролируемое размытие движения. Чисто теоретически, его можно было бы добиться с помощью выдержки. Если увеличить выдержку и держать затвор открытым почти всю продолжительность кадра, получится снять движения очень плавно, хотя и размыто. Короткая выдержка наоборот может вызвать «заикание» движения, как при стробоскопическом освещении.

Самый приятный режим — закрыть затвор на половину продолжительности кадра. Это позволит добиться одновременно довольно чёткого изображения и плавности движений.

258b0359bc5494a547da10fd4230f0af.png

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

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

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

Вот два кадра из двух видеоклипов, снятых со скоростью 30 кадров в секунду. Первый клип — с выдержкой 1/2000 (очень быстрая выдержка для видео), а второй — с выдержкой 1/60 — идеальное значение для 30 кадров в секунду.

2dec509cb6b0f60e7507e2124049a8a2.png

Если бы мы выбирали по фото — то левый кадр, конечно, выглядит лучше. Но на самом деле, на видео правый вариант вариант выглядит намного приятнее и плавнее.

Теперь посмотрим, как это выглядит в движении. Видеоклип состоит из 3 частей:

  • первая часть — с максимальной выдержкой, то есть с самой низкой разрешённой выдержкой: 1/25 для 25 кадров в секунду, то есть 360 градусов,

  • вторая — с нормальным значением выдержки 1/50 или 180 градусов и

  • третья — с самой короткой выдержкой, которую мы смогли выставить на камере.

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

В этом месте, возможно, захочется задать мне вопрос: зачем вообще обсуждать выдержку, если она зашита в видео, и мы его (видео) просто транскодируем, не трогая картинку? Это не вполне правда: вы можете влиять на неё, меняя количество кадров. Например, использовать чересстрочную развёртку!

Что такое чересстрочная развёртка и как её приручить

Это очень старая технология, почти столетней давности. В её основу легло красивое техническое решение. Если вы помните старые большие ЭЛТ‑телевизоры, то, возможно, представляете, как каждый пиксель их экранов подсвечивался пучком электронов, чтобы заставить люминофор в них светиться.

Laserlicht, CC BY-SA 4.0, via Wikimedia Commons

Чтобы погаснуть, пикселю требуется некоторое время, близкое к длительности кадра. Если он будет гаснуть слишком быстро, экран начнёт мигать, слишком долго — вы увидите «призраков» движущихся объектов.

Плюсы видео с чересстрочной разверткой:

+ увеличенное временное разрешение;

+ повышенное пространственное разрешение;

+ такие видео отлично отображаются на старых электронно‑лучевых телевизорах.

Почему мы всё ещё говорим об этой технологии спустя много лет?  Из‑за наследия съёмочного оборудования в современном видеопроизводстве. До сих пор существует огромное количество устройств с обратной совместимостью. К примеру, в съёмках игр НХЛ, которые мы транслировали, использовался формат 1080i60, где i подразумевает interlaced — чересстрочную развёртку.

Теперь вернёмся к предыдущему разделу и соотнесём всё это с понятием выдержки. При съёмке видео в формате 1080i60 информация снимается с сенсора 60 раз в секунду, то есть технически так мы получаем 60 FPS. В чём хитрость при работе с этой технологией: по факту инженеры увеличивают частоту кадров в два раза (такие кадры называются fields — «поля»). Например, если нужна частота 30 кадров в секунду, снимается 60 полей в секунду. Каждый из полей делится построчно на два полукадра и чередуется: по очереди на экран выходят то чётные, то нечётные строки. Для чётных полей показывались только чётные строки, для нечётных полей, соответственно, нечётные.

17e934f91a5753cc845a79e77a9eabc4.png

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

А ещё устройства или сервисы в Интернете не поддерживают чересстрочное видео: все поля будут отображаться, как будто это полноценные кадры. Посмотрите этот пример (чуть лучше видно на самом vimeo в хорошем разрешении).

Что с этим делать: необходимы фильтры, которые преобразуют картинку 60i в 60p (progressive). При этом очень важно следить за порядком полей, иначе все движения станут рваными.

Преобразование частоты кадров: по возможности избегайте этого

Как вы уже могли заметить, в примерах к этой статье встречаются как 50 FPS или 50i, так и 60 FPS или 60i. Это тоже легаси: на старых телевизорах частота кадров при трансляции зависела от частоты тока в розетке. Именно поэтому исторически сложилось так, что в Северной Америке появился стандарт NTSC c 30/60 FPS, а в остальном мире распространены PAL и SECAM c 50 FPS.

128ba357c9973c74f394ea66dcde921f.png

В этом контексте важно не забывать, что при каждой попытке преобразовать частоту кадров мы получаем артефакты:

  • гостинг (ghosting) — «тени» за объектом, если мы просто будем считать некий средний кадр из двух соседних;

  • неравномерность движения, если мы будем просто выкидывать «лишние» кадры;

  • при использовании разных прогрессивных фильтров — часто случается размытие быстро движущихся объектов.

Чтобы понять, почему так происходит, посмотрим, как кадры сменяют друг друга на временной оси при разной частоте:

8f9d4710f57b15999a294a2d5c010605.png

На каждые 5 кадров в одном формате имеем 6 кадров в другом. На рисунке выше видно, что в каждой такой пачке из 5–6 кадров на разных частотах по временной оси у нас совпадает только один. Просто выкинуть несовпадающие кадры нельзя, движение станет рваным. А для воссоздания плавности при преобразовании понадобится интерполяция, с которой современные инструменты справляются не очень хорошо — чаще всего дело заканчивается размытием.  

Даже видео, сконвертированное с помощью профессионального вещательного оборудования, например, Terаnex от Blackmagic Design, будет иметь дефекты. Мой совет: если вы можете не преобразовывать частоту кадров, не связывайтесь с этим. Есть нейронные сети, которые выполняют интерполяцию кадров, но они могут породить новые нейронные артефакты.  

Чеклист: как сохранить качество видео

  1. Снимайте все видео в одной и той же системе координат. Используйте одинаковые FPS, разрешение и частоту дискретизации звука для всех источников. Например, чтобы транслировать видео в прямом эфире на YouTube, необходимо снимать со скоростью 30 кадров в секунду, поскольку это единственный вариант, который поддерживает YouTube Live.

    То же верно для изменения размера, перекодирования и т. д. Каждый раз, когда вы выполняете любое преобразование, вы понижаете качество, и нет никакого способа сохранить его во время этих операций.

  2. Соблюдайте временные метки из источника, если они верны. Это поможет вам избежать проблем с синхронизацией аудио.

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

Спасибо, что дочитали до конца. Буду рад, если поделитесь своими наблюдениями при работе с видео, — приходите обсудить в комментариях.

© Habrahabr.ru