WebRTC (англ.Теги: #iOS #webrtc #сборка велосипедов #Разработка для iOSReal-time communication) — проект с открытым исходным кодом, предназначенный для организации потоковой передачи данных между браузерами или другими поддерживающими его приложениями с использованием технологии «точка-точка».
Для полного понимания статьи рекомендую ознакомиться с основными принципами технологии.
здесь .
Как я пришел к необходимости использовать WebRTC
Цель проекта: Давайте представим, что нам нужно соединить двух случайных пользователей для передачи друг другу потокового видео в реальном времени.Какие варианты решения проблемы? Опция 1: Организовать подключение двух пользователей к серверу как источнику и приёмнику видеопотока и дождаться приёма видео от собеседника.
Минусы:
Плюсы:
- Дорогое серверное оборудование.
- Низкая расширяемость из-за ограниченных ресурсов сервера.
- Задержка видео увеличена из-за посредника
Вариант 2: Подключаемся к пользователю напрямую, образуя туннель для передачи данных «между бандами», заведомо получая информацию об этом пользователе с сервера.
- Проблем с выбором пользователя и подключением к нему нет — за нас это делает сервер
Минусы:
Плюсы:
- Длительная работа соединения для двух пользователей
- Сложности с созданием одноранговых соединений.
- Трудности с протоколом NAT для прямой передачи данных
- Требуется несколько серверов для создания соединения
Также стояла задача сделать это максимально экономично, без сильных нагрузок на сервер.
- Разгрузка сервера
- Сервер может перестать работать, но видео не будет прерываться
- Качество изображения напрямую зависит от качества канала передачи данных пользователей.
- Возможность использования сквозного шифрования.
- Контроль подключения находится в руках пользователей
Было решено использовать вариант №2. После усердных поисков в Интернете и более 9000 потерянного времени я наткнулся на технологию WebRTC, которая предлагала решить те недостатки, которые я выявил в процессе анализа подходов к решению проблемы.
Выполнение
Начался второй этап поиска.На нем я наткнулся на множество разных платных библиотек, которые предлагали мне решить мою проблему, нашел много материалов про WebRTC, но реализации под iOS мне найти не удалось.
Затем случайно я зашел в git ядра браузера Google и заметил папку под названием «WebRTC», в которой было несколько файлов и две папки: «Android» и «iOS».
Зайдя в папку, которая мне понравилась больше остальных, я нашел множество файлов исходной библиотеки и папку «Example», в которой находился проект под названием «AppRTC».
Я сразу запустил этот проект на своем устройстве и на втором iOS-устройстве, которое оказалось под рукой, и смог соединить их и общаться сам с собой на двух телефонах.Самый быстрый способ интеграции видеочата в мое приложение, в котором уже были некоторые функции (регистрация, авторизация), я увидел, наложив на свое приложение пример «AppRTC», чем и начал заниматься.
В это время проект достиг той стадии, когда необходимо было реализовать серверную часть приложения.
Мы решили найти пример серверов для «AppRTC», а также потратили много времени с серверным разработчиком на отладку сервера и подружку между сервером и клиентом.
В конечном итоге всё в «сервисе» разделилось на две части:
Разработка шла, но после начала отладки я столкнулся с тем, что библиотека работала совершенно нестабильно, были постоянные обрывы соединения, плохое качество видео, 120% загрузка процессора устройства, низкая частота обновления кадров и многое другое.
- Авторизация, регистрация, фильтр поиска собеседников, настройки, покупки и так далее;
- Видео-конференция.
На оптимизацию было потрачено много времени, но к каким-то реальным результатам это не привело: были небольшие изменения в скорости работы, но всё равно не торт. Кодек VP8 также требовал много ресурсов, а поддержки других у сервиса на тот момент не было.
Пришла идея обновить библиотеку полностью.
После переделки 80% кода, написанного до обновления, он всё равно не работал, а пример не обновился до последней версии.
Серверная часть также отказалась работать с новой версией библиотеки.
Решением оказалось не использовать собственный сервер для WebRTC. То есть сервер самого приложения только анализировал подключенных к нему пользователей и предлагал им подключиться, после чего приложения начинали работать с сервером самого «AppRTC» и всеми взаимодействиями с передачей пакетов, STUN и TURN. сервера находились там.
Также мне пришлось самостоятельно все переписать в приложении на актуальную версию.
При этом я заметил, что было добавлено шифрование данных, которые передавались между пользователями, и был интегрирован кодек H264, что существенно снизило нагрузку на устройство и дало прирост количества кадров в секунду.
Код видеочата был полностью переработан, приложение стало работать еще быстрее и стало удобнее.
В результате оптимизации кода библиотека вынесена в отдельный «Под».
здесь .
Заключение
Проблема была решена, мы получили приложение, связывающее двух случайных пользователей, скачавших и запустивших его, друг с другом.Видеочат реализован с использованием новых технологий практически без материальных затрат, а качество видео напрямую зависит от пропускной способности интернет-канала пользователей.
Было разработано и представлено несколько решений по оптимизации работы самой библиотеки «AppRTC» и отправлено разработчикам.
-
Планировщик
19 Oct, 24 -
Как Живет Мобильный Остров?
19 Oct, 24