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 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.