Microsoft Edge и RTC: история боли

    image Облачная телефония VoxImplant может принимать звонки и звонить на разные источники. Сотовые телефоны, SIP, мобильные приложения, веб страницы. Можно позвонить с сотового на веб страницу, выглядит завораживающе. Если с сотовыми все понятно, то возможность поговорить с браузером требует чего-нибудь кроме HTML и JavaScript. Раньше таким «что-нибудь» был Flash. И мы до сих пор умеем его использовать в качестве fallback-варианта. Но последние несколько лет популярные браузеры звонят совсем не через Flash, а через HTML5 технологию «WebRTC». Которая до недавнего времени была представлена в Chrome и Firefox. Но все течет, все меняется, и в бета-версии Microsoft Edge появилась поддержка WebRTC. Почти. Microsoft традиционно пошла своим путем и сделала «альтернативную» реализацию, которая называется «ORTC». Чем они отличаются и что пришлось пережить нашим разработчикам — читайте под катом.


    Что за зверь WebRTC?


    Что такое WebRTC? Это доступное из JavaScript API, которое позволяет делать четыре вещи:

    1. Захватывать видеопоток с камеры и аудиопоток с микрофона.
    2. Проигрывать видео и аудио (через HTML5 video и HTML5 audio).
    3. Устанавливать UDP (или TCP, если все плохо) соединение между двумя браузерами, как через промежуточный сервер, так и напрямую, включая nat traversal.
    4. Стримить по установленному соединению видео, аудио и пользовательские данные.

    По сути, оно заменяет Flash для работы с видео/звуком и позволяет делать hangouts, skype for web и прочие peer-to-peer видео и голосовые конференции. Без флэша и со встроенным в браузер подтверждением «дайте доступ к вашей камере и микрофону».

    Детали, в которых кроется Дьявол


    Самая большая сложность при использовании WebRTC — это установка подключения. API “заточено” под сценарий nat penetration, когда оба пользователя имеют IP адреса вроде “192.168…” и нужно жонглировать UDP пакетами, чтобы обмануть промежуточные NAT сервера и начать передавать данные. Нет никакого метода “connect”, даже если мы хотим установить соединение с сервером, у которого гарантировано публичный IP адрес. Все придется делать вручную.

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

    А еще WebRTC довольно сильно завязано на SDP — древний текстовый протокол, используемый в voip телефонии и совместимый с SIP. И если нужно вмешаться в процесс коммуникации, например установить фиксированный битрейт, то нужно будет этот текст парсить и менять.

    В Edge нет WebRTC!


    Microsoft посчитала API WebRTC слишком сложной для JavaScript разработчиков и реализовала альтернативу, «Object Real-Time Communications». С точки зрения протоколов, ORTC работает примерно так же, как WebRTC. А вот доступный из браузера JavaScript API был написан с нуля в объектно-ориентированном стиле. SDP наружу больше не торчит, текст парсить не нужно, все управляется через объекты и их поля.

    ORTC был добавлен в стандарт WebRTC и его начали реализовывать остальные веб браузеры, уже есть частичная реализация в Firefox. Все это звучит интересно и перспективно, пока мы не узнаем что…

    ORTC еще нигде не реализован


    Edge содержит неполную реализация версии ORTC годичной давности. И в данный момент нет ни одной «полной» реализации ORTC. В отличии от WebRTC, который уже много лет как доступен в Chrome и Firefox.

    Кстати, работающих полифилов (эмуляторов WebRTC API поверх ORTC API в браузере) тоже нет. То есть они есть, но к коммерческой эксплуатации не готовы и дальше демо не работают. И это как раз то, что мы разрабатывали. Потому что сделать полифил намного проще, чем переписывать работающий и отлаженный SDK для поддержки двух принципиально разных API.

    А в Edge ORTC реализован не полностью


    Это было больнее всего. Доступная сейчас в бете реализация ORTC, похоже создавалась для «Skype for Web». Неплохая документация позволяет быстро собрать голосовой или видео звонок с Edge на Edge. Но стоит позвонить на Firefox или собственный сервер, начинают всплывать нюансы.

    В стандарте ORTC есть поддержка «Trickle ICE», которая ускоряет подключение. В Edge даже есть соответствующие методы, но нигде не написано, что их нельзя использовать для такого сценария. Многие вещи реализованы несовместимо с Chrome и Firefox. К примеру, авторизация для ICE или кодеки с одинаковым названием, но с разным payload type.

    Отсутствуют фейлбеки. Если сделать шаг вправо или влево, например создать ресивер без данных и передать его в connect, то мы получим только код ошибки и ничего больше. До недавнего времени к этим кодам даже не было описания, единственной возможностью узнать было спросить у Microsoft. Недавно краткое описание кодов возвратов выложили и жить стало немного легче, но API все так же предполагает «единственно правильный» вариант использования и жестоко карает за любую попытку от него отойти.

    А еще есть кодеки!


    Кодеки для видео и звука это отдельная боль. Традиционно, WebRTC использует H.264 и VP8 для видео, Opus и g.711 для звука. Edge предлагает только минимум кодеков для Skype: H.264UC для видео (доставшийся в наследство от Microsoft Lync), g.711 и, до недавнего времени, собственная реализация Opus для звука. Хорошие новости – совсем недавно добавили «обычный» Opus и обещают добавить поддержку VP9. Плохие новости – VP9 еще не добавили. Так что звук между разными браузерами уже можно передавать, а вот c видео придется немного подождать.

    Свет в конце тоннеля


    На самом деле все не так плохо и наши разработчики довольно быстро сделали SDK для Edge, который мы планируем предложить вам вместе с релизом соответствующей версии браузера. Хорошей новостью является то, что WebRTC (или уже ORTC?) развивается и поддерживается уже почти всеми браузерами, за исключением Safari. Ходят слухи, что Apple нанимает разработчиков для работы над WebRTC, а в WebKit nightly появилась первая реализация. Настало время отказаться от Flash не только для проигрывания видео, но и для звонков.
    Voximplant
    120.46
    Облачная платформа голосовой и видеотелефонии
    Share post

    Comments 12

      0
      Майкрософт снова наступает на грабли.
        +1
        А flash игры переносятся на html5 или что-то в таком роде? И насколько безболезненно изменение кода под новые стандарты?
          0
          Переносятся, тулзы для этого есть. А вот насчет болезненности — это от софта зависит и что он от флеша использовал.
          0
          Кажется, одна большая корпорация решила наступить на свои же собственные грабли из прошлого десятилетия
            0
            > отказаться от Flash не только для проигрывания видео, но и для звонков
            Разве Flash использовался для звонков?
              0
              Было дело
                +1
                Вконтакте его до сих пор использует для звонков
                  +1
                  А есть вообще вещи, которые не пытались сделать на флэше?
                    0
                    браузер? :)
                  +1
                  >, который мы планируем предложить вам вместе с релизом браузера.
                  Aaa?
                  Статья из прошлого?
                    +1
                    Вот как релиз версию с oRTC выпустят, потестируем и зарелизим.
                      +1
                      Я бы даже выразился точнее — когда выйдет в релиз версия с полной поддержкой Opus

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