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

Привет, меня зовут Антон Кортунов, я техлид 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
TiyrCC BY-SA 3.0, via Wikimedia Commons
  • Выдержка (или скорость затвора) — время, в течение которого открывается затвор фотоаппарата открывается и пропускает свет к матрице. От выдержки зависит, сколько света уловит камера, а значит, насколько освещённой будет фотография. Именно этот параметр чаще всего используют для контроля экспозиции. Но чем меньше скорость затвора, тем больше шанс получить размытый, нерезкий снимок. Оптимальные значения выдержки для чётких снимков — от 100 до 500.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Laserlicht, CC BY-SA 4.0, via Wikimedia Commons
LaserlichtCC BY-SA 4.0, via Wikimedia Commons

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии (12)


  1. mayorovp
    29.12.2023 08:43
    +1

    Правильно ли я понимаю, что невозможность менять частоту в видео, даже если она хорошо делится (скажем, из 60 получить 30), связана с этим самым motion blur?

    Пытался ли кто-нибудь делать видео удвоенной частоты, но без "затвора", чтобы потом иметь возможность эту частоту менять?


    1. ToSHiC Автор
      29.12.2023 08:43
      +1

      Технически, конечно, никто не может запретить. А вот как будет выглядеть картинка - сильно зависит от контента. Если это, условно, говорящая голова в новостях, или выступление на конференции - то скорее всего проблем не будет. При этом я своими глазами видел трансляции футбольных матче и соревнований по дрифту, где снимали в 50i а конвертили потом в 25p для раздачи в интернет - и там на пестром фоне картинка довольно сильно "стробила".

      В теории можно motion blur потом фильтрами накидывать, но результат обязательно отсматривать надо.


      1. mayorovp
        29.12.2023 08:43

        Не надо там фильтров, чтобы получить стандартные 60 с motion blur достаточно выкинуть из 120 без оного каждый второй кадр.


    1. erlyvideo
      29.12.2023 08:43
      +2

      получить из 60 30 очень легко: выкинуть половину кадров и даже получите что-то вменяемое.

      Сделать 60 из 30 тоже примерно понятно как.

      Проблема в том, чтобы сделать 25 из 29.97


      1. voldemar_d
        29.12.2023 08:43

        Можно примерно так: сначала деинтерлейс в 50p, потом растянуть до 59.94p, затем опять в интерлейс. Растягивать во времени лучше с каким-нибудь межкадровым интерполятором.


  1. NutsUnderline
    29.12.2023 08:43

    это вы еще не стримили со спектрума у которого частота кадров 48.8Гц (а написано что 50) при этом присутствует, так сказать "кадровый интерлейс": в двух соседних кадрах могут быть (совсем) разные картинки, переключаемые каждый кадр


    1. voldemar_d
      29.12.2023 08:43

      Имхо, стримить лучше не прямо со Спектрума, а какого-нибудь современного римейка вроде Spectrum Next или других клонов с выходом VGA/HDMI. Для настоящего Спектрума всё равно какой-нибудь конвертор понадобится.


      1. NutsUnderline
        29.12.2023 08:43

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


        1. voldemar_d
          29.12.2023 08:43

          В ютубе полно демок, сделанных с Пентагоновскими времянками, всякими multicolor и бордер-эффектами - как-то же их записывают? В программном эмуляторе?


  1. voldemar_d
    29.12.2023 08:43
    +1

    Но российская команда вышла в полуфинал

    То есть, она не проиграла в 1/4 финала Хорватии?


    1. ToSHiC Автор
      29.12.2023 08:43

      Справедливое замечание! Вы правы, поправлю в статье.


    1. Squoworode
      29.12.2023 08:43
      +2

      Срочно сообщайте в контору, тут протечка из соседней реальности!