Пока первые early adopters примеряют в свои проекты наши новые видеоконференции (до 100 человек!) мы продолжаем рассказывать об интересном из мира передачи голоса и видео с участием браузера. Про видеоконференции тоже расскажем, но позже — когда накопится критическая масса пользователей и соберется интересная статистика. А сейчас я перевел и адаптировал для нас рассказ Dr. Alex о месте разных протоколов при передаче видео с низкими задержками. Рассказ по сути является ответом на другую статью, и автор вместе с рассказом указывает на ошибки и неточности, которые допустили его коллеги по цеху.

Данные по сети: сигнализация отдельно, видео отдельно


В современных системах, если вы видите видео в браузере, то видеопоток и сигнализация скорее всего будут обрабатываться разными серверами. Если с видео все понятно, то «сервер сигнализации» обеспечивает две штуки: «discovery» и «handshake». Первое, «discovery», это выбор способа передачи данных: IP-адреса, промежуточный сервер (если нужно). «Handshake» – про договориться между участниками передачи видео и звука: кодеки, разрешение, частота кадров, качество. Интересно, что в древнем Flash сигнализация и передача медиа не были разделены как в VoxIP или WebRTC и обеспечивались одним протоколом: RTMP.

Разница между протоколом сигнализации и транспортом сигнализации


Протокол сигнализации определяет язык, с помощью которого браузер и другие участники передачи видео будут договариваться о discovery и handshake. Это может быть SIP для discovery в VoIP или WebRTC, и он же с offer/answer для handshake. Давным-давно во Flash использовался RTMP/AMF. А при желании для WebRTC можно использовать не SIP, а необычный JSEP.

Протокол транспорта сигнализации из того же стека, но ниже: это то, каким образом будут физически передаваться пакеты протокола сигнализации. Традиционно для Flash + SIP использовали TCP или UDP, но сейчас в связке WebRTC + SIP все чаще можно встретить WebSockets. Транспортный протокол WebSockets занимает нишу TCP в браузерах, где нельзя использовать «чистые» TCP- и UDP-сокеты.

Полный стек сигнализации сейчас популярно описывать фразами вроде «SIP поверх веб-сокетов», «JSEP поверх веб-сокетов», устаревающее «SIP поверх TCP/UDP» или древнее «часть RTMP».

Программерский англицизм: медиакодек


Большинство протоколов стриминга видео завязаны на один или несколько кодеков. Полученное с камеры видео обрабатывается покадрово. А проблемы в сети, такие как снижение пропускной способности, потери пакетов или задержки между ними, решаются настройками кодека для каждого кадра. Чтобы вовремя узнавать о проблемах в сети, используются механизмы транспортных протоколов (RTP/RTCP) и механизмы оценки пропускной способности (REMB, Transport-CC, TIMBR). Одна из фундаментальных проблем Flash-видео была в том, что RTMP ни мог ни того, ни другого — поэтому видео просто прекращало играть при падении пропускной способности канала.

Еще один англицизм: протокол стриминга медиа


Определяет, как делить видеопоток на небольшие пакеты, которые пересылаются по сети транспортным протоколом. Обычно протокол стриминга еще обеспечивает механизмы работы с сетевыми проблемами: потери и задержки пакетов. Jitter buffer, retransmission (RTC), redundancy (RED) и Forward Error Correction (FEC).

Транспортный протокол передачи медиа


После того, как полученное с камеры видео разбито на небольшие пакеты, их нужно передать по сети. Используемый для этого транспортный протокол похож на сигнальный, но так как «полезная нагрузка» совершенно другая, одни протоколы подходят лучше других. К примеру, TCP обеспечивает доходимость пакетов, но это не добавляет стеку ценности, потому что похожие механизмы (RTX/RED/FEC) уже есть в стриминговом протоколе. А вот задержки на повторную отправку в TCP это явный недостаток, которого лишен UDP. Но при этом есть практика блокировки UDP как «протокола для торрентов».

Выбор протокола и сетевых портов раньше решался «хардкодингом», но сейчас мы используем такие протоколы как ICE в WebRTC, который позволяет договориться о портах и транспорте в каждом конкретном подключении. В ближайшем будущем возможно использование протокола QUIC (обратно совместимого с UDP), который активно обсуждается IETF и имеет преимущества над TCP и UDP по скорости и надежности. Наконец, можно упомянуть такие протоколы стриминга медиа, как MPEG-DASH и HLS, которые используют HTTP в качестве транспорта и получат преимущества от внедрения HTTP/2.0.

Безопасность передачи медиа данных


Некоторые движки защищают данные при передаче по сети: или сам медиапоток, или пакеты транспортного уровня. Процесс включает в себя ту самую передачу ключей шифрования, для чего используются отдельные протоколы: SDES в VoIP и DTLS в WebRTC. Последний имеет преимущество, так как кроме данных защищает и саму передачу ключей шифрования.

Что меня во всем этом смущает



Некоторые разработчики, например авторы вот этой статьи, помещают чисто транспортные протоколы WebSocket и QUIC на тот же уровень, что и WebRTC, Flash, или HLS. Для меня такая группировка выглядит странно, ведь три последних протокола — это история про стриминг медиа. Кодирование и разбиение на пакеты происходит до использования WebSocket или QUIC. Эталонная реализация WebRTC (libwebrtc/chrome) от Google и ORTC от Microsoft используют QUIC в качестве транспортного протокола.

Не менее удивительно отсутствие упоминания HTTP/2.0 как оптимизации для протоколов, основанных на HTTP, таких как HLS и MPEG-DASH. А упомянутый CMAF — не более чем формат файлов для HLS и MPEG-DASH, но никак не их замена.

Наконец, SRT является всего лишь транспортным протоколом. Он, конечно, добавляет ряд фишек по сравнению с основанными на файлах HLS и MPEG-DASH, но все эти фишки уже есть на другом уровне стека и реализуются в RTMP или WebRTC. Еще SRT разделяет кодирование медиапотока и статистики, что не позволяет кодеку держать эту информацию максимально близко друг от друга. Такое решение может негативно сказаться на возможности адаптировать пересылаемое видео под меняющуюся пропускную способность сети.

Основанные на файлах протоколы, такие как HLS, кодируют несколько потоков и выбирают нужные для адаптирования к ширине канала. WebRTC позволяет адаптировать кодирование каждого кадра в реальном времени: это намного быстрее, чем выбор другого потока в HLS, который требует считать до 10 секунд уже отправленных данных.

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


  1. REPISOT
    24.08.2018 13:47
    +1

    У вас КДПВ весит 2.3 мегабайта. Грузилось полминуты. (На главной, а не при открытии статьи.)


    1. eyeofhell Автор
      24.08.2018 14:16

      Но… это жеж очень крутая иллюстрация как работает realtime media engine. Эти пара метров дого стоят :)


      1. Alexufo
        25.08.2018 13:56
        +1

        Если мне нужно делать задержку кадра, я в редакторе screen2gif просто указываю значение задержки фрейма. А все дубликаты фреймов удаляю. Простым конвертом видео в gif лучше никогда не прибегать. Очень советую данный редактор.


  1. MightyRavendark
    24.08.2018 15:33

    Зачем вы пишете одно и то-же в течение уже двух лет? Вся та информация, которую вы преподносите в новых статьях уже содержится либо в ваших предыдущих статьях, либо в вводных статьях с описаниями технологии WebRTC. Ну то-есть я понимаю зачем вы так делаете — инфоповод, можно под шумок вставлять кричащие заголовки с рекламой — «поддержали новые видеоконференции до 100 человек!». Вроде и правила не нарушили, и себя лишний раз прорекламировали. Но вы ведь захламляете хабр бессмысленными, копирующими друг-друга одинаковыми статьями! Вам еще не надоело?


    1. eyeofhell Автор
      24.08.2018 15:46

      Типовая претензия к переводам :) WebRTC, голос и видео в браузерах — наша область интересов. То, чем мы занимаемся последние десять лет, что любим и в чем разбираемся. Если мы делаем переводы — то от экспертов в индустрии, за которыми следим. Мне было интересно читать работу Dr. Alex, очень хороший рассказ про транспорты, где что используется. Проясняет картину и сортирует по полочкам. Если вашу картину мира статьи захламляют… Ох. Ну, мои соболезнования.


      1. JSmitty
        24.08.2018 17:32

        Расскажите лучше, что у вас со screen sharing? Если есть. И как побороть hall of mirrors?

        PS Про переводы — на webrtchacks материалы поинтереснее, переведите например про игровую площадку для Simulcast без сервера.


        1. eyeofhell Автор
          24.08.2018 18:56

          Ссылку в студию. За webrtchacks я слежу, но за последние полгода не припоминаю никакую игровую площадку для симулкаста. Со screen sharing у нас все хорошо, voximplant.com/docs/references/websdk/voximplant/call#sharescreen — можно показывать локально что шарится, можно не показывать. Hall of mirrors при каком сценарии использования может появиться?


          1. MightyRavendark
            24.08.2018 19:30
            -2

            Ну коненчо у вас с захватом экрана все хорошо, там же делать нечего — в случае с хромом ваш "плагин" захвата экрана должен содержать одну строку кода —


            chrome.desktopCapture.chooseDesktopMedia

            в случае с Firefox еще проще — нужно вызвать обычный getUserMedia с определенными параметрами —


            mediaDevices.getUserMedia({mediaSource : "screen" })

            Но зачем писать об этом? Лучше привести ссылку с рекламой своего продукта — авось кому-то будет сложно написать строку кода и они купят ваш "SDK" который осуществляет обертку над одной строчкой кода (ну хорошо, еще чутка на RTCPeerConnection-ом).


            Кстати, в будущем даже не надо будет писать "if" с детектом бразуера для определения необходимости плагина, а будет унифицированный интерфейс для захвата экранов — https://w3c.github.io/mediacapture-screen-share/. Наверняка, вы даже потом, когда-нибудь, напишете целую статью полную воды, как правильно вызвать одну функцию из спецификации, попутно приведя пару ссылок с рекламой вашего продукта.


            1. aylarov
              24.08.2018 19:57
              +3

              Ну у вас-то статьи очень интересные и познавательные, в количестве целой одной.


            1. Nexvelius
              25.08.2018 07:37

              MightyRavendark, по всей видимости, у вас есть опыт разработки по WebRTC, но в Вашем профиле я не вижу не одной статьи по данной тематике, может быть, Вы поделитесь полезными трюками? Д'артаньянить-то каждый может…

              Общество хабра вам только спасибо скажет.


  1. r3code
    25.08.2018 12:25

    Какое то перечисление технологий и все. Нудно. А выставка рекламы в начале просто как бельмо.