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 Lynx), g.711 и, до недавнего времени, собственная реализация Opus для звука. Хорошие новости — совсем недавно добавили «обычный» Opus и обещают добавить поддержку VP9. Плохие новости — VP9 еще не добавили. Так что звук между разными браузерами уже можно передавать, а вот c видео придется немного подождать.

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


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

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

© Habrahabr.ru