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 не только для проигрывания видео, но и для звонков.
Поделиться с друзьями
-->

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


  1. Noiwex
    12.07.2016 23:39

    Майкрософт снова наступает на грабли.


  1. nouret
    12.07.2016 23:40
    +1

    А flash игры переносятся на html5 или что-то в таком роде? И насколько безболезненно изменение кода под новые стандарты?


    1. eyeofhell
      13.07.2016 18:48

      Переносятся, тулзы для этого есть. А вот насчет болезненности — это от софта зависит и что он от флеша использовал.


  1. inoyakaigor
    12.07.2016 23:40

    Кажется, одна большая корпорация решила наступить на свои же собственные грабли из прошлого десятилетия


  1. BlackMetal
    13.07.2016 00:37

    > отказаться от Flash не только для проигрывания видео, но и для звонков
    Разве Flash использовался для звонков?


    1. aylarov
      13.07.2016 01:39

      Было дело


    1. ozonar
      13.07.2016 07:45
      +1

      Вконтакте его до сих пор использует для звонков


    1. Deosis
      13.07.2016 10:06
      +1

      А есть вообще вещи, которые не пытались сделать на флэше?


      1. Smerig
        13.07.2016 11:32

        браузер? :)


  1. aGosh
    13.07.2016 12:01
    +1

    >, который мы планируем предложить вам вместе с релизом браузера.
    Aaa?
    Статья из прошлого?


    1. eyeofhell
      13.07.2016 18:50
      +1

      Вот как релиз версию с oRTC выпустят, потестируем и зарелизим.


    1. irbisadm
      13.07.2016 20:25
      +1

      Я бы даже выразился точнее — когда выйдет в релиз версия с полной поддержкой Opus