Как Chrome и Firefox договариваются о передаче двух видеопотоков


    Среди подводных камней WebRTC один особенный. Это то, как браузеры договариваются между собой о передаче медиа-потоков. Кодеки, битрейты, разрешение видео, – вся вот эта история. Кода медиа-поток один — все хорошо. Но когда их два (а видео со звуком, это, на секундочку, два медиа-потока: один для видео, другой для звука), то мнения браузеров о формате описания ситуации резко разделяются. Сделать видеозвонок из Chrome в Firefox можно довольно легко. А вот видеозвонок со звуком — уже нет. Под катом небольшая история, почему так повелось, что запилили в новой Safari и какой особый путь у Microsoft Edge.

    Комбайн на поле голосовых и видеозвонков


    WebRTC — это комбайн. Множество протоколов и разных JavaScript API под одним названием, который делает разные штуки:

    • Захват видео с камеры и/или голоса с микрофона.
    • Кодирование и декодирование разными кодеками, которые поддерживает браузер.
    • Установка Peer-to-Peer подключения между браузерами с использованием подхода ICE и указанных серверов. STUN серверов для изучения топологии сети и TURN серверов, если не удалось пробить NAT и нужно подключаться через внешний сервер.
    • Передача видео и аудио по сети. Кроме того, анализ ширины канала и подстройка под него битрейта кодека.
    • Воспроизведение полученного.
    • Передача данных в UDP или TCP стиле.
    • Screen Sharing.

    Самое сложное в этой истории – установить Peer-to-Peer подключение. Если это не локальное общение между вкладками, устройства не в одной сети или у них нет реальных IP-адресов с открытыми портами, то нужны какие-то промежуточные серверы, чтобы «договориться». Обычно эти сервера поднимает разработчик, который хочет воспользоваться WebRTC. За исключением STUN эхо серверов, которые отвечают на вопрос «какой у меня публичный IP» и есть публичные от Google.

    В зависимости от того, что разработчик собирается передавать: голос, видео или произвольные данные, – установливается Peer-to-Peer подключение. WebRTC формирует текстовые пакеты «offer», «answer» и «ice candidate», которые разработчик должен как-то передавать между подключающимися друг к другу браузерами (обычно через собственный signaling сервер). В этих пакетах оба браузера описывают свои возможности и что будет происходить, а WebRTC пытается выбрать оптимальный способ подключения.

    SDP-наследие телефонии


    Пакеты, которыми WebRTC обменивается руками разработчика, используют формат SDP. Он очень старый, текстовый, пришел из телефонии (WebRTC старается минимизировать усилия разработчика при звонке из браузера в телефонные сети и обратно) и похож на HTTP. Вот так выглядит SDP-пакет «этот браузер хочет установить Peer-to-Peer подключение к другому браузеру, но пока не знает, что будет передавать по сети».

    Если разработчик хочет начать/закончить передавать данные, голос или видео, то WebRTC сразу требует от него «renegotiation» – перезапуск Peer-to-Peer подключения, чтобы проверить оптимальность сетевого маршрута для передаваемых данных и передоговориться о кодеках. Вот так выглядит SDP-пакет, в котором WebRTC сообщает о желании передавать видео:

    Скрытый текст

    Быстро меняющийся стандарт


    WebRTC с нами уже много лет и до сих пор в статусе «бета-версия». За последнее время JavaScript API было полностью переписано с коллбеков на промисы, поменялась работы с голосовыми и видео потоками, Microsoft скрафтила альтернативный API «oRTC». Много всего интересного произошло. А еще поменялся формат описания медиа потоков в SDP-пакете. Много лет использовавшийся «Plan B» с иерархической структурой был deprecated и заменен на «Unified Plan», в котором каждый поток задавался отдельной секцией в SDP пакете. Сравните.

    Было:

    Скрытый текст

    Стало:

    Скрытый текст


    Chrome vs Firefox vs Edge vs Safari


    Когда дело касается бета-версий веб-технологий, то их реализация в браузерах иногда сильно различается и может на годы отставать от текущей версии стандарта. Так случилось и с WebRTC. Много лет назад в Google Chrome сделали поддержку несколько медиа-треков в формате «Plan B» и до сих пор не поменяли реализацию на «Unified Plan». Соответствующий тикет открыт пару лет назад, разработчики обсуждают, насколько это важно и переназначают тикет друг другу, но воз и ныне там. В Firefox, что характерно, реализован только Unified Plan, поэтому без проблем можно коммуницировать только один медиа трек: голос или видео без звука. Нужно больше? Добро пожаловать в мир адаптеров и полифилов!

    Microsoft Edge, изначально поддерживающий только свою собственную реализацию API «oRTC», в последних версиях добавил поддержку WebRTC API и Unified Plan. В Safari поддержка WebRTC будет только в следующей версии, бета которой уже доступна для разработчиков. И, что печально, Plan B. Потому что делалось на основе Chromium.

    Как делать кроссбраузерные звонки?


    Как мы видим, Chrome, самый популярный браузер, остался с устаревшим форматом «Plan B». Там же Safari, мобильная версия которого живет в iPhone. Firefox и новый Microsoft Edge с новым «Unified Plan».

    Для передачи голоса или видео без аудио это не играет никакой роли, а вот в случае нескольких медиа-треков придется вручную модифицировать SDP или воспользоваться адаптером. Очень надеюсь, что рано или поздно все браузеры перейдут на Unified Plan. Но пока суровая реальность такова, что большинство Desktop и подавляющее большинство Mobile браузеров поддерживают «Plan B», а для совместимости с Firefox и Edge придется добавлять код. И много отлаживаться.

    Картинка до ката взята отсюда.
    Voximplant
    159.25
    Облачная платформа голосовой и видеотелефонии
    Support the author
    Share post

    Comments 15

      0
      Стандарты прекрасны тем, что их очень много, и всегда есть из чего выбрать.

      Отсюда
        +1
        Говорить, что Plan B старый, а Unified Plan новый — не совсем корректно.
          0
          Why? Plan B помечен как deprecated жеж. И уже давно. Или нет?
            0
            Deprecated значит что решили, что будут делать по-другому, с точки зрения возраста они с Unified Plan одинаковые
          0
          Мёртворождённая технология, кое-как шевелящаяся с помощью электроразрядов, уколов и костылей :)

          А тикет пинают вот почему. Фунадментальный вопрос:
          «А нахрена вообще браузеру звонить? „
            +2

            Дык браузер в современном веке всё более универсален, как Emacs в предыдущем. Нынче уже ноутбуки продают, где кроме браузера ничего нет.

              +3
              А нахрена браузеру проигрывать видео, а нахрена браузеру играть игры, список можно продолжить. Эта по вашему мнению «мертворожденная технология» используется в самых популярных соц. сетях и сервисах, которыми пользуются миллиарды людей ежедневно.
                +1
                В целом, действительно — нахрена? Зачем превращать браузеры в ОС с корявейшим системным языком и дополнительным миллионом конфликтующих стандартов?
                  0
                  Действительно да. сектанты web rtc носятся с ним уже восемь лет, и все никак не найдут ему применения. А до того как начали носиться с web rtc носились пару лет с flash который тоже умел голос, смешные люди, смотрю на это все с недоумением.
                    +1
                    Flash не был частью веб-стандартов. А WebRTC уже применяется. Недавно, например, проходил интервью онлайн — мне прислали ссылку на meet.google.com, и там прям в браузере славненько поговорили. Для таких случаев это гораздо удобнее, чем необходимость устанавливать какой-то дополнительный софт для таких временных нужд. Браузер то у всех есть, и по ссылке перейти не сложно.
                      0
                      ну откройте ссылку свою в сафари, а я посмеюсь как вы без дополнительного софта это сделаете.
                        0
                        Предложили бы ещё в IE открыть =)
                          0
                          я пользуюсь сафари… Я не имею права это делать?
                            +1
                            Да хоть IE6, мне то какая разница? =)
              +1
              В Chrome 72 уже по умолчанию используется Unified Plan. Поддержку Plan B планируют удалить не раньше 2020 — будут смотреть на статистику его использования.

              Only users with full accounts can post comments. Log in, please.