Облачная телефония VoxImplant может принимать звонки и звонить на разные источники. Сотовые телефоны, SIP, мобильные приложения, веб страницы. Можно позвонить с сотового на веб страницу, выглядит завораживающе. Если с сотовыми все понятно, то возможность поговорить с браузером требует чего-нибудь кроме HTML и JavaScript. Раньше таким «что-нибудь» был Flash. И мы до сих пор умеем его использовать в качестве fallback-варианта. Но последние несколько лет популярные браузеры звонят совсем не через Flash, а через HTML5 технологию «WebRTC». Которая до недавнего времени была представлена в Chrome и Firefox. Но все течет, все меняется, и в бета-версии Microsoft Edge появилась поддержка WebRTC. Почти. Microsoft традиционно пошла своим путем и сделала «альтернативную» реализацию, которая называется «ORTC». Чем они отличаются и что пришлось пережить нашим разработчикам — читайте под катом.
Что такое WebRTC? Это доступное из JavaScript API, которое позволяет делать четыре вещи:
По сути, оно заменяет Flash для работы с видео/звуком и позволяет делать hangouts, skype for web и прочие peer-to-peer видео и голосовые конференции. Без флэша и со встроенным в браузер подтверждением «дайте доступ к вашей камере и микрофону».
Самая большая сложность при использовании WebRTC — это установка подключения. API “заточено” под сценарий nat penetration, когда оба пользователя имеют IP адреса вроде “192.168…” и нужно жонглировать UDP пакетами, чтобы обмануть промежуточные NAT сервера и начать передавать данные. Нет никакого метода “connect”, даже если мы хотим установить соединение с сервером, у которого гарантировано публичный IP адрес. Все придется делать вручную.
Вторым сложным моментом являются кодеки. Захват и сжатие видео, передача его по сети и воспроизведение — взаимосвязанные процессы со множеством нюансов. При звонке между двумя браузерами, особенно разными, необходимо договориться о кодеке, анализировать пропускную способность сети, менять битрейт, разрешение видео. А еще видео и звук могут включаться и выключаться. А еще можно вмешиваться в процесс и принудительно ставить битрейт.
А еще WebRTC довольно сильно завязано на SDP — древний текстовый протокол, используемый в voip телефонии и совместимый с SIP. И если нужно вмешаться в процесс коммуникации, например установить фиксированный битрейт, то нужно будет этот текст парсить и менять.
Microsoft посчитала API WebRTC слишком сложной для JavaScript разработчиков и реализовала альтернативу, «Object Real-Time Communications». С точки зрения протоколов, ORTC работает примерно так же, как WebRTC. А вот доступный из браузера JavaScript API был написан с нуля в объектно-ориентированном стиле. SDP наружу больше не торчит, текст парсить не нужно, все управляется через объекты и их поля.
ORTC был добавлен в стандарт WebRTC и его начали реализовывать остальные веб браузеры, уже есть частичная реализация в Firefox. Все это звучит интересно и перспективно, пока мы не узнаем что…
Edge содержит неполную реализация версии ORTC годичной давности. И в данный момент нет ни одной «полной» реализации ORTC. В отличии от WebRTC, который уже много лет как доступен в Chrome и Firefox.
Кстати, работающих полифилов (эмуляторов WebRTC API поверх ORTC API в браузере) тоже нет. То есть они есть, но к коммерческой эксплуатации не готовы и дальше демо не работают. И это как раз то, что мы разрабатывали. Потому что сделать полифил намного проще, чем переписывать работающий и отлаженный SDK для поддержки двух принципиально разных API.
Это было больнее всего. Доступная сейчас в бете реализация 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 не только для проигрывания видео, но и для звонков.
Что за зверь WebRTC?
Что такое WebRTC? Это доступное из JavaScript API, которое позволяет делать четыре вещи:
- Захватывать видеопоток с камеры и аудиопоток с микрофона.
- Проигрывать видео и аудио (через HTML5 video и HTML5 audio).
- Устанавливать UDP (или TCP, если все плохо) соединение между двумя браузерами, как через промежуточный сервер, так и напрямую, включая nat traversal.
- Стримить по установленному соединению видео, аудио и пользовательские данные.
По сути, оно заменяет 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 не только для проигрывания видео, но и для звонков.