Мій досвід використання WebRTC в iOS додатку

WebRTC (англ. Real-time communications — комунікації в реальному часі) — проект з відкритим вихідним кодом, призначений для організації передачі потокових даних між браузерами або іншими підтримують його додатками за технологією точка-точка.
Для повного розуміння статті рекомендую ознайомитися з основними принципами роботи технології тут.

image

Як я прийшов до необхідності використання WebRTC
Завдання проекту:

Уявімо, що нам потрібно з'єднати двох випадкових користувачів між собою для передачі real-time потокового відео один одному.
Які є варіанти вирішення проблеми?

Варіант 1:

Організовувати підключення двох користувачів до сервера як до джерела і приймача відео потоку і чекати від нього отримання відео від співрозмовника.

Мінуси:

  • Дороге обладнання сервера
  • Мала розширюваність з-за обмеженості ресурсів сервера
  • Час затримки відео збільшено через посередника
Плюси:

  • Немає проблем з вибором користувача та підключенням до нього — це за нас робить сервер
Варіант 2:

Підключатися до користувача безпосередньо, утворюючи тунель для передачі даних «міжсобойчиком», свідомо отримавши інформацію про це користувача від сервера.

Мінуси:

  • Тривала операція підключення двох користувачів
  • Складність створення peer-to-peer з'єднання
  • Складнощі з протоколом NAT для передачі даних безпосередньо
  • Потрібно декілька серверів для створення з'єднання
Плюси:

  • Розвантаження серверів
  • Сервер може перестати працювати, але відео не перерветься
  • Якість зображення безпосередньо залежить від якості каналу передачі даних у користувачів
  • Можливість використання end-to-end шифрування
  • Управління підключенням лежить в руках користувачів
Також завдання полягало в тому, щоб зробити це максимально бюджетно, без серйозних навантажень на сервер.
Було прийнято рішення використовувати варіант під номером 2.

Після старанних пошуків по інтернету і over9000 багато витраченого часу я натрапив на технологію WebRTC, яка пропонувала вирішити мінуси, які я виявив у процесі аналізу підходів до вирішення проблеми.

Реалізація
Розпочався другий етап пошуку. На ньому я натрапив на багато різних платних бібліотек, які пропонували мені вирішити мою проблему, знайшов дуже багато матеріалів про WebRTC, але реалізації для iOS знайти мені не вдавалося.

Потім я випадково зайшов на git ядра для браузера від Google і помітив там папку під назвою «WebRTC», в якій було кілька файлів і дві папки: «Android» і «iOS». Зайшовши в папку, яка мені була симпатична більше іншого, я виявив масу вихідних файлів бібліотеки і папку «Example», в якій перебував проект під назвою «AppRTC».

image

Я негайно запустив цей проект у себе на пристрої та на другому iOS девайсі, який був під рукою, і мені вдалося з'єднати їх і поспілкуватися з самим собою на двох телефонах.

Найшвидшим способом інтегрування відео-чату моя програма, яка вже мала деякі функції (реєстрація, авторизація), я бачив накладенням «AppRTC» приклад на свій додаток, ніж я і почав займатися.

В цей час в ході проекту настав етап, коли потрібно було реалізовувати серверну частину програми. Вирішили знайти приклад серверів для «AppRTC», а ще вбили багато часу з розробником серверної частини на налагодження сервера і на те, щоб «подружити» сервер з клієнтом.

В кінцевому підсумку все в «сервісі» було розділено на дві частини:

  • Авторизація, реєстрація, фільтр пошуку співрозмовників, налаштування, покупки і так далі;
  • Відео-чат.
Розробка йшла, але після того, як почалася налагодження я зіткнувся з тим, що бібліотека абсолютно нестабільна, відбуваються постійні розриви з'єднання, погане якість відео, використання процесора пристрою на 120%, низька частота оновлення кадрів і багато іншого. Було витрачено багато часу на оптимізацію, але до реального результату це не призвело: були незначні зміни у швидкості роботи, але все одно не торт. Також дуже багато ресурсів вимагав кодек VP8, а підтримки інших на той момент у сервісу не було.

Прийшла думка оновити бібліотеку повністю. Після переробки 80% написаного до оновлення коду він все ще не працював, а приклад не був оновлений до актуальної версії. Серверна частина так само відмовилася працювати з новою версією бібліотеки.

Рішенням виявилося не використовувати свій сервер для WebRTC. Тобто сервер самого додатка лише аналізував підключених до нього користувачів і пропонував їм з'єднатися, після цього додатка починали працювати з сервером самого «AppRTC» і всі взаємодії з передачею пакетів, STUN та TURN серверами проходило там. Так само довелося все переписувати до актуальної версії в додатку своїми силами. Під час цього я помітив, що було додано шифрування даних, які передавалися між користувачами, і інтегрований кодек H264, який значно знизив навантаження на пристрій і дав приріст у кількості кадрів в секунду.

Був проведений повний рефакторинг коду відео-чату і додаток запрацювало ще швидше і стало юзабельнее. В результаті оптимізації коду, бібліотека була винесена в окремий «Pod» сюди.

Висновок
Задача була вирішена, ми отримали додаток, яке поєднує двох випадкових користувачів, які завантажили і запустили, між собою. Практично без матеріальних витрат реалізований відео-чат на нових технологіях, і якість відео безпосередньо залежить від пропускної здатності інтернет каналу у користувачів.

Було розроблено і представлено кілька рішень по оптимізації роботи самої бібліотеки «AppRTC» і вони були відправлені розробникам.
Джерело: Хабрахабр

0 коментарів

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